diff --git a/src/client/app/admin/views/abuse.vue b/src/client/app/admin/views/abuse.vue
index 141e0376cd..afa285debc 100644
--- a/src/client/app/admin/views/abuse.vue
+++ b/src/client/app/admin/views/abuse.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<ui-card>
-		<template v-slot:title><fa :icon="faExclamationCircle"/> {{ $t('title') }}</template>
+		<template #title><fa :icon="faExclamationCircle"/> {{ $t('title') }}</template>
 		<section class="fit-top">
 			<sequential-entrance animation="entranceFromTop" delay="25">
 				<div v-for="report in userReports" :key="report.id" class="haexwsjc">
diff --git a/src/client/app/admin/views/announcements.vue b/src/client/app/admin/views/announcements.vue
index 4f2f853060..64ac2615c8 100644
--- a/src/client/app/admin/views/announcements.vue
+++ b/src/client/app/admin/views/announcements.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<ui-card>
-		<template v-slot:title><fa icon="broadcast-tower"/> {{ $t('announcements') }}</template>
+		<template #title><fa icon="broadcast-tower"/> {{ $t('announcements') }}</template>
 		<section v-for="(announcement, i) in announcements" class="fit-top">
 			<ui-input v-model="announcement.title" @change="save">
 				<span>{{ $t('title') }}</span>
diff --git a/src/client/app/admin/views/drive.vue b/src/client/app/admin/views/drive.vue
index fe265637d4..7812aadaaf 100644
--- a/src/client/app/admin/views/drive.vue
+++ b/src/client/app/admin/views/drive.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<ui-card>
-		<template v-slot:title><fa :icon="faTerminal"/> {{ $t('operation') }}</template>
+		<template #title><fa :icon="faTerminal"/> {{ $t('operation') }}</template>
 		<section class="fit-top">
 			<ui-input v-model="target" type="text">
 				<span>{{ $t('fileid-or-url') }}</span>
@@ -17,18 +17,18 @@
 	</ui-card>
 
 	<ui-card>
-		<template v-slot:title><fa :icon="faCloud"/> {{ $t('@.drive') }}</template>
+		<template #title><fa :icon="faCloud"/> {{ $t('@.drive') }}</template>
 		<section class="fit-top">
 			<ui-horizon-group inputs>
 				<ui-select v-model="sort">
-					<template v-slot:label>{{ $t('sort.title') }}</template>
+					<template #label>{{ $t('sort.title') }}</template>
 					<option value="-createdAt">{{ $t('sort.createdAtAsc') }}</option>
 					<option value="+createdAt">{{ $t('sort.createdAtDesc') }}</option>
 					<option value="-size">{{ $t('sort.sizeAsc') }}</option>
 					<option value="+size">{{ $t('sort.sizeDesc') }}</option>
 				</ui-select>
 				<ui-select v-model="origin">
-					<template v-slot:label>{{ $t('origin.title') }}</template>
+					<template #label>{{ $t('origin.title') }}</template>
 					<option value="combined">{{ $t('origin.combined') }}</option>
 					<option value="local">{{ $t('origin.local') }}</option>
 					<option value="remote">{{ $t('origin.remote') }}</option>
diff --git a/src/client/app/admin/views/emoji.vue b/src/client/app/admin/views/emoji.vue
index ae272b4df3..9f2f3a0c88 100644
--- a/src/client/app/admin/views/emoji.vue
+++ b/src/client/app/admin/views/emoji.vue
@@ -1,20 +1,20 @@
 <template>
 <div>
 	<ui-card>
-		<template v-slot:title><fa icon="plus"/> {{ $t('add-emoji.title') }}</template>
+		<template #title><fa icon="plus"/> {{ $t('add-emoji.title') }}</template>
 		<section class="fit-top">
 			<ui-horizon-group inputs>
 				<ui-input v-model="name">
 					<span>{{ $t('add-emoji.name') }}</span>
-					<template v-slot:desc>{{ $t('add-emoji.name-desc') }}</template>
+					<template #desc>{{ $t('add-emoji.name-desc') }}</template>
 				</ui-input>
 				<ui-input v-model="aliases">
 					<span>{{ $t('add-emoji.aliases') }}</span>
-					<template v-slot:desc>{{ $t('add-emoji.aliases-desc') }}</template>
+					<template #desc>{{ $t('add-emoji.aliases-desc') }}</template>
 				</ui-input>
 			</ui-horizon-group>
 			<ui-input v-model="url">
-				<template v-slot:icon><fa icon="link"/></template>
+				<template #icon><fa icon="link"/></template>
 				<span>{{ $t('add-emoji.url') }}</span>
 			</ui-input>
 			<ui-info>{{ $t('add-emoji.info') }}</ui-info>
@@ -23,7 +23,7 @@
 	</ui-card>
 
 	<ui-card>
-		<template v-slot:title><fa :icon="faGrin"/> {{ $t('emojis.title') }}</template>
+		<template #title><fa :icon="faGrin"/> {{ $t('emojis.title') }}</template>
 		<section v-for="emoji in emojis" class="oryfrbft">
 			<div>
 				<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
@@ -38,7 +38,7 @@
 					</ui-input>
 				</ui-horizon-group>
 				<ui-input v-model="emoji.url">
-					<template v-slot:icon><fa icon="link"/></template>
+					<template #icon><fa icon="link"/></template>
 					<span>{{ $t('add-emoji.url') }}</span>
 				</ui-input>
 				<ui-horizon-group class="fit-bottom">
diff --git a/src/client/app/admin/views/federation.vue b/src/client/app/admin/views/federation.vue
index c5f3d4e0e7..69d046cfce 100644
--- a/src/client/app/admin/views/federation.vue
+++ b/src/client/app/admin/views/federation.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<ui-card>
-		<template v-slot:title><fa :icon="faTerminal"/> {{ $t('federation') }}</template>
+		<template #title><fa :icon="faTerminal"/> {{ $t('federation') }}</template>
 		<section class="fit-top">
 			<ui-input class="target" v-model="target" type="text" @enter="showInstance()">
 				<span>{{ $t('host') }}</span>
@@ -74,11 +74,11 @@
 	</ui-card>
 
 	<ui-card>
-		<template v-slot:title><fa :icon="faServer"/> {{ $t('instances') }}</template>
+		<template #title><fa :icon="faServer"/> {{ $t('instances') }}</template>
 		<section class="fit-top">
 			<ui-horizon-group inputs>
 				<ui-select v-model="sort">
-					<template v-slot:label>{{ $t('sort') }}</template>
+					<template #label>{{ $t('sort') }}</template>
 					<option value="-caughtAt">{{ $t('sorts.caughtAtAsc') }}</option>
 					<option value="+caughtAt">{{ $t('sorts.caughtAtDesc') }}</option>
 					<option value="-lastCommunicatedAt">{{ $t('sorts.lastCommunicatedAtAsc') }}</option>
@@ -97,7 +97,7 @@
 					<option value="+driveFiles">{{ $t('sorts.driveFilesDesc') }}</option>
 				</ui-select>
 				<ui-select v-model="state">
-					<template v-slot:label>{{ $t('state') }}</template>
+					<template #label>{{ $t('state') }}</template>
 					<option value="all">{{ $t('states.all') }}</option>
 					<option value="blocked">{{ $t('states.blocked') }}</option>
 					<option value="notResponding">{{ $t('states.not-responding') }}</option>
diff --git a/src/client/app/admin/views/hashtags.vue b/src/client/app/admin/views/hashtags.vue
index 67b1ccde7b..b3190c29c4 100644
--- a/src/client/app/admin/views/hashtags.vue
+++ b/src/client/app/admin/views/hashtags.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<ui-card>
-		<template v-slot:title>{{ $t('hided-tags') }}</template>
+		<template #title>{{ $t('hided-tags') }}</template>
 		<section>
 			<textarea class="jdnqwkzlnxcfftthoybjxrebyolvoucw" v-model="hidedTags"></textarea>
 			<ui-button @click="save">{{ $t('save') }}</ui-button>
diff --git a/src/client/app/admin/views/instance.vue b/src/client/app/admin/views/instance.vue
index 014b1743ad..36d885b065 100644
--- a/src/client/app/admin/views/instance.vue
+++ b/src/client/app/admin/views/instance.vue
@@ -1,20 +1,20 @@
 <template>
 <div>
 	<ui-card>
-		<template v-slot:title><fa icon="cog"/> {{ $t('instance') }}</template>
+		<template #title><fa icon="cog"/> {{ $t('instance') }}</template>
 		<section class="fit-top fit-bottom">
 			<ui-input :value="host" readonly>{{ $t('host') }}</ui-input>
 			<ui-input v-model="name">{{ $t('instance-name') }}</ui-input>
 			<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea>
-			<ui-input v-model="mascotImageUrl"><template v-slot:icon><fa icon="link"/></template>{{ $t('logo-url') }}</ui-input>
-			<ui-input v-model="bannerUrl"><template v-slot:icon><fa icon="link"/></template>{{ $t('banner-url') }}</ui-input>
-			<ui-input v-model="errorImageUrl"><template v-slot:icon><fa icon="link"/></template>{{ $t('error-image-url') }}</ui-input>
-			<ui-input v-model="languages"><template v-slot:icon><fa icon="language"/></template>{{ $t('languages') }}<template v-slot:desc>{{ $t('languages-desc') }}</template></ui-input>
+			<ui-input v-model="mascotImageUrl"><template #icon><fa icon="link"/></template>{{ $t('logo-url') }}</ui-input>
+			<ui-input v-model="bannerUrl"><template #icon><fa icon="link"/></template>{{ $t('banner-url') }}</ui-input>
+			<ui-input v-model="errorImageUrl"><template #icon><fa icon="link"/></template>{{ $t('error-image-url') }}</ui-input>
+			<ui-input v-model="languages"><template #icon><fa icon="language"/></template>{{ $t('languages') }}<template #desc>{{ $t('languages-desc') }}</template></ui-input>
 		</section>
 		<section class="fit-bottom">
 			<header><fa :icon="faHeadset"/> {{ $t('maintainer-config') }}</header>
 			<ui-input v-model="maintainerName">{{ $t('maintainer-name') }}</ui-input>
-			<ui-input v-model="maintainerEmail" type="email"><template v-slot:icon><fa :icon="farEnvelope"/></template>{{ $t('maintainer-email') }}</ui-input>
+			<ui-input v-model="maintainerEmail" type="email"><template #icon><fa :icon="farEnvelope"/></template>{{ $t('maintainer-email') }}</ui-input>
 		</section>
 		<section class="fit-top fit-bottom">
 			<ui-input v-model="maxNoteTextLength">{{ $t('max-note-text-length') }}</ui-input>
@@ -27,28 +27,28 @@
 		</section>
 		<section class="fit-bottom">
 			<header><fa icon="cloud"/> {{ $t('drive-config') }}</header>
-			<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<template v-slot:desc>{{ $t('cache-remote-files-desc') }}</template></ui-switch>
-			<ui-input v-model="localDriveCapacityMb" type="number">{{ $t('local-drive-capacity-mb') }}<template v-slot:suffix>MB</template><template v-slot:desc>{{ $t('mb') }}</template></ui-input>
-			<ui-input v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles">{{ $t('remote-drive-capacity-mb') }}<template v-slot:suffix>MB</template><template v-slot:desc>{{ $t('mb') }}</template></ui-input>
+			<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<template #desc>{{ $t('cache-remote-files-desc') }}</template></ui-switch>
+			<ui-input v-model="localDriveCapacityMb" type="number">{{ $t('local-drive-capacity-mb') }}<template #suffix>MB</template><template #desc>{{ $t('mb') }}</template></ui-input>
+			<ui-input v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles">{{ $t('remote-drive-capacity-mb') }}<template #suffix>MB</template><template #desc>{{ $t('mb') }}</template></ui-input>
 		</section>
 		<section class="fit-bottom">
 			<header><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</header>
 			<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
 			<ui-info>{{ $t('recaptcha-info') }}</ui-info>
 			<ui-horizon-group inputs>
-				<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><template v-slot:icon><fa icon="key"/></template>{{ $t('recaptcha-site-key') }}</ui-input>
-				<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><template v-slot:icon><fa icon="key"/></template>{{ $t('recaptcha-secret-key') }}</ui-input>
+				<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-site-key') }}</ui-input>
+				<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-secret-key') }}</ui-input>
 			</ui-horizon-group>
 		</section>
 		<section>
 			<header><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</header>
 			<ui-info>{{ $t('proxy-account-info') }}</ui-info>
-			<ui-input v-model="proxyAccount"><template v-slot:prefix>@</template>{{ $t('proxy-account-username') }}<template v-slot:desc>{{ $t('proxy-account-username-desc') }}</template></ui-input>
+			<ui-input v-model="proxyAccount"><template #prefix>@</template>{{ $t('proxy-account-username') }}<template #desc>{{ $t('proxy-account-username-desc') }}</template></ui-input>
 			<ui-info warn>{{ $t('proxy-account-warn') }}</ui-info>
 		</section>
 		<section>
 			<header><fa :icon="farEnvelope"/> {{ $t('email-config') }}</header>
-			<ui-switch v-model="enableEmail">{{ $t('enable-email') }}<template v-slot:desc>{{ $t('email-config-info') }}</template></ui-switch>
+			<ui-switch v-model="enableEmail">{{ $t('enable-email') }}<template #desc>{{ $t('email-config-info') }}</template></ui-switch>
 			<ui-input v-model="email" type="email" :disabled="!enableEmail">{{ $t('email') }}</ui-input>
 			<ui-horizon-group inputs>
 				<ui-input v-model="smtpHost" :disabled="!enableEmail">{{ $t('smtp-host') }}</ui-input>
@@ -58,15 +58,15 @@
 				<ui-input v-model="smtpUser" :disabled="!enableEmail">{{ $t('smtp-user') }}</ui-input>
 				<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail">{{ $t('smtp-pass') }}</ui-input>
 			</ui-horizon-group>
-			<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template v-slot:desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
+			<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
 		</section>
 		<section>
 			<header><fa :icon="faBolt"/> {{ $t('serviceworker-config') }}</header>
-			<ui-switch v-model="enableServiceWorker">{{ $t('enable-serviceworker') }}<template v-slot:desc>{{ $t('serviceworker-info') }}</template></ui-switch>
+			<ui-switch v-model="enableServiceWorker">{{ $t('enable-serviceworker') }}<template #desc>{{ $t('serviceworker-info') }}</template></ui-switch>
 			<ui-info>{{ $t('vapid-info') }}<br><code>npm i web-push -g<br>web-push generate-vapid-keys</code></ui-info>
 			<ui-horizon-group inputs class="fit-bottom">
-				<ui-input v-model="swPublicKey" :disabled="!enableServiceWorker"><template v-slot:icon><fa icon="key"/></template>{{ $t('vapid-publickey') }}</ui-input>
-				<ui-input v-model="swPrivateKey" :disabled="!enableServiceWorker"><template v-slot:icon><fa icon="key"/></template>{{ $t('vapid-privatekey') }}</ui-input>
+				<ui-input v-model="swPublicKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-publickey') }}</ui-input>
+				<ui-input v-model="swPrivateKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-privatekey') }}</ui-input>
 			</ui-horizon-group>
 		</section>
 		<section>
@@ -76,8 +76,8 @@
 		<section>
 			<header><fa :icon="faUserPlus"/> {{ $t('user-recommendation-config') }}</header>
 			<ui-switch v-model="enableExternalUserRecommendation">{{ $t('enable-external-user-recommendation') }}</ui-switch>
-			<ui-input v-model="externalUserRecommendationEngine" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-engine') }}<template v-slot:desc>{{ $t('external-user-recommendation-engine-desc') }}</template></ui-input>
-			<ui-input v-model="externalUserRecommendationTimeout" type="number" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-timeout') }}<template v-slot:suffix>ms</template><template v-slot:desc>{{ $t('external-user-recommendation-timeout-desc') }}</template></ui-input>
+			<ui-input v-model="externalUserRecommendationEngine" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-engine') }}<template #desc>{{ $t('external-user-recommendation-engine-desc') }}</template></ui-input>
+			<ui-input v-model="externalUserRecommendationTimeout" type="number" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-timeout') }}<template #suffix>ms</template><template #desc>{{ $t('external-user-recommendation-timeout-desc') }}</template></ui-input>
 		</section>
 		<section>
 			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
@@ -85,7 +85,7 @@
 	</ui-card>
 
 	<ui-card>
-		<template v-slot:title>{{ $t('invite') }}</template>
+		<template #title>{{ $t('invite') }}</template>
 		<section>
 			<ui-button @click="invite">{{ $t('invite') }}</ui-button>
 			<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
@@ -93,12 +93,12 @@
 	</ui-card>
 
 	<ui-card>
-		<template v-slot:title><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</template>
+		<template #title><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</template>
 		<section>
 			<ui-switch v-model="enableTwitterIntegration">{{ $t('enable-twitter-integration') }}</ui-switch>
 			<ui-horizon-group>
-				<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><template v-slot:icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-key') }}</ui-input>
-				<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><template v-slot:icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
+				<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-key') }}</ui-input>
+				<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
 			</ui-horizon-group>
 			<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
 			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
@@ -106,12 +106,12 @@
 	</ui-card>
 
 	<ui-card>
-		<template v-slot:title><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</template>
+		<template #title><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</template>
 		<section>
 			<ui-switch v-model="enableGithubIntegration">{{ $t('enable-github-integration') }}</ui-switch>
 			<ui-horizon-group>
-				<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><template v-slot:icon><fa icon="key"/></template>{{ $t('github-integration-client-id') }}</ui-input>
-				<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><template v-slot:icon><fa icon="key"/></template>{{ $t('github-integration-client-secret') }}</ui-input>
+				<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-id') }}</ui-input>
+				<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-secret') }}</ui-input>
 			</ui-horizon-group>
 			<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
 			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
@@ -119,12 +119,12 @@
 	</ui-card>
 
 	<ui-card>
-		<template v-slot:title><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</template>
+		<template #title><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</template>
 		<section>
 			<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
 			<ui-horizon-group>
-				<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><template v-slot:icon><fa icon="key"/></template>{{ $t('discord-integration-client-id') }}</ui-input>
-				<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><template v-slot:icon><fa icon="key"/></template>{{ $t('discord-integration-client-secret') }}</ui-input>
+				<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-id') }}</ui-input>
+				<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-secret') }}</ui-input>
 			</ui-horizon-group>
 			<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
 			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
diff --git a/src/client/app/admin/views/moderators.vue b/src/client/app/admin/views/moderators.vue
index 0e5af1d418..bf7d951fc7 100644
--- a/src/client/app/admin/views/moderators.vue
+++ b/src/client/app/admin/views/moderators.vue
@@ -1,10 +1,10 @@
 <template>
 <div>
 	<ui-card>
-		<template v-slot:title><fa icon="plus"/> {{ $t('add-moderator.title') }}</template>
+		<template #title><fa icon="plus"/> {{ $t('add-moderator.title') }}</template>
 		<section class="fit-top">
 			<ui-input v-model="username" type="text">
-				<template v-slot:prefix>@</template>
+				<template #prefix>@</template>
 			</ui-input>
 			<ui-horizon-group>
 				<ui-button @click="add" :disabled="changing">{{ $t('add-moderator.add') }}</ui-button>
diff --git a/src/client/app/admin/views/queue.vue b/src/client/app/admin/views/queue.vue
index f75c73d7a2..fa9e3df780 100644
--- a/src/client/app/admin/views/queue.vue
+++ b/src/client/app/admin/views/queue.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<ui-card>
-		<template v-slot:title>{{ $t('operation') }}</template>
+		<template #title>{{ $t('operation') }}</template>
 		<section>
 			<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button>
 		</section>
diff --git a/src/client/app/admin/views/users.vue b/src/client/app/admin/views/users.vue
index 46399ef697..ff485cec86 100644
--- a/src/client/app/admin/views/users.vue
+++ b/src/client/app/admin/views/users.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<ui-card>
-		<template v-slot:title><fa :icon="faTerminal"/> {{ $t('operation') }}</template>
+		<template #title><fa :icon="faTerminal"/> {{ $t('operation') }}</template>
 		<section class="fit-top">
 			<ui-input class="target" v-model="target" type="text" @enter="showUser">
 				<span>{{ $t('username-or-userid') }}</span>
@@ -32,18 +32,18 @@
 	</ui-card>
 
 	<ui-card>
-		<template v-slot:title><fa :icon="faUsers"/> {{ $t('users.title') }}</template>
+		<template #title><fa :icon="faUsers"/> {{ $t('users.title') }}</template>
 		<section class="fit-top">
 			<ui-horizon-group inputs>
 				<ui-select v-model="sort">
-					<template v-slot:label>{{ $t('users.sort.title') }}</template>
+					<template #label>{{ $t('users.sort.title') }}</template>
 					<option value="-createdAt">{{ $t('users.sort.createdAtAsc') }}</option>
 					<option value="+createdAt">{{ $t('users.sort.createdAtDesc') }}</option>
 					<option value="-updatedAt">{{ $t('users.sort.updatedAtAsc') }}</option>
 					<option value="+updatedAt">{{ $t('users.sort.updatedAtDesc') }}</option>
 				</ui-select>
 				<ui-select v-model="state">
-					<template v-slot:label>{{ $t('users.state.title') }}</template>
+					<template #label>{{ $t('users.state.title') }}</template>
 					<option value="all">{{ $t('users.state.all') }}</option>
 					<option value="admin">{{ $t('users.state.admin') }}</option>
 					<option value="moderator">{{ $t('users.state.moderator') }}</option>
@@ -52,7 +52,7 @@
 					<option value="suspended">{{ $t('users.state.suspended') }}</option>
 				</ui-select>
 				<ui-select v-model="origin">
-					<template v-slot:label>{{ $t('users.origin.title') }}</template>
+					<template #label>{{ $t('users.origin.title') }}</template>
 					<option value="combined">{{ $t('users.origin.combined') }}</option>
 					<option value="local">{{ $t('users.origin.local') }}</option>
 					<option value="remote">{{ $t('users.origin.remote') }}</option>
diff --git a/src/client/app/common/views/components/api-settings.vue b/src/client/app/common/views/components/api-settings.vue
index c0361726a4..8877e1f3cb 100644
--- a/src/client/app/common/views/components/api-settings.vue
+++ b/src/client/app/common/views/components/api-settings.vue
@@ -1,6 +1,6 @@
 <template>
 <ui-card>
-	<template v-slot:title><fa icon="key"/> API</template>
+	<template #title><fa icon="key"/> API</template>
 
 	<section class="fit-top">
 		<ui-input :value="$store.state.i.token" readonly>
@@ -19,7 +19,7 @@
 		</ui-input>
 		<ui-textarea v-model="body">
 			<span>{{ $t('console.parameter') }} (JSON or JSON5)</span>
-			<template v-slot:desc>{{ $t('console.credential-info') }}</template>
+			<template #desc>{{ $t('console.credential-info') }}</template>
 		</ui-textarea>
 		<ui-button @click="send" :disabled="sending">
 			<template v-if="sending">{{ $t('console.sending') }}</template>
diff --git a/src/client/app/common/views/components/dialog.vue b/src/client/app/common/views/components/dialog.vue
index 95b7265f7f..78ea4e3610 100644
--- a/src/client/app/common/views/components/dialog.vue
+++ b/src/client/app/common/views/components/dialog.vue
@@ -6,7 +6,7 @@
 		<header v-if="title" v-html="title"></header>
 		<div class="body" v-if="text" v-html="text"></div>
 		<ui-input v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></ui-input>
-		<ui-input v-if="user" v-model="userInputValue" autofocus @keydown="onInputKeydown"><template v-slot:prefix>@</template></ui-input>
+		<ui-input v-if="user" v-model="userInputValue" autofocus @keydown="onInputKeydown"><template #prefix>@</template></ui-input>
 		<ui-select v-if="select" v-model="selectedValue">
 			<option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
 		</ui-select>
diff --git a/src/client/app/common/views/components/drive-settings.vue b/src/client/app/common/views/components/drive-settings.vue
index 72129f8e56..0541c2b3d2 100644
--- a/src/client/app/common/views/components/drive-settings.vue
+++ b/src/client/app/common/views/components/drive-settings.vue
@@ -1,6 +1,6 @@
 <template>
 <ui-card>
-	<template v-slot:title><fa icon="cloud"/> {{ $t('@.drive') }}</template>
+	<template #title><fa icon="cloud"/> {{ $t('@.drive') }}</template>
 
 	<section v-if="!fetching" class="juakhbxthdewydyreaphkepoxgxvfogn">
 		<div class="meter"><div :style="meterStyle"></div></div>
diff --git a/src/client/app/common/views/components/integration-settings.vue b/src/client/app/common/views/components/integration-settings.vue
index 2036645e0d..8862fa86d5 100644
--- a/src/client/app/common/views/components/integration-settings.vue
+++ b/src/client/app/common/views/components/integration-settings.vue
@@ -1,6 +1,6 @@
 <template>
 <ui-card v-if="enableTwitterIntegration || enableDiscordIntegration || enableGithubIntegration">
-	<template v-slot:title><fa icon="share-alt"/> {{ $t('title') }}</template>
+	<template #title><fa icon="share-alt"/> {{ $t('title') }}</template>
 
 	<section v-if="enableTwitterIntegration">
 		<header><fa :icon="['fab', 'twitter']"/> Twitter</header>
diff --git a/src/client/app/common/views/components/language-settings.vue b/src/client/app/common/views/components/language-settings.vue
index 6ab18abca6..0d9a5e1608 100644
--- a/src/client/app/common/views/components/language-settings.vue
+++ b/src/client/app/common/views/components/language-settings.vue
@@ -1,6 +1,6 @@
 <template>
 <ui-card>
-	<template v-slot:title><fa icon="language"/> {{ $t('title') }}</template>
+	<template #title><fa icon="language"/> {{ $t('title') }}</template>
 
 	<section class="fit-top">
 		<ui-select v-model="lang" :placeholder="$t('pick-language')">
diff --git a/src/client/app/common/views/components/mute-and-block.vue b/src/client/app/common/views/components/mute-and-block.vue
index fcdbcf264e..4a7f5be67d 100644
--- a/src/client/app/common/views/components/mute-and-block.vue
+++ b/src/client/app/common/views/components/mute-and-block.vue
@@ -1,6 +1,6 @@
 <template>
 <ui-card>
-	<template v-slot:title><fa icon="ban"/> {{ $t('mute-and-block') }}</template>
+	<template #title><fa icon="ban"/> {{ $t('mute-and-block') }}</template>
 
 	<section>
 		<header>{{ $t('mute') }}</header>
@@ -25,7 +25,7 @@
 	<section>
 		<header>{{ $t('word-mute') }}</header>
 		<ui-textarea v-model="mutedWords">
-			{{ $t('muted-words') }}<template v-slot:desc>{{ $t('muted-words-description') }}</template>
+			{{ $t('muted-words') }}<template #desc>{{ $t('muted-words-description') }}</template>
 		</ui-textarea>
 		<ui-button @click="save">{{ $t('save') }}</ui-button>
 	</section>
diff --git a/src/client/app/common/views/components/notification-settings.vue b/src/client/app/common/views/components/notification-settings.vue
index e1e1128194..fe7475027e 100644
--- a/src/client/app/common/views/components/notification-settings.vue
+++ b/src/client/app/common/views/components/notification-settings.vue
@@ -1,9 +1,9 @@
 <template>
 <ui-card>
-	<template v-slot:title><fa :icon="['far', 'bell']"/> {{ $t('title') }}</template>
+	<template #title><fa :icon="['far', 'bell']"/> {{ $t('title') }}</template>
 	<section>
 		<ui-switch v-model="$store.state.i.settings.autoWatch" @change="onChangeAutoWatch">
-			{{ $t('auto-watch') }}<template v-slot:desc>{{ $t('auto-watch-desc') }}</template>
+			{{ $t('auto-watch') }}<template #desc>{{ $t('auto-watch-desc') }}</template>
 		</ui-switch>
 		<section>
 			<ui-button @click="readAllNotifications">{{ $t('mark-as-read-all-notifications') }}</ui-button>
diff --git a/src/client/app/common/views/components/profile-editor.vue b/src/client/app/common/views/components/profile-editor.vue
index 66e5686194..929e4738b4 100644
--- a/src/client/app/common/views/components/profile-editor.vue
+++ b/src/client/app/common/views/components/profile-editor.vue
@@ -1,6 +1,6 @@
 <template>
 <ui-card>
-	<template v-slot:title><fa icon="user"/> {{ $t('title') }}</template>
+	<template #title><fa icon="user"/> {{ $t('title') }}</template>
 
 	<section class="esokaraujimuwfttfzgocmutcihewscl">
 		<div class="header" :style="bannerStyle">
@@ -14,41 +14,41 @@
 
 			<ui-input v-model="username" readonly>
 				<span>{{ $t('account') }}</span>
-				<template v-slot:prefix>@</template>
-				<template v-slot:suffix>@{{ host }}</template>
+				<template #prefix>@</template>
+				<template #suffix>@{{ host }}</template>
 			</ui-input>
 
 			<ui-input v-model="location">
 				<span>{{ $t('location') }}</span>
-				<template v-slot:prefix><fa icon="map-marker-alt"/></template>
+				<template #prefix><fa icon="map-marker-alt"/></template>
 			</ui-input>
 
 			<ui-input v-model="birthday" type="date">
-				<template v-slot:title>{{ $t('birthday') }}</template>
-				<template v-slot:prefix><fa icon="birthday-cake"/></template>
+				<template #title>{{ $t('birthday') }}</template>
+				<template #prefix><fa icon="birthday-cake"/></template>
 			</ui-input>
 
 			<ui-textarea v-model="description" :max="500">
 				<span>{{ $t('description') }}</span>
-				<template v-slot:desc>{{ $t('you-can-include-hashtags') }}</template>
+				<template #desc>{{ $t('you-can-include-hashtags') }}</template>
 			</ui-textarea>
 
 			<ui-select v-model="lang">
-				<template v-slot:label>{{ $t('language') }}</template>
-				<template v-slot:icon><fa icon="language"/></template>
+				<template #label>{{ $t('language') }}</template>
+				<template #icon><fa icon="language"/></template>
 				<option v-for="lang in unique(Object.values(langmap).map(x => x.nativeName)).map(name => Object.keys(langmap).find(k => langmap[k].nativeName == name))" :value="lang" :key="lang">{{ langmap[lang].nativeName }}</option>
 			</ui-select>
 
 			<ui-input type="file" @change="onAvatarChange">
 				<span>{{ $t('avatar') }}</span>
-				<template v-slot:icon><fa icon="image"/></template>
-				<template v-slot:desc v-if="avatarUploading">{{ $t('uploading') }}<mk-ellipsis/></template>
+				<template #icon><fa icon="image"/></template>
+				<template #desc v-if="avatarUploading">{{ $t('uploading') }}<mk-ellipsis/></template>
 			</ui-input>
 
 			<ui-input type="file" @change="onBannerChange">
 				<span>{{ $t('banner') }}</span>
-				<template v-slot:icon><fa icon="image"/></template>
-				<template v-slot:desc v-if="bannerUploading">{{ $t('uploading') }}<mk-ellipsis/></template>
+				<template #icon><fa icon="image"/></template>
+				<template #desc v-if="bannerUploading">{{ $t('uploading') }}<mk-ellipsis/></template>
 			</ui-input>
 
 			<ui-button @click="save(true)">{{ $t('save') }}</ui-button>
diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue
index 230ade996e..2905bb1da1 100644
--- a/src/client/app/common/views/components/signin.vue
+++ b/src/client/app/common/views/components/signin.vue
@@ -3,16 +3,16 @@
 	<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div>
 	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @input="onUsernameChange" styl="fill">
 		<span>{{ $t('username') }}</span>
-		<template v-slot:prefix>@</template>
-		<template v-slot:suffix>@{{ host }}</template>
+		<template #prefix>@</template>
+		<template #suffix>@{{ host }}</template>
 	</ui-input>
 	<ui-input v-model="password" type="password" :with-password-toggle="true" required styl="fill">
 		<span>{{ $t('password') }}</span>
-		<template v-slot:prefix><fa icon="lock"/></template>
+		<template #prefix><fa icon="lock"/></template>
 	</ui-input>
 	<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill">
 		<span>{{ $t('@.2fa') }}</span>
-		<template v-slot:prefix><fa icon="gavel"/></template>
+		<template #prefix><fa icon="gavel"/></template>
 	</ui-input>
 	<ui-button type="submit" :disabled="signing">{{ signing ? $t('signing-in') : $t('signin') }}</ui-button>
 	<p v-if="meta && meta.enableTwitterIntegration" style="margin: 8px 0;"><a :href="`${apiUrl}/signin/twitter`">{{ $t('signin-with-twitter') }}</a></p>
diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue
index a228617370..0a1d9427d9 100644
--- a/src/client/app/common/views/components/signup.vue
+++ b/src/client/app/common/views/components/signup.vue
@@ -3,25 +3,25 @@
 	<template v-if="meta">
 		<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill">
 			<span>{{ $t('invitation-code') }}</span>
-			<template v-slot:prefix><fa icon="id-card-alt"/></template>
-			<template v-slot:desc v-html="this.$t('invitation-info').replace('{}', 'mailto:' + meta.maintainer.email)"></template>
+			<template #prefix><fa icon="id-card-alt"/></template>
+			<template #desc v-html="this.$t('invitation-info').replace('{}', 'mailto:' + meta.maintainer.email)"></template>
 		</ui-input>
 		<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill">
 			<span>{{ $t('username') }}</span>
-			<template v-slot:prefix>@</template>
-			<template v-slot:suffix>@{{ host }}</template>
-			<template v-slot:desc v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner" pulse fixed-width/> {{ $t('checking') }}</template>
-			<template v-slot:desc v-if="usernameState == 'ok'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('available') }}</template>
-			<template v-slot:desc v-if="usernameState == 'unavailable'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('unavailable') }}</template>
-			<template v-slot:desc v-if="usernameState == 'error'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('error') }}</template>
-			<template v-slot:desc v-if="usernameState == 'invalid-format'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('invalid-format') }}</template>
-			<template v-slot:desc v-if="usernameState == 'min-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('too-short') }}</template>
-			<template v-slot:desc v-if="usernameState == 'max-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('too-long') }}</template>
+			<template #prefix>@</template>
+			<template #suffix>@{{ host }}</template>
+			<template #desc v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner" pulse fixed-width/> {{ $t('checking') }}</template>
+			<template #desc v-if="usernameState == 'ok'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('available') }}</template>
+			<template #desc v-if="usernameState == 'unavailable'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('unavailable') }}</template>
+			<template #desc v-if="usernameState == 'error'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('error') }}</template>
+			<template #desc v-if="usernameState == 'invalid-format'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('invalid-format') }}</template>
+			<template #desc v-if="usernameState == 'min-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('too-short') }}</template>
+			<template #desc v-if="usernameState == 'max-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('too-long') }}</template>
 		</ui-input>
 		<ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true" styl="fill">
 			<span>{{ $t('password') }}</span>
-			<template v-slot:prefix><fa icon="lock"/></template>
-			<template v-slot:desc>
+			<template #prefix><fa icon="lock"/></template>
+			<template #desc>
 				<p v-if="passwordStrength == 'low'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('weak-password') }}</p>
 				<p v-if="passwordStrength == 'medium'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('normal-password') }}</p>
 				<p v-if="passwordStrength == 'high'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('strong-password') }}</p>
@@ -29,8 +29,8 @@
 		</ui-input>
 		<ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype" styl="fill">
 			<span>{{ $t('password') }} ({{ $t('retype') }})</span>
-			<template v-slot:prefix><fa icon="lock"/></template>
-			<template v-slot:desc>
+			<template #prefix><fa icon="lock"/></template>
+			<template #desc>
 				<p v-if="passwordRetypeState == 'match'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('password-matched') }}</p>
 				<p v-if="passwordRetypeState == 'not-match'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('password-not-matched') }}</p>
 			</template>
diff --git a/src/client/app/common/views/components/theme.vue b/src/client/app/common/views/components/theme.vue
index 266b32be34..54162e2c61 100644
--- a/src/client/app/common/views/components/theme.vue
+++ b/src/client/app/common/views/components/theme.vue
@@ -1,10 +1,10 @@
 <template>
 <ui-card>
-	<template v-slot:title><fa icon="palette"/> {{ $t('theme') }}</template>
+	<template #title><fa icon="palette"/> {{ $t('theme') }}</template>
 	<section class="nicnklzforebnpfgasiypmpdaaglujqm fit-top">
 		<label>
 			<ui-select v-model="light" :placeholder="$t('light-theme')">
-				<template v-slot:label><fa :icon="faSun"/> {{ $t('light-theme') }}</template>
+				<template #label><fa :icon="faSun"/> {{ $t('light-theme') }}</template>
 				<optgroup :label="$t('light-themes')">
 					<option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
 				</optgroup>
@@ -16,7 +16,7 @@
 
 		<label>
 			<ui-select v-model="dark" :placeholder="$t('dark-theme')">
-				<template v-slot:label><fa :icon="faMoon"/> {{ $t('dark-theme') }}</template>
+				<template #label><fa :icon="faMoon"/> {{ $t('dark-theme') }}</template>
 				<optgroup :label="$t('dark-themes')">
 					<option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
 				</optgroup>
diff --git a/src/client/app/common/views/components/user-list-editor.vue b/src/client/app/common/views/components/user-list-editor.vue
index d230260c77..53c945ca0a 100644
--- a/src/client/app/common/views/components/user-list-editor.vue
+++ b/src/client/app/common/views/components/user-list-editor.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="cudqjmnl">
 	<ui-card>
-		<template v-slot:title><fa :icon="faList"/> {{ list.title }}</template>
+		<template #title><fa :icon="faList"/> {{ list.title }}</template>
 
 		<section>
 			<ui-button @click="rename"><fa :icon="faICursor"/> {{ $t('rename') }}</ui-button>
@@ -10,7 +10,7 @@
 	</ui-card>
 
 	<ui-card>
-		<template v-slot:title><fa :icon="faUsers"/> {{ $t('users') }}</template>
+		<template #title><fa :icon="faUsers"/> {{ $t('users') }}</template>
 
 		<section>
 			<sequential-entrance animation="entranceFromTop" delay="25">
diff --git a/src/client/app/common/views/components/user-list.vue b/src/client/app/common/views/components/user-list.vue
index 2c258f727a..38e17325ef 100644
--- a/src/client/app/common/views/components/user-list.vue
+++ b/src/client/app/common/views/components/user-list.vue
@@ -1,6 +1,6 @@
 <template>
 <ui-container :body-togglable="true">
-	<template v-slot:header><slot></slot></template>
+	<template #header><slot></slot></template>
 
 	<mk-error v-if="!fetching && !inited" @retry="init()"/>
 
diff --git a/src/client/app/common/views/pages/explore.vue b/src/client/app/common/views/pages/explore.vue
index 8fe17b46cc..8f40e42e83 100644
--- a/src/client/app/common/views/pages/explore.vue
+++ b/src/client/app/common/views/pages/explore.vue
@@ -8,7 +8,7 @@
 	</mk-user-list>
 
 	<ui-container :body-togglable="true">
-		<template v-slot:header><fa :icon="faHashtag" fixed-width/>{{ $t('popular-tags') }}</template>
+		<template #header><fa :icon="faHashtag" fixed-width/>{{ $t('popular-tags') }}</template>
 
 		<div class="vxjfqztj">
 			<router-link v-for="tag in tags" :to="`/explore/tags/${tag.tag}`" :key="tag.tag">{{ tag.tag }}</router-link>
diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue
index 02bcaa1a58..b266d5f6e6 100644
--- a/src/client/app/common/views/widgets/hashtags.vue
+++ b/src/client/app/common/views/widgets/hashtags.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="mkw-hashtags">
 	<ui-container :show-header="!props.compact">
-		<template v-slot:header><fa icon="hashtag"/>{{ $t('title') }}</template>
+		<template #header><fa icon="hashtag"/>{{ $t('title') }}</template>
 
 		<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'">
 			<mk-trends/>
diff --git a/src/client/app/common/views/widgets/memo.vue b/src/client/app/common/views/widgets/memo.vue
index 47e8df3dfc..8a037f03dc 100644
--- a/src/client/app/common/views/widgets/memo.vue
+++ b/src/client/app/common/views/widgets/memo.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="mkw-memo">
 	<ui-container :show-header="!props.compact">
-		<template v-slot:header><fa :icon="['far', 'sticky-note']"/>{{ $t('title') }}</template>
+		<template #header><fa :icon="['far', 'sticky-note']"/>{{ $t('title') }}</template>
 
 		<div class="mkw-memo--body">
 			<textarea v-model="text" :placeholder="$t('placeholder')" @input="onChange"></textarea>
diff --git a/src/client/app/common/views/widgets/photo-stream.vue b/src/client/app/common/views/widgets/photo-stream.vue
index 0c03a7ec66..eae6d0a190 100644
--- a/src/client/app/common/views/widgets/photo-stream.vue
+++ b/src/client/app/common/views/widgets/photo-stream.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="mkw-photo-stream" :class="$style.root" :data-melt="props.design == 2">
 	<ui-container :show-header="props.design == 0" :naked="props.design == 2">
-		<template v-slot:header><fa icon="camera"/>{{ $t('title') }}</template>
+		<template #header><fa icon="camera"/>{{ $t('title') }}</template>
 
 		<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
 		<div :class="$style.stream" v-if="!fetching && images.length > 0">
diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue
index e96ce0d867..0b1fc42721 100644
--- a/src/client/app/common/views/widgets/posts-monitor.vue
+++ b/src/client/app/common/views/widgets/posts-monitor.vue
@@ -1,8 +1,8 @@
 <template>
 <div class="mkw-posts-monitor">
 	<ui-container :show-header="props.design == 0" :naked="props.design == 2">
-		<template v-slot:header><fa icon="chart-line"/>{{ $t('title') }}</template>
-		<template v-slot:func><button @click="toggle" :title="$t('toggle')"><fa icon="sort"/></button></template>
+		<template #header><fa icon="chart-line"/>{{ $t('title') }}</template>
+		<template #func><button @click="toggle" :title="$t('toggle')"><fa icon="sort"/></button></template>
 
 		<div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }">
 			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 2">
diff --git a/src/client/app/common/views/widgets/rss.vue b/src/client/app/common/views/widgets/rss.vue
index 2dffd26c55..5aa48c6e59 100644
--- a/src/client/app/common/views/widgets/rss.vue
+++ b/src/client/app/common/views/widgets/rss.vue
@@ -1,8 +1,8 @@
 <template>
 <div class="mkw-rss">
 	<ui-container :show-header="!props.compact">
-		<template v-slot:header><fa icon="rss-square"/>RSS</template>
-		<template v-slot:func><button title="設定" @click="setting"><fa icon="cog"/></button></template>
+		<template #header><fa icon="rss-square"/>RSS</template>
+		<template #func><button title="設定" @click="setting"><fa icon="cog"/></button></template>
 
 		<div class="mkw-rss--body" :data-mobile="platform == 'mobile'">
 			<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
diff --git a/src/client/app/common/views/widgets/server.vue b/src/client/app/common/views/widgets/server.vue
index d7bc620133..90a0f0171b 100644
--- a/src/client/app/common/views/widgets/server.vue
+++ b/src/client/app/common/views/widgets/server.vue
@@ -1,8 +1,8 @@
 <template>
 <div class="mkw-server">
 	<ui-container :show-header="props.design == 0" :naked="props.design == 2">
-		<template v-slot:header><fa icon="server"/>{{ $t('title') }}</template>
-		<template v-slot:func><button @click="toggle" :title="$t('toggle')"><fa icon="sort"/></button></template>
+		<template #header><fa icon="server"/>{{ $t('title') }}</template>
+		<template #func><button @click="toggle" :title="$t('toggle')"><fa icon="sort"/></button></template>
 
 		<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
 		<template v-if="!fetching">
diff --git a/src/client/app/desktop/views/components/activity.vue b/src/client/app/desktop/views/components/activity.vue
index d32fa2a2dd..7bb942ac09 100644
--- a/src/client/app/desktop/views/components/activity.vue
+++ b/src/client/app/desktop/views/components/activity.vue
@@ -1,8 +1,8 @@
 <template>
 <div class="mk-activity">
 	<ui-container :show-header="design == 0" :naked="design == 2">
-		<template v-slot:header><fa icon="chart-bar"/>{{ $t('title') }}</template>
-		<template v-slot:func><button :title="$t('toggle')" @click="toggle"><fa icon="sort"/></button></template>
+		<template #header><fa icon="chart-bar"/>{{ $t('title') }}</template>
+		<template #func><button :title="$t('toggle')" @click="toggle"><fa icon="sort"/></button></template>
 
 		<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
 		<template v-else>
diff --git a/src/client/app/desktop/views/components/choose-file-from-drive-window.vue b/src/client/app/desktop/views/components/choose-file-from-drive-window.vue
index b3048d9759..8b39e6e00b 100644
--- a/src/client/app/desktop/views/components/choose-file-from-drive-window.vue
+++ b/src/client/app/desktop/views/components/choose-file-from-drive-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" is-modal width="800px" height="500px" @closed="destroyDom">
-	<template v-slot:header>
+	<template #header>
 		<span class="jqiaciqv">
 			<span class="title">{{ $t('choose-prompt') }}</span>
 			<span class="count" v-if="multiple && files.length > 0">({{ $t('chosen-files', { count: files.length }) }})</span>
diff --git a/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue b/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue
index c7bdc804e7..fe76436544 100644
--- a/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue
+++ b/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" is-modal width="800px" height="500px" @closed="destroyDom">
-	<template v-slot:header>
+	<template #header>
 		<span>{{ $t('choose-prompt') }}</span>
 	</template>
 
diff --git a/src/client/app/desktop/views/components/crop-window.vue b/src/client/app/desktop/views/components/crop-window.vue
index d1767113b2..e685106a7c 100644
--- a/src/client/app/desktop/views/components/crop-window.vue
+++ b/src/client/app/desktop/views/components/crop-window.vue
@@ -1,6 +1,6 @@
 <template>
 	<mk-window ref="window" is-modal width="800px" :can-close="false">
-		<template v-slot:header><fa icon="crop"/>{{ title }}</template>
+		<template #header><fa icon="crop"/>{{ title }}</template>
 		<div class="body">
 			<vue-cropper ref="cropper"
 				:src="image.url"
diff --git a/src/client/app/desktop/views/components/drive-window.vue b/src/client/app/desktop/views/components/drive-window.vue
index a3a4e595da..5f8a9316f3 100644
--- a/src/client/app/desktop/views/components/drive-window.vue
+++ b/src/client/app/desktop/views/components/drive-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" @closed="destroyDom" width="800px" height="500px" :popout-url="popout">
-	<template v-slot:header>
+	<template #header>
 		<p v-if="usage" :class="$style.info"><b>{{ usage.toFixed(1) }}%</b> {{ $t('used') }}</p>
 		<span :class="$style.title"><fa icon="cloud"/>{{ $t('@.drive') }}</span>
 	</template>
diff --git a/src/client/app/desktop/views/components/game-window.vue b/src/client/app/desktop/views/components/game-window.vue
index 755295d6d1..3dba4c3af4 100644
--- a/src/client/app/desktop/views/components/game-window.vue
+++ b/src/client/app/desktop/views/components/game-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom">
-	<template v-slot:header><fa icon="gamepad"/> {{ $t('game') }}</template>
+	<template #header><fa icon="gamepad"/> {{ $t('game') }}</template>
 	<x-reversi :class="$style.content" @gamed="g => game = g"/>
 </mk-window>
 </template>
diff --git a/src/client/app/desktop/views/components/messaging-room-window.vue b/src/client/app/desktop/views/components/messaging-room-window.vue
index 8b9a8ad5e9..ea94fa1bd7 100644
--- a/src/client/app/desktop/views/components/messaging-room-window.vue
+++ b/src/client/app/desktop/views/components/messaging-room-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom">
-	<template v-slot:header><fa icon="comments"/> {{ $t('title') }} <mk-user-name :user="user"/></template>
+	<template #header><fa icon="comments"/> {{ $t('title') }} <mk-user-name :user="user"/></template>
 	<x-messaging-room :user="user" :class="$style.content"/>
 </mk-window>
 </template>
diff --git a/src/client/app/desktop/views/components/messaging-window.vue b/src/client/app/desktop/views/components/messaging-window.vue
index c602e50379..51f7e2fe51 100644
--- a/src/client/app/desktop/views/components/messaging-window.vue
+++ b/src/client/app/desktop/views/components/messaging-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" width="500px" height="560px" @closed="destroyDom">
-	<template v-slot:header :class="$style.header"><fa icon="comments"/>{{ $t('title') }}</template>
+	<template #header :class="$style.header"><fa icon="comments"/>{{ $t('title') }}</template>
 	<x-messaging :class="$style.content" @navigate="navigate"/>
 </mk-window>
 </template>
diff --git a/src/client/app/desktop/views/components/post-form-window.vue b/src/client/app/desktop/views/components/post-form-window.vue
index 8ddb529b4d..1d718bef15 100644
--- a/src/client/app/desktop/views/components/post-form-window.vue
+++ b/src/client/app/desktop/views/components/post-form-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window class="mk-post-form-window" ref="window" is-modal @closed="onWindowClosed" :animation="animation">
-	<template v-slot:header>
+	<template #header>
 		<span class="mk-post-form-window--header">
 			<span class="icon" v-if="geo"><fa icon="map-marker-alt"/></span>
 			<span v-if="!reply">{{ $t('note') }}</span>
diff --git a/src/client/app/desktop/views/components/progress-dialog.vue b/src/client/app/desktop/views/components/progress-dialog.vue
index cc971769c3..28b35dbd97 100644
--- a/src/client/app/desktop/views/components/progress-dialog.vue
+++ b/src/client/app/desktop/views/components/progress-dialog.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" :is-modal="false" :can-close="false" width="500px" @closed="destroyDom">
-	<template v-slot:header>{{ title }}<mk-ellipsis/></template>
+	<template #header>{{ title }}<mk-ellipsis/></template>
 	<div :class="$style.body">
 		<p :class="$style.init" v-if="isNaN(value)">{{ $t('waiting') }}<mk-ellipsis/></p>
 		<p :class="$style.percentage" v-if="!isNaN(value)">{{ Math.floor((value / max) * 100) }}</p>
diff --git a/src/client/app/desktop/views/components/received-follow-requests-window.vue b/src/client/app/desktop/views/components/received-follow-requests-window.vue
index 9cde684d23..f86b6b0d59 100644
--- a/src/client/app/desktop/views/components/received-follow-requests-window.vue
+++ b/src/client/app/desktop/views/components/received-follow-requests-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" is-modal width="450px" height="500px" @closed="destroyDom">
-	<template v-slot:header><fa :icon="['far', 'envelope']"/> {{ $t('title') }}</template>
+	<template #header><fa :icon="['far', 'envelope']"/> {{ $t('title') }}</template>
 
 	<div class="slpqaxdoxhvglersgjukmvizkqbmbokc">
 		<div v-for="req in requests">
diff --git a/src/client/app/desktop/views/components/renote-form-window.vue b/src/client/app/desktop/views/components/renote-form-window.vue
index ee6b26ddfa..0ca347b530 100644
--- a/src/client/app/desktop/views/components/renote-form-window.vue
+++ b/src/client/app/desktop/views/components/renote-form-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" is-modal @closed="onWindowClosed" :animation="animation">
-	<template v-slot:header :class="$style.header"><fa icon="retweet"/>{{ $t('title') }}</template>
+	<template #header :class="$style.header"><fa icon="retweet"/>{{ $t('title') }}</template>
 	<mk-renote-form ref="form" :note="note" @posted="onPosted" @canceled="onCanceled" v-hotkey.global="keymap"/>
 </mk-window>
 </template>
diff --git a/src/client/app/desktop/views/components/settings-window.vue b/src/client/app/desktop/views/components/settings-window.vue
index 54a8dfd6ef..8e7635429c 100644
--- a/src/client/app/desktop/views/components/settings-window.vue
+++ b/src/client/app/desktop/views/components/settings-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" is-modal width="700px" height="550px" @closed="destroyDom">
-	<template v-slot:header :class="$style.header"><fa icon="cog"/>{{ $t('settings') }}</template>
+	<template #header :class="$style.header"><fa icon="cog"/>{{ $t('settings') }}</template>
 	<x-settings :initial-page="initialPage" @done="close"/>
 </mk-window>
 </template>
diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue
index 488742f257..dc237fc68a 100644
--- a/src/client/app/desktop/views/components/settings.vue
+++ b/src/client/app/desktop/views/components/settings.vue
@@ -22,17 +22,17 @@
 		<x-theme class="theme" v-show="page == 'theme'"/>
 
 		<ui-card class="web" v-show="page == 'web'">
-			<template v-slot:title><fa icon="sliders-h"/> {{ $t('behaviour') }}</template>
+			<template #title><fa icon="sliders-h"/> {{ $t('behaviour') }}</template>
 
 			<section>
 				<ui-switch v-model="fetchOnScroll">{{ $t('fetch-on-scroll') }}
-					<template v-slot:desc>{{ $t('fetch-on-scroll-desc') }}</template>
+					<template #desc>{{ $t('fetch-on-scroll-desc') }}</template>
 				</ui-switch>
 				<ui-switch v-model="autoPopout">{{ $t('auto-popout') }}
-					<template v-slot:desc>{{ $t('auto-popout-desc') }}</template>
+					<template #desc>{{ $t('auto-popout-desc') }}</template>
 				</ui-switch>
 				<ui-switch v-model="keepCw">{{ $t('keep-cw') }}
-					<template v-slot:desc>{{ $t('keep-cw-desc') }}</template>
+					<template #desc>{{ $t('keep-cw-desc') }}</template>
 				</ui-switch>
 			</section>
 
@@ -62,12 +62,12 @@
 
 			<section>
 				<header>{{ $t('web-search-engine') }}</header>
-				<ui-input v-model="webSearchEngine">{{ $t('web-search-engine') }}<template v-slot:desc>{{ $t('web-search-engine-desc') }}</template></ui-input>
+				<ui-input v-model="webSearchEngine">{{ $t('web-search-engine') }}<template #desc>{{ $t('web-search-engine-desc') }}</template></ui-input>
 			</section>
 		</ui-card>
 
 		<ui-card class="web" v-show="page == 'web'">
-			<template v-slot:title><fa icon="desktop"/> {{ $t('display') }}</template>
+			<template #title><fa icon="desktop"/> {{ $t('display') }}</template>
 
 			<section>
 				<ui-switch v-model="showPostFormOnTopOfTl">{{ $t('post-form-on-timeline') }}</ui-switch>
@@ -135,11 +135,11 @@
 		</ui-card>
 
 		<ui-card class="web" v-show="page == 'web'">
-			<template v-slot:title><fa icon="volume-up"/> {{ $t('sound') }}</template>
+			<template #title><fa icon="volume-up"/> {{ $t('sound') }}</template>
 
 			<section>
 				<ui-switch v-model="enableSounds">{{ $t('enable-sounds') }}
-					<template v-slot:desc>{{ $t('enable-sounds-desc') }}</template>
+					<template #desc>{{ $t('enable-sounds-desc') }}</template>
 				</ui-switch>
 				<label>{{ $t('volume') }}</label>
 				<input type="range"
@@ -155,7 +155,7 @@
 		<x-language-settings v-show="page == 'web'"/>
 
 		<ui-card class="web" v-show="page == 'web'">
-			<template v-slot:title><fa :icon="['far', 'trash-alt']"/> {{ $t('cache') }}</template>
+			<template #title><fa :icon="['far', 'trash-alt']"/> {{ $t('cache') }}</template>
 			<section>
 				<ui-button @click="clean">{{ $t('clean-cache') }}</ui-button>
 				<div class="none ui info warn">
@@ -171,7 +171,7 @@
 		</div>
 
 		<ui-card class="hashtags" v-show="page == 'hashtags'">
-			<template v-slot:title><fa icon="hashtag"/> {{ $t('tags') }}</template>
+			<template #title><fa icon="hashtag"/> {{ $t('tags') }}</template>
 			<section>
 				<x-tags/>
 			</section>
@@ -182,28 +182,28 @@
 		</div>
 
 		<ui-card class="apps" v-show="page == 'apps'">
-			<template v-slot:title><fa icon="puzzle-piece"/> {{ $t('apps') }}</template>
+			<template #title><fa icon="puzzle-piece"/> {{ $t('apps') }}</template>
 			<section>
 				<x-apps/>
 			</section>
 		</ui-card>
 
 		<ui-card class="password" v-show="page == 'security'">
-			<template v-slot:title><fa icon="unlock-alt"/> {{ $t('password') }}</template>
+			<template #title><fa icon="unlock-alt"/> {{ $t('password') }}</template>
 			<section>
 				<x-password-settings/>
 			</section>
 		</ui-card>
 
 		<ui-card class="2fa" v-show="page == 'security'">
-			<template v-slot:title><fa icon="mobile-alt"/> {{ $t('@.2fa') }}</template>
+			<template #title><fa icon="mobile-alt"/> {{ $t('@.2fa') }}</template>
 			<section>
 				<x-2fa/>
 			</section>
 		</ui-card>
 
 		<ui-card class="signin" v-show="page == 'security'">
-			<template v-slot:title><fa icon="sign-in-alt"/> {{ $t('signin') }}</template>
+			<template #title><fa icon="sign-in-alt"/> {{ $t('signin') }}</template>
 			<section>
 				<x-signins/>
 			</section>
@@ -214,14 +214,14 @@
 		</div>
 
 		<ui-card class="other" v-show="page == 'other'">
-			<template v-slot:title><fa icon="info-circle"/> {{ $t('about') }}</template>
+			<template #title><fa icon="info-circle"/> {{ $t('about') }}</template>
 			<section>
 				<p v-if="meta">{{ $t('operator') }}: <i><a :href="'mailto:' + meta.maintainer.email" target="_blank">{{ meta.maintainer.name }}</a></i></p>
 			</section>
 		</ui-card>
 
 		<ui-card class="other" v-show="page == 'other'">
-			<template v-slot:title><fa icon="sync-alt"/> {{ $t('update') }}</template>
+			<template #title><fa icon="sync-alt"/> {{ $t('update') }}</template>
 			<section>
 				<p>
 					<span>{{ $t('version') }} <i>{{ version }}</i></span>
@@ -237,20 +237,20 @@
 				<details>
 					<summary>{{ $t('update-settings') }}</summary>
 					<ui-switch v-model="preventUpdate">
-						{{ $t('prevent-update') }}<template v-slot:desc>{{ $t('prevent-update-desc') }}</template>
+						{{ $t('prevent-update') }}<template #desc>{{ $t('prevent-update-desc') }}</template>
 					</ui-switch>
 				</details>
 			</section>
 		</ui-card>
 
 		<ui-card class="other" v-show="page == 'other'">
-			<template v-slot:title><fa icon="cogs"/> {{ $t('advanced-settings') }}</template>
+			<template #title><fa icon="cogs"/> {{ $t('advanced-settings') }}</template>
 			<section>
 				<ui-switch v-model="debug">
-					{{ $t('debug-mode') }}<template v-slot:desc>{{ $t('debug-mode-desc') }}</template>
+					{{ $t('debug-mode') }}<template #desc>{{ $t('debug-mode-desc') }}</template>
 				</ui-switch>
 				<ui-switch v-model="enableExperimentalFeatures">
-					{{ $t('experimental') }}<template v-slot:desc>{{ $t('experimental-desc') }}</template>
+					{{ $t('experimental') }}<template #desc>{{ $t('experimental-desc') }}</template>
 				</ui-switch>
 			</section>
 		</ui-card>
diff --git a/src/client/app/desktop/views/components/user-list-timeline.vue b/src/client/app/desktop/views/components/user-list-timeline.vue
index 1870a8abb7..6fc75d73fc 100644
--- a/src/client/app/desktop/views/components/user-list-timeline.vue
+++ b/src/client/app/desktop/views/components/user-list-timeline.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')">
-		<template v-slot:header>
+		<template #header>
 			<slot></slot>
 		</template>
 	</mk-notes>
diff --git a/src/client/app/desktop/views/components/user-list-window.vue b/src/client/app/desktop/views/components/user-list-window.vue
index 38afb2c51c..afece9fe86 100644
--- a/src/client/app/desktop/views/components/user-list-window.vue
+++ b/src/client/app/desktop/views/components/user-list-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" width="450px" height="500px" @closed="destroyDom">
-	<template v-slot:header><fa icon="list"/> {{ list.title }}</template>
+	<template #header><fa icon="list"/> {{ list.title }}</template>
 
 	<x-editor :list="list"/>
 </mk-window>
diff --git a/src/client/app/desktop/views/components/user-lists-window.vue b/src/client/app/desktop/views/components/user-lists-window.vue
index 79e94d9738..4f0af4a278 100644
--- a/src/client/app/desktop/views/components/user-lists-window.vue
+++ b/src/client/app/desktop/views/components/user-lists-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" width="450px" height="500px" @closed="destroyDom">
-	<template v-slot:header><fa icon="list"/> {{ $t('title') }}</template>
+	<template #header><fa icon="list"/> {{ $t('title') }}</template>
 
 	<div class="xkxvokkjlptzyewouewmceqcxhpgzprp">
 		<button class="ui" @click="add">{{ $t('create-list') }}</button>
diff --git a/src/client/app/desktop/views/deck/deck.direct-column.vue b/src/client/app/desktop/views/deck/deck.direct-column.vue
index 6b42c89230..c68a361a9f 100644
--- a/src/client/app/desktop/views/deck/deck.direct-column.vue
+++ b/src/client/app/desktop/views/deck/deck.direct-column.vue
@@ -1,6 +1,6 @@
 <template>
 <x-column :name="name" :column="column" :is-stacked="isStacked">
-	<template v-slot:header><fa :icon="['far', 'envelope']"/>{{ name }}</template>
+	<template #header><fa :icon="['far', 'envelope']"/>{{ name }}</template>
 
 	<x-direct/>
 </x-column>
diff --git a/src/client/app/desktop/views/deck/deck.explore-column.vue b/src/client/app/desktop/views/deck/deck.explore-column.vue
index 760a8e449f..53db677b37 100644
--- a/src/client/app/desktop/views/deck/deck.explore-column.vue
+++ b/src/client/app/desktop/views/deck/deck.explore-column.vue
@@ -1,6 +1,6 @@
 <template>
 <x-column>
-	<template v-slot:header>
+	<template #header>
 		<fa :icon="faHashtag"/>{{ $t('@.explore') }}
 	</template>
 
diff --git a/src/client/app/desktop/views/deck/deck.favorites-column.vue b/src/client/app/desktop/views/deck/deck.favorites-column.vue
index 585e3e46e8..67610f8b9f 100644
--- a/src/client/app/desktop/views/deck/deck.favorites-column.vue
+++ b/src/client/app/desktop/views/deck/deck.favorites-column.vue
@@ -1,6 +1,6 @@
 <template>
 <x-column>
-	<template v-slot:header>
+	<template #header>
 		<fa :icon="['fa', 'star']"/>{{ $t('favorites') }}
 	</template>
 
diff --git a/src/client/app/desktop/views/deck/deck.featured-column.vue b/src/client/app/desktop/views/deck/deck.featured-column.vue
index 9db3ba0398..776957cc4d 100644
--- a/src/client/app/desktop/views/deck/deck.featured-column.vue
+++ b/src/client/app/desktop/views/deck/deck.featured-column.vue
@@ -1,6 +1,6 @@
 <template>
 <x-column>
-	<template v-slot:header>
+	<template #header>
 		<fa :icon="faNewspaper"/>{{ $t('@.featured-notes') }}
 	</template>
 
diff --git a/src/client/app/desktop/views/deck/deck.hashtag-column.vue b/src/client/app/desktop/views/deck/deck.hashtag-column.vue
index 43175f98af..db67df5305 100644
--- a/src/client/app/desktop/views/deck/deck.hashtag-column.vue
+++ b/src/client/app/desktop/views/deck/deck.hashtag-column.vue
@@ -1,6 +1,6 @@
 <template>
 <x-column>
-	<template v-slot:header>
+	<template #header>
 		<fa icon="hashtag"/><span>{{ tag }}</span>
 	</template>
 
diff --git a/src/client/app/desktop/views/deck/deck.mentions-column.vue b/src/client/app/desktop/views/deck/deck.mentions-column.vue
index 920d730e83..b7f3290d0d 100644
--- a/src/client/app/desktop/views/deck/deck.mentions-column.vue
+++ b/src/client/app/desktop/views/deck/deck.mentions-column.vue
@@ -1,6 +1,6 @@
 <template>
 <x-column :name="name" :column="column" :is-stacked="isStacked">
-	<template v-slot:header><fa icon="at"/>{{ name }}</template>
+	<template #header><fa icon="at"/>{{ name }}</template>
 
 	<x-mentions ref="tl"/>
 </x-column>
diff --git a/src/client/app/desktop/views/deck/deck.note-column.vue b/src/client/app/desktop/views/deck/deck.note-column.vue
index 4ede6a00dd..5c5022e30b 100644
--- a/src/client/app/desktop/views/deck/deck.note-column.vue
+++ b/src/client/app/desktop/views/deck/deck.note-column.vue
@@ -1,6 +1,6 @@
 <template>
 <x-column>
-	<template v-slot:header>
+	<template #header>
 		<fa :icon="['far', 'comment-alt']"/><mk-user-name :user="note.user" v-if="note"/>
 	</template>
 
diff --git a/src/client/app/desktop/views/deck/deck.notifications-column.vue b/src/client/app/desktop/views/deck/deck.notifications-column.vue
index 7ec7a4df76..c81c8b7733 100644
--- a/src/client/app/desktop/views/deck/deck.notifications-column.vue
+++ b/src/client/app/desktop/views/deck/deck.notifications-column.vue
@@ -1,6 +1,6 @@
 <template>
 <x-column :name="name" :column="column" :is-stacked="isStacked">
-	<template v-slot:header><fa :icon="['far', 'bell']"/>{{ name }}</template>
+	<template #header><fa :icon="['far', 'bell']"/>{{ name }}</template>
 
 	<x-notifications/>
 </x-column>
diff --git a/src/client/app/desktop/views/deck/deck.search-column.vue b/src/client/app/desktop/views/deck/deck.search-column.vue
index 0e51c668c8..fb0ba5f6e4 100644
--- a/src/client/app/desktop/views/deck/deck.search-column.vue
+++ b/src/client/app/desktop/views/deck/deck.search-column.vue
@@ -1,6 +1,6 @@
 <template>
 <x-column>
-	<template v-slot:header>
+	<template #header>
 		<fa icon="search"/><span>{{ q }}</span>
 	</template>
 
diff --git a/src/client/app/desktop/views/deck/deck.tl-column.vue b/src/client/app/desktop/views/deck/deck.tl-column.vue
index b92aa729b9..973dad66e1 100644
--- a/src/client/app/desktop/views/deck/deck.tl-column.vue
+++ b/src/client/app/desktop/views/deck/deck.tl-column.vue
@@ -1,6 +1,6 @@
 <template>
 <x-column :menu="menu" :name="name" :column="column" :is-stacked="isStacked">
-	<template v-slot:header>
+	<template #header>
 		<fa v-if="column.type == 'home'" icon="home"/>
 		<fa v-if="column.type == 'local'" :icon="['far', 'comments']"/>
 		<fa v-if="column.type == 'hybrid'" icon="share-alt"/>
diff --git a/src/client/app/desktop/views/deck/deck.user-column.home.vue b/src/client/app/desktop/views/deck/deck.user-column.home.vue
index e02eb3cc69..90fd2f5a09 100644
--- a/src/client/app/desktop/views/deck/deck.user-column.home.vue
+++ b/src/client/app/desktop/views/deck/deck.user-column.home.vue
@@ -1,13 +1,13 @@
 <template>
 <div>
 	<ui-container v-if="user.pinnedNotes && user.pinnedNotes.length > 0" :body-togglable="true">
-		<template v-slot:header><fa icon="thumbtack"/> {{ $t('pinned-notes') }}</template>
+		<template #header><fa icon="thumbtack"/> {{ $t('pinned-notes') }}</template>
 		<div>
 			<x-note v-for="n in user.pinnedNotes" :key="n.id" :note="n" :mini="true"/>
 		</div>
 	</ui-container>
 	<ui-container v-if="images.length > 0" :body-togglable="true">
-		<template v-slot:header><fa :icon="['far', 'images']"/> {{ $t('images') }}</template>
+		<template #header><fa :icon="['far', 'images']"/> {{ $t('images') }}</template>
 		<div class="sainvnaq">
 			<router-link v-for="image in images"
 				:style="`background-image: url(${image.thumbnailUrl})`"
@@ -18,13 +18,13 @@
 		</div>
 	</ui-container>
 	<ui-container :body-togglable="true">
-		<template v-slot:header><fa :icon="['far', 'chart-bar']"/> {{ $t('activity') }}</template>
+		<template #header><fa :icon="['far', 'chart-bar']"/> {{ $t('activity') }}</template>
 		<div>
 			<div ref="chart"></div>
 		</div>
 	</ui-container>
 	<ui-container>
-		<template v-slot:header><fa :icon="['far', 'comment-alt']"/> {{ $t('timeline') }}</template>
+		<template #header><fa :icon="['far', 'comment-alt']"/> {{ $t('timeline') }}</template>
 		<div>
 			<x-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/>
 		</div>
diff --git a/src/client/app/desktop/views/deck/deck.user-column.vue b/src/client/app/desktop/views/deck/deck.user-column.vue
index 3207539650..0024a78098 100644
--- a/src/client/app/desktop/views/deck/deck.user-column.vue
+++ b/src/client/app/desktop/views/deck/deck.user-column.vue
@@ -1,6 +1,6 @@
 <template>
 <x-column>
-	<template v-slot:header>
+	<template #header>
 		<fa icon="user"/><mk-user-name :user="user" v-if="user"/>
 	</template>
 
diff --git a/src/client/app/desktop/views/deck/deck.widgets-column.vue b/src/client/app/desktop/views/deck/deck.widgets-column.vue
index 8cdadb69c1..9c5619cc2d 100644
--- a/src/client/app/desktop/views/deck/deck.widgets-column.vue
+++ b/src/client/app/desktop/views/deck/deck.widgets-column.vue
@@ -1,6 +1,6 @@
 <template>
 <x-column :menu="menu" :naked="true" :narrow="true" :name="name" :column="column" :is-stacked="isStacked" class="wtdtxvecapixsepjtcupubtsmometobz">
-	<template v-slot:header><fa icon="calculator"/>{{ name }}</template>
+	<template #header><fa icon="calculator"/>{{ name }}</template>
 
 	<div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq">
 		<template v-if="edit">
diff --git a/src/client/app/desktop/views/home/search.vue b/src/client/app/desktop/views/home/search.vue
index 978bf0a939..1632e730d3 100644
--- a/src/client/app/desktop/views/home/search.vue
+++ b/src/client/app/desktop/views/home/search.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<mk-notes ref="timeline" :make-promise="makePromise" @inited="inited">
-		<template v-slot:header>
+		<template #header>
 			<header class="oxgbmvii">
 				<span><fa icon="search"/> {{ q }}</span>
 			</header>
diff --git a/src/client/app/desktop/views/home/tag.vue b/src/client/app/desktop/views/home/tag.vue
index 27f45d0c7c..4f9bc66e7b 100644
--- a/src/client/app/desktop/views/home/tag.vue
+++ b/src/client/app/desktop/views/home/tag.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<mk-notes ref="timeline" :make-promise="makePromise" @inited="inited">
-		<template v-slot:header>
+		<template #header>
 			<header class="wqraeznr">
 				<span><fa icon="hashtag"/> {{ $route.params.tag }}</span>
 			</header>
diff --git a/src/client/app/desktop/views/home/timeline.core.vue b/src/client/app/desktop/views/home/timeline.core.vue
index 4d0b01d616..a49fc74d8e 100644
--- a/src/client/app/desktop/views/home/timeline.core.vue
+++ b/src/client/app/desktop/views/home/timeline.core.vue
@@ -1,14 +1,14 @@
 <template>
 <div>
 	<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')">
-		<template v-slot:header>
+		<template #header>
 			<slot></slot>
 			<div v-if="src == 'home' && alone" class="ibpylqas">
 				<p>{{ $t('@.empty-timeline-info.follow-users-to-make-your-timeline') }}</p>
 				<router-link to="/explore">{{ $t('@.empty-timeline-info.explore') }}</router-link>
 			</div>
 		</template>
-		<template v-slot:empty>
+		<template #empty>
 			<fa :icon="['far', 'comments']"/>{{ $t('empty') }}
 		</template>
 	</mk-notes>
diff --git a/src/client/app/desktop/views/home/user/user.home.vue b/src/client/app/desktop/views/home/user/user.home.vue
index 979d40059f..b19a02e046 100644
--- a/src/client/app/desktop/views/home/user/user.home.vue
+++ b/src/client/app/desktop/views/home/user/user.home.vue
@@ -5,7 +5,7 @@
 	<!--<mk-calendar @chosen="warp" :start="new Date(user.createdAt)"/>-->
 	<div class="activity">
 		<ui-container :body-togglable="true">
-			<template v-slot:header><fa icon="chart-bar"/>{{ $t('activity') }}</template>
+			<template #header><fa icon="chart-bar"/>{{ $t('activity') }}</template>
 			<x-activity :user="user" :limit="35" style="padding: 16px;"/>
 		</ui-container>
 	</div>
diff --git a/src/client/app/desktop/views/home/user/user.photos.vue b/src/client/app/desktop/views/home/user/user.photos.vue
index 37512a76b7..f1f29be47a 100644
--- a/src/client/app/desktop/views/home/user/user.photos.vue
+++ b/src/client/app/desktop/views/home/user/user.photos.vue
@@ -1,6 +1,6 @@
 <template>
 <ui-container :body-togglable="true">
-	<template v-slot:header><fa icon="camera"/> {{ $t('title') }}</template>
+	<template #header><fa icon="camera"/> {{ $t('title') }}</template>
 
 	<div class="dzsuvbsrrrwobdxifudxuefculdfiaxd">
 		<p class="initializing" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
diff --git a/src/client/app/desktop/views/home/user/user.timeline.vue b/src/client/app/desktop/views/home/user/user.timeline.vue
index 12caa97d02..1c5fa0cff7 100644
--- a/src/client/app/desktop/views/home/user/user.timeline.vue
+++ b/src/client/app/desktop/views/home/user/user.timeline.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')">
-		<template v-slot:header>
+		<template #header>
 			<header class="oh5y2r7l5lx8j6jj791ykeiwgihheguk">
 				<span :data-active="mode == 'default'" @click="mode = 'default'"><fa :icon="['far', 'comment-alt']"/> {{ $t('default') }}</span>
 				<span :data-active="mode == 'with-replies'" @click="mode = 'with-replies'"><fa icon="comments"/> {{ $t('with-replies') }}</span>
@@ -9,7 +9,7 @@
 				<span :data-active="mode == 'my-posts'" @click="mode = 'my-posts'"><fa icon="user"/> {{ $t('my-posts') }}</span>
 			</header>
 		</template>
-		<template v-slot:empty><fa :icon="['far', 'comments']"/>{{ $t('empty') }}</template>
+		<template #empty><fa :icon="['far', 'comments']"/>{{ $t('empty') }}</template>
 	</mk-notes>
 </div>
 </template>
diff --git a/src/client/app/desktop/views/widgets/messaging.vue b/src/client/app/desktop/views/widgets/messaging.vue
index 7c51352266..1cb4f0a670 100644
--- a/src/client/app/desktop/views/widgets/messaging.vue
+++ b/src/client/app/desktop/views/widgets/messaging.vue
@@ -1,8 +1,8 @@
 <template>
 <div class="mkw-messaging">
 	<ui-container :show-header="props.design == 0">
-		<template v-slot:header><fa icon="comments"/>{{ $t('title') }}</template>
-		<template v-slot:func><button @click="add"><fa icon="plus"/></button></template>
+		<template #header><fa icon="comments"/>{{ $t('title') }}</template>
+		<template #func><button @click="add"><fa icon="plus"/></button></template>
 
 		<x-messaging ref="index" compact @navigate="navigate"/>
 	</ui-container>
diff --git a/src/client/app/desktop/views/widgets/notifications.vue b/src/client/app/desktop/views/widgets/notifications.vue
index 6e124498bc..2eaa6a2fef 100644
--- a/src/client/app/desktop/views/widgets/notifications.vue
+++ b/src/client/app/desktop/views/widgets/notifications.vue
@@ -1,8 +1,8 @@
 <template>
 <div class="mkw-notifications">
 	<ui-container :show-header="!props.compact">
-		<template v-slot:header><fa :icon="['far', 'bell']"/>{{ $t('title') }}</template>
-		<!-- <button v-slot:func :title="$t('title')" @click="settings"><fa icon="cog"/></button> -->
+		<template #header><fa :icon="['far', 'bell']"/>{{ $t('title') }}</template>
+		<!-- <button #func :title="$t('title')" @click="settings"><fa icon="cog"/></button> -->
 
 		<mk-notifications :class="$style.notifications"/>
 	</ui-container>
diff --git a/src/client/app/desktop/views/widgets/polls.vue b/src/client/app/desktop/views/widgets/polls.vue
index 3b34a1ca03..3567cae5ed 100644
--- a/src/client/app/desktop/views/widgets/polls.vue
+++ b/src/client/app/desktop/views/widgets/polls.vue
@@ -1,8 +1,8 @@
 <template>
 <div class="mkw-polls">
 	<ui-container :show-header="!props.compact">
-		<template v-slot:header><fa icon="chart-pie"/>{{ $t('title') }}</template>
-		<template v-slot:func>
+		<template #header><fa icon="chart-pie"/>{{ $t('title') }}</template>
+		<template #func>
 			<button :title="$t('title')" @click="fetch">
 				<fa v-if="!fetching && more" icon="arrow-right"/>
 				<fa v-if="!fetching && !more" icon="sync"/>
diff --git a/src/client/app/desktop/views/widgets/post-form.vue b/src/client/app/desktop/views/widgets/post-form.vue
index 856f66134e..3fcf811eb2 100644
--- a/src/client/app/desktop/views/widgets/post-form.vue
+++ b/src/client/app/desktop/views/widgets/post-form.vue
@@ -1,7 +1,7 @@
 <template>
 <div>
 	<ui-container :show-header="props.design == 0">
-		<template v-slot:header><fa icon="pencil-alt"/>{{ $t('title') }}</template>
+		<template #header><fa icon="pencil-alt"/>{{ $t('title') }}</template>
 
 		<div class="lhcuptdmcdkfwmipgazeawoiuxpzaclc-body"
 			@dragover.stop="onDragover"
diff --git a/src/client/app/desktop/views/widgets/trends.vue b/src/client/app/desktop/views/widgets/trends.vue
index 0bcdff607a..c512945895 100644
--- a/src/client/app/desktop/views/widgets/trends.vue
+++ b/src/client/app/desktop/views/widgets/trends.vue
@@ -1,8 +1,8 @@
 <template>
 <div class="mkw-trends">
 	<ui-container :show-header="!props.compact">
-		<template v-slot:header><fa icon="fire"/>{{ $t('title') }}</template>
-		<template v-slot:func><button :title="$t('title')" @click="fetch"><fa icon="sync"/></button></template>
+		<template #header><fa icon="fire"/>{{ $t('title') }}</template>
+		<template #func><button :title="$t('title')" @click="fetch"><fa icon="sync"/></button></template>
 
 		<div class="mkw-trends--body">
 			<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
diff --git a/src/client/app/desktop/views/widgets/users.vue b/src/client/app/desktop/views/widgets/users.vue
index 3f4c83b843..85902fc20c 100644
--- a/src/client/app/desktop/views/widgets/users.vue
+++ b/src/client/app/desktop/views/widgets/users.vue
@@ -1,8 +1,8 @@
 <template>
 <div class="mkw-users">
 	<ui-container :show-header="!props.compact">
-		<template v-slot:header><fa icon="users"/>{{ $t('title') }}</template>
-		<template v-slot:func>
+		<template #header><fa icon="users"/>{{ $t('title') }}</template>
+		<template #func>
 			<button :title="$t('title')" @click="refresh">
 				<fa v-if="!fetching && more" icon="arrow-right"/>
 				<fa v-if="!fetching && !more" icon="sync"/>
diff --git a/src/client/app/mobile/views/components/ui.vue b/src/client/app/mobile/views/components/ui.vue
index 43462b9865..6cd42b0207 100644
--- a/src/client/app/mobile/views/components/ui.vue
+++ b/src/client/app/mobile/views/components/ui.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="mk-ui">
 	<x-header>
-		<template v-slot:func><slot name="func"></slot></template>
+		<template #func><slot name="func"></slot></template>
 		<slot name="header"></slot>
 	</x-header>
 	<x-nav :is-open="isDrawerOpening"/>
diff --git a/src/client/app/mobile/views/components/user-timeline.vue b/src/client/app/mobile/views/components/user-timeline.vue
index dffc16efc5..b6981168b6 100644
--- a/src/client/app/mobile/views/components/user-timeline.vue
+++ b/src/client/app/mobile/views/components/user-timeline.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="mk-user-timeline">
 	<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')">
-		<template v-slot:empty>
+		<template #empty>
 			<fa :icon="['far', 'comments']"/>
 			{{ withMedia ? this.$t('no-notes-with-media') : this.$t('no-notes') }}
 		</template>
diff --git a/src/client/app/mobile/views/pages/drive.vue b/src/client/app/mobile/views/pages/drive.vue
index bf2134ff86..d2f51dc899 100644
--- a/src/client/app/mobile/views/pages/drive.vue
+++ b/src/client/app/mobile/views/pages/drive.vue
@@ -1,11 +1,11 @@
 <template>
 <mk-ui>
-	<template v-slot:header>
+	<template #header>
 		<template v-if="folder"><span style="margin-right:4px;"><fa :icon="['far', 'folder-open']"/></span>{{ folder.name }}</template>
 		<template v-if="file"><mk-file-type-icon data-icon :type="file.type" style="margin-right:4px;"/>{{ file.name }}</template>
 		<template v-if="!folder && !file"><span style="margin-right:4px;"><fa icon="cloud"/></span>{{ $t('@.drive') }}</template>
 	</template>
-	<template v-slot:func><button @click="fn"><fa icon="ellipsis-h"/></button></template>
+	<template #func><button @click="fn"><fa icon="ellipsis-h"/></button></template>
 	<x-drive
 		ref="browser"
 		:init-folder="initFolder"
diff --git a/src/client/app/mobile/views/pages/explore.vue b/src/client/app/mobile/views/pages/explore.vue
index 742d4c4724..111721bc8a 100644
--- a/src/client/app/mobile/views/pages/explore.vue
+++ b/src/client/app/mobile/views/pages/explore.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header><span style="margin-right:4px;"><fa :icon="faHashtag"/></span>{{ $t('@.explore') }}</template>
+	<template #header><span style="margin-right:4px;"><fa :icon="faHashtag"/></span>{{ $t('@.explore') }}</template>
 
 	<main>
 		<x-explore v-bind="$attrs"/>
diff --git a/src/client/app/mobile/views/pages/favorites.vue b/src/client/app/mobile/views/pages/favorites.vue
index a7a6e8cb05..e8e7ee9ab5 100644
--- a/src/client/app/mobile/views/pages/favorites.vue
+++ b/src/client/app/mobile/views/pages/favorites.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header><span style="margin-right:4px;"><fa icon="star"/></span>{{ $t('title') }}</template>
+	<template #header><span style="margin-right:4px;"><fa icon="star"/></span>{{ $t('title') }}</template>
 
 	<main>
 		<sequential-entrance animation="entranceFromTop" delay="25">
diff --git a/src/client/app/mobile/views/pages/featured.vue b/src/client/app/mobile/views/pages/featured.vue
index 94d8071043..684b79f8b9 100644
--- a/src/client/app/mobile/views/pages/featured.vue
+++ b/src/client/app/mobile/views/pages/featured.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header><span style="margin-right:4px;"><fa :icon="faNewspaper"/></span>{{ $t('@.featured-notes') }}</template>
+	<template #header><span style="margin-right:4px;"><fa :icon="faNewspaper"/></span>{{ $t('@.featured-notes') }}</template>
 
 	<main>
 		<sequential-entrance animation="entranceFromTop" delay="25">
diff --git a/src/client/app/mobile/views/pages/games/reversi.vue b/src/client/app/mobile/views/pages/games/reversi.vue
index 8b037f89b3..c67e3fadd1 100644
--- a/src/client/app/mobile/views/pages/games/reversi.vue
+++ b/src/client/app/mobile/views/pages/games/reversi.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header><span style="margin-right:4px;"><fa icon="gamepad"/></span>{{ $t('reversi') }}</template>
+	<template #header><span style="margin-right:4px;"><fa icon="gamepad"/></span>{{ $t('reversi') }}</template>
 	<x-reversi :game-id="$route.params.game" @nav="nav" :self-nav="false"/>
 </mk-ui>
 </template>
diff --git a/src/client/app/mobile/views/pages/home.timeline.vue b/src/client/app/mobile/views/pages/home.timeline.vue
index 20ee625204..8d92056608 100644
--- a/src/client/app/mobile/views/pages/home.timeline.vue
+++ b/src/client/app/mobile/views/pages/home.timeline.vue
@@ -8,7 +8,7 @@
 	</ui-container>
 
 	<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')">
-		<template v-slot:empty>
+		<template #empty>
 			<fa :icon="['far', 'comments']"/>{{ $t('empty') }}
 		</template>
 	</mk-notes>
diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue
index 1ea5d8d74b..59fae2340b 100644
--- a/src/client/app/mobile/views/pages/home.vue
+++ b/src/client/app/mobile/views/pages/home.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header>
+	<template #header>
 		<span @click="showNav = true">
 			<span :class="$style.title">
 				<span v-if="src == 'home'"><fa icon="home"/>{{ $t('home') }}</span>
@@ -20,7 +20,7 @@
 		</span>
 	</template>
 
-	<template v-slot:func>
+	<template #func>
 		<button @click="fn"><fa icon="pencil-alt"/></button>
 	</template>
 
diff --git a/src/client/app/mobile/views/pages/messaging-room.vue b/src/client/app/mobile/views/pages/messaging-room.vue
index 3bb479fdfc..aa00d48699 100644
--- a/src/client/app/mobile/views/pages/messaging-room.vue
+++ b/src/client/app/mobile/views/pages/messaging-room.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header>
+	<template #header>
 		<template v-if="user"><span style="margin-right:4px;"><fa :icon="['far', 'comments']"/></span><mk-user-name :user="user"/></template>
 		<template v-else><mk-ellipsis/></template>
 	</template>
diff --git a/src/client/app/mobile/views/pages/messaging.vue b/src/client/app/mobile/views/pages/messaging.vue
index 40914e9d3f..5ce2f14bbd 100644
--- a/src/client/app/mobile/views/pages/messaging.vue
+++ b/src/client/app/mobile/views/pages/messaging.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header><span style="margin-right:4px;"><fa :icon="['far', 'comments']"/></span>{{ $t('@.messaging') }}</template>
+	<template #header><span style="margin-right:4px;"><fa :icon="['far', 'comments']"/></span>{{ $t('@.messaging') }}</template>
 	<x-messaging @navigate="navigate" :header-top="48"/>
 </mk-ui>
 </template>
diff --git a/src/client/app/mobile/views/pages/note.vue b/src/client/app/mobile/views/pages/note.vue
index e429a0f563..4277e3fe94 100644
--- a/src/client/app/mobile/views/pages/note.vue
+++ b/src/client/app/mobile/views/pages/note.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header><span style="margin-right:4px;"><fa :icon="['far', 'sticky-note']"/></span>{{ $t('title') }}</template>
+	<template #header><span style="margin-right:4px;"><fa :icon="['far', 'sticky-note']"/></span>{{ $t('title') }}</template>
 	<main v-if="!fetching">
 		<div>
 			<mk-note-detail :note="note"/>
diff --git a/src/client/app/mobile/views/pages/notifications.vue b/src/client/app/mobile/views/pages/notifications.vue
index 3a590e7d61..8472a623c1 100644
--- a/src/client/app/mobile/views/pages/notifications.vue
+++ b/src/client/app/mobile/views/pages/notifications.vue
@@ -1,7 +1,7 @@
 <template>
 <mk-ui>
-	<template v-slot:header><span style="margin-right:4px;"><fa :icon="['far', 'bell']"/></span>{{ $t('notifications') }}</template>
-	<template v-slot:func><button @click="fn"><fa icon="check"/></button></template>
+	<template #header><span style="margin-right:4px;"><fa :icon="['far', 'bell']"/></span>{{ $t('notifications') }}</template>
+	<template #func><button @click="fn"><fa icon="check"/></button></template>
 
 	<main>
 		<mk-notifications @fetched="onFetched"/>
diff --git a/src/client/app/mobile/views/pages/received-follow-requests.vue b/src/client/app/mobile/views/pages/received-follow-requests.vue
index 0754163493..abf0c33830 100644
--- a/src/client/app/mobile/views/pages/received-follow-requests.vue
+++ b/src/client/app/mobile/views/pages/received-follow-requests.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header><fa :icon="['far', 'envelope']"/>{{ $t('title') }}</template>
+	<template #header><fa :icon="['far', 'envelope']"/>{{ $t('title') }}</template>
 
 	<main>
 		<div v-for="req in requests">
diff --git a/src/client/app/mobile/views/pages/search.vue b/src/client/app/mobile/views/pages/search.vue
index 8525afd743..9e4be82041 100644
--- a/src/client/app/mobile/views/pages/search.vue
+++ b/src/client/app/mobile/views/pages/search.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header><fa icon="search"/> {{ q }}</template>
+	<template #header><fa icon="search"/> {{ q }}</template>
 
 	<main>
 		<mk-notes ref="timeline" :make-promise="makePromise" @inited="inited"/>
diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue
index 2aab21dd23..4a1e18540c 100644
--- a/src/client/app/mobile/views/pages/settings.vue
+++ b/src/client/app/mobile/views/pages/settings.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header><span style="margin-right:4px;"><fa icon="cog"/></span>{{ $t('settings') }}</template>
+	<template #header><span style="margin-right:4px;"><fa icon="cog"/></span>{{ $t('settings') }}</template>
 	<main>
 		<div class="signed-in-as">
 			<mfm :text="$t('signed-in-as').replace('{}', name)" :should-break="false" :plain-text="true" :custom-emojis="$store.state.i.emojis"/>
@@ -11,7 +11,7 @@
 			<x-theme/>
 
 			<ui-card>
-				<template v-slot:title><fa icon="poll-h"/> {{ $t('design') }}</template>
+				<template #title><fa icon="poll-h"/> {{ $t('design') }}</template>
 
 				<section>
 					<ui-switch v-model="darkmode">{{ $t('dark-mode') }}</ui-switch>
@@ -63,7 +63,7 @@
 			</ui-card>
 
 			<ui-card>
-				<template v-slot:title><fa icon="sliders-h"/> {{ $t('behavior') }}</template>
+				<template #title><fa icon="sliders-h"/> {{ $t('behavior') }}</template>
 
 				<section>
 					<ui-switch v-model="fetchOnScroll">{{ $t('fetch-on-scroll') }}</ui-switch>
@@ -93,7 +93,7 @@
 
 				<section>
 					<header>{{ $t('web-search-engine') }}</header>
-					<ui-input v-model="webSearchEngine">{{ $t('web-search-engine') }}<template v-slot:desc>{{ $t('web-search-engine-desc') }}</template></ui-input>
+					<ui-input v-model="webSearchEngine">{{ $t('web-search-engine') }}<template #desc>{{ $t('web-search-engine-desc') }}</template></ui-input>
 				</section>
 			</ui-card>
 
@@ -104,7 +104,7 @@
 			<x-mute-and-block/>
 
 			<ui-card>
-				<template v-slot:title><fa icon="volume-up"/> {{ $t('sound') }}</template>
+				<template #title><fa icon="volume-up"/> {{ $t('sound') }}</template>
 
 				<section>
 					<ui-switch v-model="enableSounds">{{ $t('enable-sounds') }}</ui-switch>
@@ -118,14 +118,14 @@
 			<x-api-settings />
 
 			<ui-card>
-				<template v-slot:title><fa icon="unlock-alt"/> {{ $t('password') }}</template>
+				<template #title><fa icon="unlock-alt"/> {{ $t('password') }}</template>
 				<section>
 					<x-password-settings/>
 				</section>
 			</ui-card>
 
 			<ui-card>
-				<template v-slot:title><fa icon="sync-alt"/> {{ $t('update') }}</template>
+				<template #title><fa icon="sync-alt"/> {{ $t('update') }}</template>
 
 				<section>
 					<div>{{ $t('version') }} <i>{{ version }}</i></div>
diff --git a/src/client/app/mobile/views/pages/tag.vue b/src/client/app/mobile/views/pages/tag.vue
index 37f632291b..318e63a473 100644
--- a/src/client/app/mobile/views/pages/tag.vue
+++ b/src/client/app/mobile/views/pages/tag.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header><span style="margin-right:4px;"><fa icon="hashtag"/></span>{{ $route.params.tag }}</template>
+	<template #header><span style="margin-right:4px;"><fa icon="hashtag"/></span>{{ $route.params.tag }}</template>
 
 	<main>
 		<mk-notes ref="timeline" :make-promise="makePromise" @inited="inited"/>
diff --git a/src/client/app/mobile/views/pages/user-list.vue b/src/client/app/mobile/views/pages/user-list.vue
index 289054877d..874bae5d18 100644
--- a/src/client/app/mobile/views/pages/user-list.vue
+++ b/src/client/app/mobile/views/pages/user-list.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header v-if="!fetching"><fa icon="list"/>{{ list.title }}</template>
+	<template #header v-if="!fetching"><fa icon="list"/>{{ list.title }}</template>
 
 	<main v-if="!fetching">
 		<x-editor :list="list"/>
diff --git a/src/client/app/mobile/views/pages/user-lists.vue b/src/client/app/mobile/views/pages/user-lists.vue
index fcbbd4d372..fd129339fd 100644
--- a/src/client/app/mobile/views/pages/user-lists.vue
+++ b/src/client/app/mobile/views/pages/user-lists.vue
@@ -1,7 +1,7 @@
 <template>
 <mk-ui>
-	<template v-slot:header><fa icon="list"/>{{ $t('title') }}</template>
-	<template v-slot:func><button @click="fn"><fa icon="plus"/></button></template>
+	<template #header><fa icon="list"/>{{ $t('title') }}</template>
+	<template #func><button @click="fn"><fa icon="plus"/></button></template>
 
 	<main>
 		<ul>
diff --git a/src/client/app/mobile/views/pages/user/index.vue b/src/client/app/mobile/views/pages/user/index.vue
index 2907ed455f..57d9d2d812 100644
--- a/src/client/app/mobile/views/pages/user/index.vue
+++ b/src/client/app/mobile/views/pages/user/index.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-ui>
-	<template v-slot:header v-if="!fetching"><img :src="avator" alt="">
+	<template #header v-if="!fetching"><img :src="avator" alt="">
 		<mk-user-name :user="user"/>
 	</template>
 	<div class="wwtwuxyh" v-if="!fetching">
diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue
index aacb08b489..7722104aff 100644
--- a/src/client/app/mobile/views/pages/widgets.vue
+++ b/src/client/app/mobile/views/pages/widgets.vue
@@ -1,7 +1,7 @@
 <template>
 <mk-ui>
-	<template v-slot:header><span style="margin-right:4px;"><fa icon="home"/></span>{{ $t('dashboard') }}</template>
-	<template v-slot:func>
+	<template #header><span style="margin-right:4px;"><fa icon="home"/></span>{{ $t('dashboard') }}</template>
+	<template #func>
 		<button @click="customizing = !customizing"><fa icon="cog"/></button>
 	</template>
 	<main>
diff --git a/src/client/app/mobile/views/widgets/activity.vue b/src/client/app/mobile/views/widgets/activity.vue
index 8f50d14a7c..047784deac 100644
--- a/src/client/app/mobile/views/widgets/activity.vue
+++ b/src/client/app/mobile/views/widgets/activity.vue
@@ -1,7 +1,7 @@
 <template>
 <div class="mkw-activity">
 	<ui-container :show-header="!props.compact">
-		<template v-slot:header><fa icon="chart-bar"/>{{ $t('activity') }}</template>
+		<template #header><fa icon="chart-bar"/>{{ $t('activity') }}</template>
 		<div :class="$style.body">
 			<x-activity :user="$store.state.i"/>
 		</div>
diff --git a/src/client/app/test/views/index.vue b/src/client/app/test/views/index.vue
index f1df2d8ed6..e0725d42a7 100644
--- a/src/client/app/test/views/index.vue
+++ b/src/client/app/test/views/index.vue
@@ -1,7 +1,7 @@
 <template>
 <main>
 	<ui-card>
-		<template v-slot:title>MFM Playground</template>
+		<template #title>MFM Playground</template>
 		<section class="fit-top">
 			<ui-textarea v-model="mfm">
 				<span>MFM</span>
@@ -18,7 +18,7 @@
 	</ui-card>
 
 	<ui-card>
-		<template v-slot:title>Dialog Generator</template>
+		<template #title>Dialog Generator</template>
 		<section class="fit-top">
 			<ui-select v-model="dialogType" placeholder="">
 				<option value="info">Information</option>