From 9384f5399da39e53855beb8e7f8ded1aa56bf72e Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Tue, 27 Dec 2022 14:36:33 +0900
Subject: rename: client -> frontend

---
 .../frontend/src/components/MkFileListForAdmin.vue | 117 +++++++++++++++++++++
 1 file changed, 117 insertions(+)
 create mode 100644 packages/frontend/src/components/MkFileListForAdmin.vue

(limited to 'packages/frontend/src/components/MkFileListForAdmin.vue')

diff --git a/packages/frontend/src/components/MkFileListForAdmin.vue b/packages/frontend/src/components/MkFileListForAdmin.vue
new file mode 100644
index 0000000000..4910506a95
--- /dev/null
+++ b/packages/frontend/src/components/MkFileListForAdmin.vue
@@ -0,0 +1,117 @@
+<template>
+<div>
+	<MkPagination v-slot="{items}" :pagination="pagination" class="urempief" :class="{ grid: viewMode === 'grid' }">
+		<MkA
+			v-for="file in items"
+			:key="file.id"
+			v-tooltip.mfm="`${file.type}\n${bytes(file.size)}\n${new Date(file.createdAt).toLocaleString()}\nby ${file.user ? '@' + Acct.toString(file.user) : 'system'}`"
+			:to="`/admin/file/${file.id}`"
+			class="file _button"
+		>
+			<div v-if="file.isSensitive" class="sensitive-label">{{ i18n.ts.sensitive }}</div>
+			<MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/>
+			<div v-if="viewMode === 'list'" class="body">
+				<div>
+					<small style="opacity: 0.7;">{{ file.name }}</small>
+				</div>
+				<div>
+					<MkAcct v-if="file.user" :user="file.user"/>
+					<div v-else>{{ i18n.ts.system }}</div>
+				</div>
+				<div>
+					<span style="margin-right: 1em;">{{ file.type }}</span>
+					<span>{{ bytes(file.size) }}</span>
+				</div>
+				<div>
+					<span>{{ i18n.ts.registeredDate }}: <MkTime :time="file.createdAt" mode="detail"/></span>
+				</div>
+			</div>
+		</MkA>
+	</MkPagination>
+</div>
+</template>
+
+<script lang="ts" setup>
+import { computed } from 'vue';
+import * as Acct from 'misskey-js/built/acct';
+import MkPagination from '@/components/MkPagination.vue';
+import MkDriveFileThumbnail from '@/components/MkDriveFileThumbnail.vue';
+import bytes from '@/filters/bytes';
+import * as os from '@/os';
+import { i18n } from '@/i18n';
+
+const props = defineProps<{
+	pagination: any;
+	viewMode: 'grid' | 'list';
+}>();
+</script>
+
+<style lang="scss" scoped>
+@keyframes sensitive-blink {
+	0% { opacity: 1; }
+	50% { opacity: 0; }
+}
+
+.urempief {
+	margin-top: var(--margin);
+
+	&.list {
+		> .file {
+			display: flex;
+			width: 100%;
+			box-sizing: border-box;
+			text-align: left;
+			align-items: center;
+
+			&:hover {
+				color: var(--accent);
+			}
+
+			> .thumbnail {
+				width: 128px;
+				height: 128px;
+			}
+
+			> .body {
+				margin-left: 0.3em;
+				padding: 8px;
+				flex: 1;
+
+				@media (max-width: 500px) {
+					font-size: 14px;
+				}
+			}
+		}
+	}
+
+	&.grid {
+		display: grid;
+		grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
+		grid-gap: 12px;
+		margin: var(--margin) 0;
+
+		> .file {
+			position: relative;
+			aspect-ratio: 1;
+		
+			> .thumbnail {
+				width: 100%;
+				height: 100%;
+			}
+
+			> .sensitive-label {
+				position: absolute;
+				z-index: 10;
+				top: 8px;
+				left: 8px;
+				padding: 2px 4px;
+				background: #ff0000bf;
+				color: #fff;
+				border-radius: 4px;
+				font-size: 85%;
+				animation: sensitive-blink 1s infinite;
+			}
+		}
+	}
+}
+</style>
-- 
cgit v1.2.3-freya


From ada04c1932dd694af1775e562fdcfa2c506454de Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Tue, 27 Dec 2022 18:01:06 +0900
Subject: perf?(client): remove needless scoped annotation for style

---
 packages/frontend/src/components/MkAbuseReport.vue |  2 +-
 .../src/components/MkAbuseReportWindow.vue         |  2 +-
 packages/frontend/src/components/MkAnalogClock.vue |  2 +-
 .../frontend/src/components/MkAutocomplete.vue     |  2 +-
 packages/frontend/src/components/MkButton.vue      |  2 +-
 .../src/components/MkChannelFollowButton.vue       |  2 +-
 .../frontend/src/components/MkChannelPreview.vue   |  2 +-
 packages/frontend/src/components/MkChart.vue       |  2 +-
 .../frontend/src/components/MkChartTooltip.vue     |  2 +-
 packages/frontend/src/components/MkContainer.vue   |  2 +
 packages/frontend/src/components/MkContextMenu.vue | 10 ++--
 .../frontend/src/components/MkCropperDialog.vue    |  2 +
 packages/frontend/src/components/MkCwButton.vue    |  2 +-
 packages/frontend/src/components/MkDialog.vue      |  2 +-
 .../frontend/src/components/MkDigitalClock.vue     |  2 +-
 packages/frontend/src/components/MkDrive.file.vue  |  2 +-
 .../frontend/src/components/MkDrive.folder.vue     |  2 +-
 .../frontend/src/components/MkDrive.navFolder.vue  |  5 +-
 packages/frontend/src/components/MkDrive.vue       |  2 +-
 .../src/components/MkDriveFileThumbnail.vue        |  2 +-
 .../src/components/MkEmojiPicker.section.vue       |  2 +-
 packages/frontend/src/components/MkEmojiPicker.vue |  2 +-
 .../src/components/MkEmojiPickerDialog.vue         |  2 +-
 .../src/components/MkEmojiPickerWindow.vue         |  5 +-
 .../frontend/src/components/MkFeaturedPhotos.vue   |  2 +-
 .../frontend/src/components/MkFileListForAdmin.vue |  2 +
 packages/frontend/src/components/MkFolder.vue      | 12 +++++
 .../frontend/src/components/MkFollowButton.vue     |  2 +-
 .../frontend/src/components/MkForgotPassword.vue   |  5 +-
 packages/frontend/src/components/MkFormDialog.vue  |  2 +-
 .../src/components/MkGalleryPostPreview.vue        |  2 +-
 packages/frontend/src/components/MkGoogle.vue      |  2 +-
 packages/frontend/src/components/MkImageViewer.vue |  2 +-
 .../frontend/src/components/MkImgWithBlurhash.vue  |  2 +-
 packages/frontend/src/components/MkInfo.vue        |  2 +-
 packages/frontend/src/components/MkKeyValue.vue    |  2 +-
 packages/frontend/src/components/MkLaunchPad.vue   |  2 +-
 packages/frontend/src/components/MkLink.vue        |  2 +-
 packages/frontend/src/components/MkMediaBanner.vue |  2 +-
 packages/frontend/src/components/MkMediaImage.vue  |  2 +-
 packages/frontend/src/components/MkMediaList.vue   |  2 +-
 packages/frontend/src/components/MkMediaVideo.vue  |  2 +-
 packages/frontend/src/components/MkMention.vue     |  2 +-
 packages/frontend/src/components/MkMenu.child.vue  |  2 +-
 packages/frontend/src/components/MkMenu.vue        |  2 +-
 packages/frontend/src/components/MkModal.vue       |  2 +
 .../frontend/src/components/MkModalPageWindow.vue  |  2 +-
 packages/frontend/src/components/MkModalWindow.vue |  2 +-
 packages/frontend/src/components/MkNote.vue        |  6 +--
 .../frontend/src/components/MkNoteDetailed.vue     |  6 +--
 packages/frontend/src/components/MkNoteHeader.vue  |  2 +-
 packages/frontend/src/components/MkNotePreview.vue |  2 +-
 packages/frontend/src/components/MkNoteSimple.vue  |  2 +-
 packages/frontend/src/components/MkNoteSub.vue     |  2 +-
 packages/frontend/src/components/MkNotes.vue       |  2 +-
 .../frontend/src/components/MkNotification.vue     |  2 +-
 .../src/components/MkNotificationToast.vue         |  2 +
 .../frontend/src/components/MkNotifications.vue    |  2 +-
 packages/frontend/src/components/MkNumberDiff.vue  |  2 +-
 .../frontend/src/components/MkObjectView.value.vue |  2 +-
 packages/frontend/src/components/MkObjectView.vue  |  2 +-
 packages/frontend/src/components/MkPagePreview.vue |  2 +-
 packages/frontend/src/components/MkPageWindow.vue  |  2 +-
 packages/frontend/src/components/MkPagination.vue  |  2 +
 packages/frontend/src/components/MkPoll.vue        |  2 +-
 packages/frontend/src/components/MkPollEditor.vue  |  2 +-
 packages/frontend/src/components/MkPopupMenu.vue   |  2 +-
 packages/frontend/src/components/MkPostForm.vue    |  2 +-
 .../frontend/src/components/MkPostFormAttaches.vue |  2 +-
 .../frontend/src/components/MkReactionTooltip.vue  |  2 +-
 .../src/components/MkReactionsViewer.details.vue   |  2 +-
 .../src/components/MkReactionsViewer.reaction.vue  |  2 +-
 .../frontend/src/components/MkReactionsViewer.vue  |  2 +-
 .../frontend/src/components/MkRemoteCaution.vue    |  2 +-
 .../frontend/src/components/MkRenoteButton.vue     |  2 +-
 packages/frontend/src/components/MkRipple.vue      |  2 +-
 packages/frontend/src/components/MkSignin.vue      |  2 +-
 packages/frontend/src/components/MkSignup.vue      |  2 +-
 packages/frontend/src/components/MkSparkle.vue     |  2 +-
 .../frontend/src/components/MkSubNoteContent.vue   |  2 +-
 packages/frontend/src/components/MkSuperMenu.vue   |  2 +-
 packages/frontend/src/components/MkTagCloud.vue    |  2 +-
 packages/frontend/src/components/MkToast.vue       |  2 +
 packages/frontend/src/components/MkTooltip.vue     |  2 +
 packages/frontend/src/components/MkUpdated.vue     |  2 +-
 packages/frontend/src/components/MkUrlPreview.vue  |  6 +--
 .../frontend/src/components/MkUrlPreviewPopup.vue  |  2 +-
 packages/frontend/src/components/MkUserInfo.vue    |  2 +-
 packages/frontend/src/components/MkUserList.vue    |  2 +-
 .../src/components/MkUserOnlineIndicator.vue       |  2 +-
 packages/frontend/src/components/MkUserPreview.vue |  2 +
 .../frontend/src/components/MkUserSelectDialog.vue |  2 +-
 .../frontend/src/components/MkUsersTooltip.vue     |  2 +-
 .../frontend/src/components/MkVisibilityPicker.vue |  2 +-
 .../frontend/src/components/MkWaitingDialog.vue    |  2 +-
 packages/frontend/src/components/MkWindow.vue      |  2 +
 packages/frontend/src/components/form/checkbox.vue |  2 +-
 packages/frontend/src/components/form/folder.vue   |  2 +-
 packages/frontend/src/components/form/input.vue    |  2 +-
 packages/frontend/src/components/form/link.vue     |  2 +-
 packages/frontend/src/components/form/radio.vue    |  2 +-
 packages/frontend/src/components/form/range.vue    |  2 +-
 packages/frontend/src/components/form/section.vue  |  2 +-
 packages/frontend/src/components/form/select.vue   |  2 +-
 packages/frontend/src/components/form/slot.vue     |  2 +-
 packages/frontend/src/components/form/split.vue    |  2 +-
 packages/frontend/src/components/form/suspense.vue |  2 +
 packages/frontend/src/components/form/switch.vue   |  2 +-
 packages/frontend/src/components/form/textarea.vue |  2 +-
 packages/frontend/src/components/global/MkAcct.vue |  2 +-
 packages/frontend/src/components/global/MkAd.vue   |  2 +-
 .../frontend/src/components/global/MkAvatar.vue    |  2 +-
 .../frontend/src/components/global/MkEllipsis.vue  | 26 ++++++-----
 .../frontend/src/components/global/MkEmoji.vue     |  2 +-
 .../frontend/src/components/global/MkError.vue     |  2 +-
 .../global/MkMisskeyFlavoredMarkdown.vue           |  4 +-
 .../src/components/global/MkPageHeader.vue         |  4 +-
 packages/frontend/src/components/global/MkUrl.vue  |  2 +-
 .../frontend/src/components/page/page.button.vue   |  2 +-
 .../frontend/src/components/page/page.canvas.vue   |  2 +-
 .../frontend/src/components/page/page.counter.vue  |  2 +-
 .../frontend/src/components/page/page.image.vue    |  2 +-
 .../frontend/src/components/page/page.note.vue     |  8 ++--
 .../src/components/page/page.number-input.vue      |  2 +-
 .../frontend/src/components/page/page.post.vue     |  2 +-
 .../frontend/src/components/page/page.section.vue  |  2 +-
 .../frontend/src/components/page/page.switch.vue   |  2 +-
 .../src/components/page/page.text-input.vue        |  2 +-
 .../frontend/src/components/page/page.text.vue     |  6 +--
 packages/frontend/src/components/page/page.vue     |  2 +-
 packages/frontend/src/pages/_error_.vue            |  2 +-
 packages/frontend/src/pages/about-misskey.vue      |  2 +-
 packages/frontend/src/pages/about.emojis.vue       |  2 +-
 packages/frontend/src/pages/about.federation.vue   |  2 +-
 packages/frontend/src/pages/about.vue              |  2 +-
 packages/frontend/src/pages/admin-file.vue         |  2 +-
 packages/frontend/src/pages/admin/_header_.vue     |  2 +-
 packages/frontend/src/pages/admin/abuses.vue       |  2 +-
 packages/frontend/src/pages/admin/ads.vue          |  2 +-
 .../frontend/src/pages/admin/announcements.vue     |  2 +-
 .../frontend/src/pages/admin/emoji-edit-dialog.vue |  2 +-
 packages/frontend/src/pages/admin/emojis.vue       |  2 +-
 packages/frontend/src/pages/admin/files.vue        |  2 +-
 packages/frontend/src/pages/admin/index.vue        |  2 +-
 packages/frontend/src/pages/admin/metrics.vue      | 54 +++++++++++-----------
 .../src/pages/admin/overview.instances.vue         |  2 +-
 packages/frontend/src/pages/admin/overview.pie.vue |  2 +-
 .../src/pages/admin/overview.queue.chart.vue       |  2 +-
 packages/frontend/src/pages/admin/overview.vue     |  2 +-
 .../frontend/src/pages/admin/queue.chart.chart.vue |  2 +-
 packages/frontend/src/pages/admin/queue.chart.vue  |  2 +-
 packages/frontend/src/pages/admin/relays.vue       |  2 +-
 packages/frontend/src/pages/admin/users.vue        |  2 +-
 packages/frontend/src/pages/announcements.vue      |  2 +-
 packages/frontend/src/pages/antenna-timeline.vue   |  2 +-
 packages/frontend/src/pages/auth.vue               |  2 +-
 packages/frontend/src/pages/channel-editor.vue     |  2 +-
 packages/frontend/src/pages/channel.vue            |  2 +-
 packages/frontend/src/pages/clip.vue               |  4 +-
 packages/frontend/src/pages/emojis.emoji.vue       |  2 +-
 packages/frontend/src/pages/explore.users.vue      |  2 +-
 packages/frontend/src/pages/follow-requests.vue    |  2 +-
 packages/frontend/src/pages/gallery/edit.vue       |  2 +-
 packages/frontend/src/pages/gallery/index.vue      |  2 +-
 packages/frontend/src/pages/gallery/post.vue       |  2 +
 packages/frontend/src/pages/instance-info.vue      |  2 +-
 packages/frontend/src/pages/messaging/index.vue    |  2 +-
 .../src/pages/messaging/messaging-room.form.vue    |  2 +-
 .../src/pages/messaging/messaging-room.message.vue |  2 +-
 .../src/pages/messaging/messaging-room.vue         | 20 ++++----
 packages/frontend/src/pages/mfm-cheat-sheet.vue    |  2 +-
 packages/frontend/src/pages/miauth.vue             |  2 +-
 packages/frontend/src/pages/my-antennas/create.vue |  2 +-
 packages/frontend/src/pages/my-antennas/edit.vue   |  2 +-
 packages/frontend/src/pages/my-antennas/editor.vue |  2 +-
 packages/frontend/src/pages/my-antennas/index.vue  | 28 +++++------
 packages/frontend/src/pages/my-clips/index.vue     |  2 +-
 packages/frontend/src/pages/my-lists/index.vue     |  2 +-
 packages/frontend/src/pages/my-lists/list.vue      |  2 +-
 packages/frontend/src/pages/note.vue               |  2 +
 .../pages/page-editor/els/page-editor.el.image.vue |  2 +-
 .../page-editor/els/page-editor.el.section.vue     |  2 +-
 .../pages/page-editor/els/page-editor.el.text.vue  |  2 +-
 .../pages/page-editor/page-editor.container.vue    |  2 +-
 .../frontend/src/pages/page-editor/page-editor.vue |  2 +-
 packages/frontend/src/pages/page.vue               |  2 +
 packages/frontend/src/pages/pages.vue              |  2 +-
 packages/frontend/src/pages/preview.vue            |  2 +-
 packages/frontend/src/pages/registry.keys.vue      |  2 +-
 packages/frontend/src/pages/registry.value.vue     |  2 +-
 packages/frontend/src/pages/registry.vue           |  2 +-
 packages/frontend/src/pages/reset-password.vue     |  2 +-
 packages/frontend/src/pages/scratchpad.vue         |  2 +-
 packages/frontend/src/pages/settings/accounts.vue  |  2 +-
 packages/frontend/src/pages/settings/apps.vue      |  2 +-
 packages/frontend/src/pages/settings/drive.vue     |  3 +-
 packages/frontend/src/pages/settings/index.vue     |  2 +-
 packages/frontend/src/pages/settings/plugin.vue    |  2 +-
 packages/frontend/src/pages/settings/profile.vue   |  2 +-
 packages/frontend/src/pages/settings/reaction.vue  |  2 +-
 packages/frontend/src/pages/settings/security.vue  |  2 +-
 packages/frontend/src/pages/settings/theme.vue     |  2 +-
 packages/frontend/src/pages/share.vue              | 34 +++++++-------
 packages/frontend/src/pages/signup-complete.vue    |  2 +-
 packages/frontend/src/pages/theme-editor.vue       |  2 +-
 packages/frontend/src/pages/timeline.vue           |  2 +-
 packages/frontend/src/pages/user-info.vue          |  2 +-
 packages/frontend/src/pages/user-list-timeline.vue |  2 +-
 packages/frontend/src/pages/user/clips.vue         |  2 +-
 packages/frontend/src/pages/user/follow-list.vue   |  2 +-
 packages/frontend/src/pages/user/followers.vue     |  2 +-
 packages/frontend/src/pages/user/following.vue     |  2 +-
 packages/frontend/src/pages/user/gallery.vue       |  2 +-
 packages/frontend/src/pages/user/home.vue          |  2 +-
 packages/frontend/src/pages/user/index.photos.vue  |  2 +-
 packages/frontend/src/pages/user/pages.vue         |  2 +-
 packages/frontend/src/pages/user/reactions.vue     |  2 +-
 packages/frontend/src/pages/welcome.entrance.a.vue |  2 +-
 packages/frontend/src/pages/welcome.entrance.b.vue |  6 +--
 packages/frontend/src/pages/welcome.entrance.c.vue |  6 +--
 packages/frontend/src/pages/welcome.setup.vue      |  2 +-
 packages/frontend/src/pages/welcome.timeline.vue   |  6 ++-
 .../frontend/src/ui/_common_/navbar-for-mobile.vue |  2 +-
 packages/frontend/src/ui/_common_/navbar.vue       |  2 +-
 .../src/ui/_common_/statusbar-federation.vue       |  2 +
 .../frontend/src/ui/_common_/statusbar-rss.vue     |  2 +
 .../src/ui/_common_/statusbar-user-list.vue        |  2 +
 packages/frontend/src/ui/_common_/statusbars.vue   |  2 +-
 .../frontend/src/ui/_common_/stream-indicator.vue  |  2 +-
 packages/frontend/src/ui/_common_/upload.vue       |  2 +-
 packages/frontend/src/ui/classic.header.vue        |  2 +-
 packages/frontend/src/ui/classic.sidebar.vue       |  2 +-
 packages/frontend/src/ui/classic.vue               |  2 +
 packages/frontend/src/ui/deck.vue                  |  2 +
 packages/frontend/src/ui/deck/antenna-column.vue   |  2 +-
 packages/frontend/src/ui/deck/column.vue           |  2 +-
 packages/frontend/src/ui/deck/list-column.vue      |  2 +-
 packages/frontend/src/ui/deck/tl-column.vue        |  2 +-
 packages/frontend/src/ui/deck/widgets-column.vue   |  2 +-
 packages/frontend/src/ui/universal.vue             |  2 +
 packages/frontend/src/ui/universal.widgets.vue     |  2 +-
 packages/frontend/src/ui/visitor/kanban.vue        |  2 +-
 packages/frontend/src/ui/zen.vue                   |  6 +--
 packages/frontend/src/widgets/aichan.vue           |  2 +-
 packages/frontend/src/widgets/aiscript.vue         |  2 +-
 packages/frontend/src/widgets/button.vue           |  2 +-
 packages/frontend/src/widgets/calendar.vue         |  2 +-
 packages/frontend/src/widgets/clock.vue            |  2 +-
 packages/frontend/src/widgets/digital-clock.vue    |  2 +-
 packages/frontend/src/widgets/federation.vue       |  2 +-
 packages/frontend/src/widgets/instance-cloud.vue   |  2 +-
 packages/frontend/src/widgets/memo.vue             |  2 +-
 packages/frontend/src/widgets/online-users.vue     |  2 +-
 packages/frontend/src/widgets/rss.vue              |  2 +-
 .../frontend/src/widgets/server-metric/cpu-mem.vue |  2 +-
 .../frontend/src/widgets/server-metric/cpu.vue     |  2 +-
 .../frontend/src/widgets/server-metric/disk.vue    |  2 +-
 .../frontend/src/widgets/server-metric/mem.vue     |  2 +-
 .../frontend/src/widgets/server-metric/net.vue     |  2 +-
 .../frontend/src/widgets/server-metric/pie.vue     |  2 +-
 packages/frontend/src/widgets/slideshow.vue        |  2 +-
 packages/frontend/src/widgets/trends.vue           |  2 +-
 packages/frontend/src/widgets/unix-clock.vue       |  2 +-
 263 files changed, 407 insertions(+), 343 deletions(-)

(limited to 'packages/frontend/src/components/MkFileListForAdmin.vue')

diff --git a/packages/frontend/src/components/MkAbuseReport.vue b/packages/frontend/src/components/MkAbuseReport.vue
index 9a3464b640..19f20e6806 100644
--- a/packages/frontend/src/components/MkAbuseReport.vue
+++ b/packages/frontend/src/components/MkAbuseReport.vue
@@ -63,7 +63,7 @@ function resolve() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .bcekxzvu {
 	display: flex;
 
diff --git a/packages/frontend/src/components/MkAbuseReportWindow.vue b/packages/frontend/src/components/MkAbuseReportWindow.vue
index 039f77c859..c38094787c 100644
--- a/packages/frontend/src/components/MkAbuseReportWindow.vue
+++ b/packages/frontend/src/components/MkAbuseReportWindow.vue
@@ -58,7 +58,7 @@ function send() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .dpvffvvy {
 	--root-margin: 16px;
 }
diff --git a/packages/frontend/src/components/MkAnalogClock.vue b/packages/frontend/src/components/MkAnalogClock.vue
index 40ef626aed..b34b028ae6 100644
--- a/packages/frontend/src/components/MkAnalogClock.vue
+++ b/packages/frontend/src/components/MkAnalogClock.vue
@@ -205,7 +205,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mbcofsoe {
 	display: block;
 
diff --git a/packages/frontend/src/components/MkAutocomplete.vue b/packages/frontend/src/components/MkAutocomplete.vue
index 72783921d5..dea49435d3 100644
--- a/packages/frontend/src/components/MkAutocomplete.vue
+++ b/packages/frontend/src/components/MkAutocomplete.vue
@@ -376,7 +376,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .swhvrteh {
 	position: fixed;
 	max-width: 100%;
diff --git a/packages/frontend/src/components/MkButton.vue b/packages/frontend/src/components/MkButton.vue
index 891645bb2a..b60b0b8b89 100644
--- a/packages/frontend/src/components/MkButton.vue
+++ b/packages/frontend/src/components/MkButton.vue
@@ -98,7 +98,7 @@ function onMousedown(evt: MouseEvent): void {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .bghgjjyj {
 	position: relative;
 	z-index: 1; // 他コンポーネントのbox-shadowに隠されないようにするため
diff --git a/packages/frontend/src/components/MkChannelFollowButton.vue b/packages/frontend/src/components/MkChannelFollowButton.vue
index 9e275d6172..acd4209c2f 100644
--- a/packages/frontend/src/components/MkChannelFollowButton.vue
+++ b/packages/frontend/src/components/MkChannelFollowButton.vue
@@ -57,7 +57,7 @@ async function onClick() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .hdcaacmi {
 	position: relative;
 	display: inline-block;
diff --git a/packages/frontend/src/components/MkChannelPreview.vue b/packages/frontend/src/components/MkChannelPreview.vue
index 6ef50bddcf..8aef6c4b35 100644
--- a/packages/frontend/src/components/MkChannelPreview.vue
+++ b/packages/frontend/src/components/MkChannelPreview.vue
@@ -50,7 +50,7 @@ const bannerStyle = computed(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .eftoefju {
 	display: block;
 	overflow: hidden;
diff --git a/packages/frontend/src/components/MkChart.vue b/packages/frontend/src/components/MkChart.vue
index fbbc231b88..0bb4d4f042 100644
--- a/packages/frontend/src/components/MkChart.vue
+++ b/packages/frontend/src/components/MkChart.vue
@@ -838,7 +838,7 @@ onMounted(() => {
 /* eslint-enable id-denylist */
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .cbbedffa {
 	position: relative;
 
diff --git a/packages/frontend/src/components/MkChartTooltip.vue b/packages/frontend/src/components/MkChartTooltip.vue
index d36f45463c..0ad10162a8 100644
--- a/packages/frontend/src/components/MkChartTooltip.vue
+++ b/packages/frontend/src/components/MkChartTooltip.vue
@@ -33,7 +33,7 @@ const emit = defineEmits<{
 }>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .qpcyisrl {
 	> .title {
 		margin-bottom: 4px;
diff --git a/packages/frontend/src/components/MkContainer.vue b/packages/frontend/src/components/MkContainer.vue
index 6d4d5be2bc..8bd2a0ad22 100644
--- a/packages/frontend/src/components/MkContainer.vue
+++ b/packages/frontend/src/components/MkContainer.vue
@@ -140,7 +140,9 @@ export default defineComponent({
 .container-toggle-leave-to {
 	opacity: 0;
 }
+</style>
 
+<style lang="scss">
 .ukygtjoj {
 	position: relative;
 	overflow: clip;
diff --git a/packages/frontend/src/components/MkContextMenu.vue b/packages/frontend/src/components/MkContextMenu.vue
index cfc9502b41..4aee919670 100644
--- a/packages/frontend/src/components/MkContextMenu.vue
+++ b/packages/frontend/src/components/MkContextMenu.vue
@@ -69,10 +69,6 @@ function onMousedown(evt: Event) {
 </script>
 
 <style lang="scss" scoped>
-.nvlagfpb {
-	position: absolute;
-}
-
 .fade-enter-active, .fade-leave-active {
 	transition: opacity 0.5s cubic-bezier(0.16, 1, 0.3, 1), transform 0.5s cubic-bezier(0.16, 1, 0.3, 1);
 	transform-origin: left top;
@@ -83,3 +79,9 @@ function onMousedown(evt: Event) {
 	transform: scale(0.9);
 }
 </style>
+
+<style lang="scss">
+.nvlagfpb {
+	position: absolute;
+}
+</style>
diff --git a/packages/frontend/src/components/MkCropperDialog.vue b/packages/frontend/src/components/MkCropperDialog.vue
index ae18160dea..31269cbc51 100644
--- a/packages/frontend/src/components/MkCropperDialog.vue
+++ b/packages/frontend/src/components/MkCropperDialog.vue
@@ -133,7 +133,9 @@ onMounted(() => {
 .fade-leave-to {
 	opacity: 0;
 }
+</style>
 
+<style lang="scss">
 .mk-cropper-dialog {
 	display: flex;
 	flex-direction: column;
diff --git a/packages/frontend/src/components/MkCwButton.vue b/packages/frontend/src/components/MkCwButton.vue
index ee611921ef..94f06093fe 100644
--- a/packages/frontend/src/components/MkCwButton.vue
+++ b/packages/frontend/src/components/MkCwButton.vue
@@ -34,7 +34,7 @@ const toggle = () => {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .nrvgflfu {
 	display: inline-block;
 	padding: 4px 8px;
diff --git a/packages/frontend/src/components/MkDialog.vue b/packages/frontend/src/components/MkDialog.vue
index 374ecd8abf..6225668211 100644
--- a/packages/frontend/src/components/MkDialog.vue
+++ b/packages/frontend/src/components/MkDialog.vue
@@ -143,7 +143,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mk-dialog {
 	position: relative;
 	padding: 32px;
diff --git a/packages/frontend/src/components/MkDigitalClock.vue b/packages/frontend/src/components/MkDigitalClock.vue
index 9ed8d63d19..c2a17f2a03 100644
--- a/packages/frontend/src/components/MkDigitalClock.vue
+++ b/packages/frontend/src/components/MkDigitalClock.vue
@@ -62,7 +62,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .zjobosdg {
 	> .colon {
 		opacity: 0;
diff --git a/packages/frontend/src/components/MkDrive.file.vue b/packages/frontend/src/components/MkDrive.file.vue
index 8c17c0530a..28510ea153 100644
--- a/packages/frontend/src/components/MkDrive.file.vue
+++ b/packages/frontend/src/components/MkDrive.file.vue
@@ -176,7 +176,7 @@ async function deleteFile() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ncvczrfv {
 	position: relative;
 	padding: 8px 0 0 0;
diff --git a/packages/frontend/src/components/MkDrive.folder.vue b/packages/frontend/src/components/MkDrive.folder.vue
index 82653ca0b4..4e26500769 100644
--- a/packages/frontend/src/components/MkDrive.folder.vue
+++ b/packages/frontend/src/components/MkDrive.folder.vue
@@ -264,7 +264,7 @@ function onContextmenu(ev: MouseEvent) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .rghtznwe {
 	position: relative;
 	padding: 8px;
diff --git a/packages/frontend/src/components/MkDrive.navFolder.vue b/packages/frontend/src/components/MkDrive.navFolder.vue
index dbbfef5f05..13784a8691 100644
--- a/packages/frontend/src/components/MkDrive.navFolder.vue
+++ b/packages/frontend/src/components/MkDrive.navFolder.vue
@@ -1,5 +1,6 @@
 <template>
-<div class="drylbebk"
+<div
+	class="drylbebk"
 	:class="{ draghover }"
 	@click="onClick"
 	@dragover.prevent.stop="onDragover"
@@ -130,7 +131,7 @@ function onDrop(ev: DragEvent) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .drylbebk {
 	> * {
 		pointer-events: none;
diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue
index 4053870950..04806c474b 100644
--- a/packages/frontend/src/components/MkDrive.vue
+++ b/packages/frontend/src/components/MkDrive.vue
@@ -655,7 +655,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .yfudmmck {
 	display: flex;
 	flex-direction: column;
diff --git a/packages/frontend/src/components/MkDriveFileThumbnail.vue b/packages/frontend/src/components/MkDriveFileThumbnail.vue
index 33379ed5ca..92f2cefefa 100644
--- a/packages/frontend/src/components/MkDriveFileThumbnail.vue
+++ b/packages/frontend/src/components/MkDriveFileThumbnail.vue
@@ -53,7 +53,7 @@ const isThumbnailAvailable = computed(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .zdjebgpv {
 	position: relative;
 	display: flex;
diff --git a/packages/frontend/src/components/MkEmojiPicker.section.vue b/packages/frontend/src/components/MkEmojiPicker.section.vue
index f6ba7abfc4..61f8811b06 100644
--- a/packages/frontend/src/components/MkEmojiPicker.section.vue
+++ b/packages/frontend/src/components/MkEmojiPicker.section.vue
@@ -32,5 +32,5 @@ const emit = defineEmits<{
 const shown = ref(!!props.initialShown);
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 </style>
diff --git a/packages/frontend/src/components/MkEmojiPicker.vue b/packages/frontend/src/components/MkEmojiPicker.vue
index 814f71168a..57ae02ca20 100644
--- a/packages/frontend/src/components/MkEmojiPicker.vue
+++ b/packages/frontend/src/components/MkEmojiPicker.vue
@@ -354,7 +354,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .omfetrab {
 	$pad: 8px;
 
diff --git a/packages/frontend/src/components/MkEmojiPickerDialog.vue b/packages/frontend/src/components/MkEmojiPickerDialog.vue
index 3b41f9d75b..6370d9b972 100644
--- a/packages/frontend/src/components/MkEmojiPickerDialog.vue
+++ b/packages/frontend/src/components/MkEmojiPickerDialog.vue
@@ -62,7 +62,7 @@ function opening() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ryghynhb {
 	&.drawer {
 		border-radius: 24px;
diff --git a/packages/frontend/src/components/MkEmojiPickerWindow.vue b/packages/frontend/src/components/MkEmojiPickerWindow.vue
index 523e4ba695..04b8c5cc18 100644
--- a/packages/frontend/src/components/MkEmojiPickerWindow.vue
+++ b/packages/frontend/src/components/MkEmojiPickerWindow.vue
@@ -1,5 +1,6 @@
 <template>
-<MkWindow ref="window"
+<MkWindow
+	ref="window"
 	:initial-width="null"
 	:initial-height="null"
 	:can-resize="false"
@@ -34,7 +35,7 @@ function chosen(emoji: any) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .omfetrab {
 	$pad: 8px;
 	--eachSize: 40px;
diff --git a/packages/frontend/src/components/MkFeaturedPhotos.vue b/packages/frontend/src/components/MkFeaturedPhotos.vue
index e58b5d2849..ef6350438f 100644
--- a/packages/frontend/src/components/MkFeaturedPhotos.vue
+++ b/packages/frontend/src/components/MkFeaturedPhotos.vue
@@ -14,7 +14,7 @@ os.api('meta', { detail: true }).then(gotMeta => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .xfbouadm {
 	background-position: center;
 	background-size: cover;
diff --git a/packages/frontend/src/components/MkFileListForAdmin.vue b/packages/frontend/src/components/MkFileListForAdmin.vue
index 4910506a95..8bdea6154b 100644
--- a/packages/frontend/src/components/MkFileListForAdmin.vue
+++ b/packages/frontend/src/components/MkFileListForAdmin.vue
@@ -51,7 +51,9 @@ const props = defineProps<{
 	0% { opacity: 1; }
 	50% { opacity: 0; }
 }
+</style>
 
+<style lang="scss">
 .urempief {
 	margin-top: var(--margin);
 
diff --git a/packages/frontend/src/components/MkFolder.vue b/packages/frontend/src/components/MkFolder.vue
index 9e83b07cd7..5999152359 100644
--- a/packages/frontend/src/components/MkFolder.vue
+++ b/packages/frontend/src/components/MkFolder.vue
@@ -107,7 +107,9 @@ export default defineComponent({
 .folder-toggle-leave-to {
 	opacity: 0;
 }
+</style>
 
+<style lang="scss">
 .ssazuxis {
 	position: relative;
 
@@ -156,4 +158,14 @@ export default defineComponent({
 		}
 	}
 }
+
+@container (max-width: 500px) {
+	.ssazuxis {
+		> header {
+			> .title {
+				padding: 8px 10px 8px 0;
+			}
+		}
+	}
+}
 </style>
diff --git a/packages/frontend/src/components/MkFollowButton.vue b/packages/frontend/src/components/MkFollowButton.vue
index ee256d9263..fadf166acc 100644
--- a/packages/frontend/src/components/MkFollowButton.vue
+++ b/packages/frontend/src/components/MkFollowButton.vue
@@ -109,7 +109,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .kpoogebi {
 	position: relative;
 	display: inline-block;
diff --git a/packages/frontend/src/components/MkForgotPassword.vue b/packages/frontend/src/components/MkForgotPassword.vue
index 1b55451c94..5139c84142 100644
--- a/packages/frontend/src/components/MkForgotPassword.vue
+++ b/packages/frontend/src/components/MkForgotPassword.vue
@@ -1,5 +1,6 @@
 <template>
-<XModalWindow ref="dialog"
+<XModalWindow
+	ref="dialog"
 	:width="370"
 	:height="400"
 	@close="dialog.close()"
@@ -62,7 +63,7 @@ async function onSubmit() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .bafeceda {
 	> .main {
 		padding: 24px;
diff --git a/packages/frontend/src/components/MkFormDialog.vue b/packages/frontend/src/components/MkFormDialog.vue
index b2bf76a8c7..d81159be9b 100644
--- a/packages/frontend/src/components/MkFormDialog.vue
+++ b/packages/frontend/src/components/MkFormDialog.vue
@@ -120,7 +120,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .xkpnjxcv {
 
 }
diff --git a/packages/frontend/src/components/MkGalleryPostPreview.vue b/packages/frontend/src/components/MkGalleryPostPreview.vue
index a133f6431b..78a8ea39ac 100644
--- a/packages/frontend/src/components/MkGalleryPostPreview.vue
+++ b/packages/frontend/src/components/MkGalleryPostPreview.vue
@@ -25,7 +25,7 @@ const props = defineProps<{
 }>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ttasepnz {
 	display: block;
 	position: relative;
diff --git a/packages/frontend/src/components/MkGoogle.vue b/packages/frontend/src/components/MkGoogle.vue
index d104cd4cd4..d53602d9a1 100644
--- a/packages/frontend/src/components/MkGoogle.vue
+++ b/packages/frontend/src/components/MkGoogle.vue
@@ -19,7 +19,7 @@ const search = () => {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mk-google {
 	display: flex;
 	margin: 8px 0;
diff --git a/packages/frontend/src/components/MkImageViewer.vue b/packages/frontend/src/components/MkImageViewer.vue
index f074b1a2f2..77c7a93518 100644
--- a/packages/frontend/src/components/MkImageViewer.vue
+++ b/packages/frontend/src/components/MkImageViewer.vue
@@ -31,7 +31,7 @@ const emit = defineEmits<{
 const modal = $ref<InstanceType<typeof MkModal>>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .xubzgfga {
 	display: flex;
 	flex-direction: column;
diff --git a/packages/frontend/src/components/MkImgWithBlurhash.vue b/packages/frontend/src/components/MkImgWithBlurhash.vue
index 80d7c201a4..dc92844131 100644
--- a/packages/frontend/src/components/MkImgWithBlurhash.vue
+++ b/packages/frontend/src/components/MkImgWithBlurhash.vue
@@ -45,7 +45,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .xubzgfgb {
 	position: relative;
 	width: 100%;
diff --git a/packages/frontend/src/components/MkInfo.vue b/packages/frontend/src/components/MkInfo.vue
index 7aaf2c5bcb..1bcb637493 100644
--- a/packages/frontend/src/components/MkInfo.vue
+++ b/packages/frontend/src/components/MkInfo.vue
@@ -14,7 +14,7 @@ const props = defineProps<{
 }>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .fpezltsf {
 	padding: 12px 14px;
 	font-size: 90%;
diff --git a/packages/frontend/src/components/MkKeyValue.vue b/packages/frontend/src/components/MkKeyValue.vue
index ff69c79641..975ec7e3f0 100644
--- a/packages/frontend/src/components/MkKeyValue.vue
+++ b/packages/frontend/src/components/MkKeyValue.vue
@@ -30,7 +30,7 @@ const copy_ = () => {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .alqyeyti {
 	> .key {
 		font-size: 0.85em;
diff --git a/packages/frontend/src/components/MkLaunchPad.vue b/packages/frontend/src/components/MkLaunchPad.vue
index 1ccc648c72..b61b376d9b 100644
--- a/packages/frontend/src/components/MkLaunchPad.vue
+++ b/packages/frontend/src/components/MkLaunchPad.vue
@@ -62,7 +62,7 @@ function close() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .szkkfdyq {
 	max-height: 100%;
 	width: min(460px, 100vw);
diff --git a/packages/frontend/src/components/MkLink.vue b/packages/frontend/src/components/MkLink.vue
index 6148ec6195..a069fbe59b 100644
--- a/packages/frontend/src/components/MkLink.vue
+++ b/packages/frontend/src/components/MkLink.vue
@@ -35,7 +35,7 @@ useTooltip($$(el), (showing) => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .xlcxczvw {
 	word-break: break-all;
 
diff --git a/packages/frontend/src/components/MkMediaBanner.vue b/packages/frontend/src/components/MkMediaBanner.vue
index aa06c00fc6..432af84492 100644
--- a/packages/frontend/src/components/MkMediaBanner.vue
+++ b/packages/frontend/src/components/MkMediaBanner.vue
@@ -50,7 +50,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mk-media-banner {
 	width: 100%;
 	border-radius: 4px;
diff --git a/packages/frontend/src/components/MkMediaImage.vue b/packages/frontend/src/components/MkMediaImage.vue
index 56570eaa05..6ac616d908 100644
--- a/packages/frontend/src/components/MkMediaImage.vue
+++ b/packages/frontend/src/components/MkMediaImage.vue
@@ -49,7 +49,7 @@ watch(() => props.image, () => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .qjewsnkg {
 	position: relative;
 
diff --git a/packages/frontend/src/components/MkMediaList.vue b/packages/frontend/src/components/MkMediaList.vue
index c6f8612182..f91a021fcc 100644
--- a/packages/frontend/src/components/MkMediaList.vue
+++ b/packages/frontend/src/components/MkMediaList.vue
@@ -101,7 +101,7 @@ const previewable = (file: misskey.entities.DriveFile): boolean => {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .hoawjimk {
 	> .gird-container {
 		position: relative;
diff --git a/packages/frontend/src/components/MkMediaVideo.vue b/packages/frontend/src/components/MkMediaVideo.vue
index df0bf84116..a55eff5d70 100644
--- a/packages/frontend/src/components/MkMediaVideo.vue
+++ b/packages/frontend/src/components/MkMediaVideo.vue
@@ -35,7 +35,7 @@ const props = defineProps<{
 const hide = ref((defaultStore.state.nsfw === 'force') ? true : props.video.isSensitive && (defaultStore.state.nsfw !== 'ignore'));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .kkjnbbplepmiyuadieoenjgutgcmtsvu {
 	position: relative;
 
diff --git a/packages/frontend/src/components/MkMention.vue b/packages/frontend/src/components/MkMention.vue
index 3091b435e4..fffd6f8a31 100644
--- a/packages/frontend/src/components/MkMention.vue
+++ b/packages/frontend/src/components/MkMention.vue
@@ -39,7 +39,7 @@ bg.setAlpha(0.1);
 const bgCss = bg.toRgbString();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .akbvjaqn {
 	display: inline-block;
 	padding: 4px 8px 4px 4px;
diff --git a/packages/frontend/src/components/MkMenu.child.vue b/packages/frontend/src/components/MkMenu.child.vue
index 3ada4afbdc..60576b914d 100644
--- a/packages/frontend/src/components/MkMenu.child.vue
+++ b/packages/frontend/src/components/MkMenu.child.vue
@@ -58,7 +58,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .sfhdhdhr {
 	position: absolute;
 }
diff --git a/packages/frontend/src/components/MkMenu.vue b/packages/frontend/src/components/MkMenu.vue
index 64d18b6b7c..b87ec06882 100644
--- a/packages/frontend/src/components/MkMenu.vue
+++ b/packages/frontend/src/components/MkMenu.vue
@@ -186,7 +186,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .rrevdjwt {
 	padding: 8px 0;
 	box-sizing: border-box;
diff --git a/packages/frontend/src/components/MkModal.vue b/packages/frontend/src/components/MkModal.vue
index 2305a02794..532d8364ac 100644
--- a/packages/frontend/src/components/MkModal.vue
+++ b/packages/frontend/src/components/MkModal.vue
@@ -328,7 +328,9 @@ defineExpose({
 		transform: translateY(100%);
 	}
 }
+</style>
 
+<style lang="scss">
 .qzhlnise {
 	> .bg {
 		&.transparent {
diff --git a/packages/frontend/src/components/MkModalPageWindow.vue b/packages/frontend/src/components/MkModalPageWindow.vue
index ced8a7a714..fc10a8c6f4 100644
--- a/packages/frontend/src/components/MkModalPageWindow.vue
+++ b/packages/frontend/src/components/MkModalPageWindow.vue
@@ -115,7 +115,7 @@ function onContextmenu(ev: MouseEvent) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .hrmcaedk {
 	overflow: hidden;
 	display: flex;
diff --git a/packages/frontend/src/components/MkModalWindow.vue b/packages/frontend/src/components/MkModalWindow.vue
index d977ca6e9c..1465138245 100644
--- a/packages/frontend/src/components/MkModalWindow.vue
+++ b/packages/frontend/src/components/MkModalWindow.vue
@@ -83,7 +83,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ebkgoccj {
 	overflow: hidden;
 	display: flex;
diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue
index a4100e1f2c..ea1aeaeab7 100644
--- a/packages/frontend/src/components/MkNote.vue
+++ b/packages/frontend/src/components/MkNote.vue
@@ -90,7 +90,7 @@
 		</div>
 	</article>
 </div>
-<div v-else class="muted" @click="muted = false">
+<div v-else class="tkcbzcuz-muted" @click="muted = false">
 	<I18n :src="i18n.ts.userSaysSomething" tag="small">
 		<template #name>
 			<MkA v-user-preview="appearNote.userId" class="name" :to="userPage(appearNote.user)">
@@ -292,7 +292,7 @@ function readPromo() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .tkcbzcuz {
 	position: relative;
 	transition: box-shadow 0.1s ease;
@@ -650,7 +650,7 @@ function readPromo() {
 	}
 }
 
-.muted {
+.tkcbzcuz-muted {
 	padding: 8px;
 	text-align: center;
 	opacity: 0.7;
diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue
index 7ce8e039d9..4190f73ff7 100644
--- a/packages/frontend/src/components/MkNoteDetailed.vue
+++ b/packages/frontend/src/components/MkNoteDetailed.vue
@@ -101,7 +101,7 @@
 	</article>
 	<MkNoteSub v-for="note in replies" :key="note.id" :note="note" class="reply" :detail="true"/>
 </div>
-<div v-else class="_panel muted" @click="muted = false">
+<div v-else class="_panel lxwezrsl-muted" @click="muted = false">
 	<I18n :src="i18n.ts.userSaysSomething" tag="small">
 		<template #name>
 			<MkA v-user-preview="appearNote.userId" class="name" :to="userPage(appearNote.user)">
@@ -295,7 +295,7 @@ if (appearNote.replyId) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .lxwezrsl {
 	position: relative;
 	transition: box-shadow 0.1s ease;
@@ -669,7 +669,7 @@ if (appearNote.replyId) {
 	}
 }
 
-.muted {
+.lxwezrsl-muted {
 	padding: 8px;
 	text-align: center;
 	opacity: 0.7;
diff --git a/packages/frontend/src/components/MkNoteHeader.vue b/packages/frontend/src/components/MkNoteHeader.vue
index 333c3ddbd9..098428f10c 100644
--- a/packages/frontend/src/components/MkNoteHeader.vue
+++ b/packages/frontend/src/components/MkNoteHeader.vue
@@ -27,7 +27,7 @@ defineProps<{
 }>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .kkwtjztg {
 	display: flex;
 	align-items: baseline;
diff --git a/packages/frontend/src/components/MkNotePreview.vue b/packages/frontend/src/components/MkNotePreview.vue
index 0c81059091..47a04429e8 100644
--- a/packages/frontend/src/components/MkNotePreview.vue
+++ b/packages/frontend/src/components/MkNotePreview.vue
@@ -22,7 +22,7 @@ const props = defineProps<{
 }>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .fefdfafb {
 	display: flex;
 	margin: 0;
diff --git a/packages/frontend/src/components/MkNoteSimple.vue b/packages/frontend/src/components/MkNoteSimple.vue
index 96d29831d2..7a1e2087a8 100644
--- a/packages/frontend/src/components/MkNoteSimple.vue
+++ b/packages/frontend/src/components/MkNoteSimple.vue
@@ -31,7 +31,7 @@ const props = defineProps<{
 const showContent = $ref(false);
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .yohlumlk {
 	display: flex;
 	margin: 0;
diff --git a/packages/frontend/src/components/MkNoteSub.vue b/packages/frontend/src/components/MkNoteSub.vue
index d03ce7c434..29b4f01270 100644
--- a/packages/frontend/src/components/MkNoteSub.vue
+++ b/packages/frontend/src/components/MkNoteSub.vue
@@ -57,7 +57,7 @@ if (props.detail) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .wrpstxzv {
 	padding: 16px 32px;
 	font-size: 0.9em;
diff --git a/packages/frontend/src/components/MkNotes.vue b/packages/frontend/src/components/MkNotes.vue
index 5abcdc2298..6bdde1da2c 100644
--- a/packages/frontend/src/components/MkNotes.vue
+++ b/packages/frontend/src/components/MkNotes.vue
@@ -36,7 +36,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .giivymft {
 	&.noGap {
 		> .notes {
diff --git a/packages/frontend/src/components/MkNotification.vue b/packages/frontend/src/components/MkNotification.vue
index 8b8d3f452d..9d3e240004 100644
--- a/packages/frontend/src/components/MkNotification.vue
+++ b/packages/frontend/src/components/MkNotification.vue
@@ -160,7 +160,7 @@ useTooltip(reactionRef, (showing) => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .qglefbjs {
 	position: relative;
 	box-sizing: border-box;
diff --git a/packages/frontend/src/components/MkNotificationToast.vue b/packages/frontend/src/components/MkNotificationToast.vue
index 07640792c0..e4d96bde91 100644
--- a/packages/frontend/src/components/MkNotificationToast.vue
+++ b/packages/frontend/src/components/MkNotificationToast.vue
@@ -37,7 +37,9 @@ onMounted(() => {
 	opacity: 0;
 	transform: translateX(-250px);
 }
+</style>
 
+<style lang="scss">
 .mk-notification-toast {
 	position: fixed;
 	left: 0;
diff --git a/packages/frontend/src/components/MkNotifications.vue b/packages/frontend/src/components/MkNotifications.vue
index 0e1cc06743..882c873bdf 100644
--- a/packages/frontend/src/components/MkNotifications.vue
+++ b/packages/frontend/src/components/MkNotifications.vue
@@ -97,7 +97,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .elsfgstc {
 	background: var(--panel);
 }
diff --git a/packages/frontend/src/components/MkNumberDiff.vue b/packages/frontend/src/components/MkNumberDiff.vue
index e7d4a5472a..9e816654c6 100644
--- a/packages/frontend/src/components/MkNumberDiff.vue
+++ b/packages/frontend/src/components/MkNumberDiff.vue
@@ -30,7 +30,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ceaaebcd {
 	&.isPlus {
 		color: var(--success);
diff --git a/packages/frontend/src/components/MkObjectView.value.vue b/packages/frontend/src/components/MkObjectView.value.vue
index 0c7230d783..bf0ebbd5d1 100644
--- a/packages/frontend/src/components/MkObjectView.value.vue
+++ b/packages/frontend/src/components/MkObjectView.value.vue
@@ -78,7 +78,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .igpposuu {
 	display: inline;
 
diff --git a/packages/frontend/src/components/MkObjectView.vue b/packages/frontend/src/components/MkObjectView.vue
index 55578a37f6..5101f5e351 100644
--- a/packages/frontend/src/components/MkObjectView.vue
+++ b/packages/frontend/src/components/MkObjectView.vue
@@ -13,7 +13,7 @@ const props = defineProps<{
 }>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .zhyxdalp {
 
 }
diff --git a/packages/frontend/src/components/MkPagePreview.vue b/packages/frontend/src/components/MkPagePreview.vue
index 009582e540..2c323e5a39 100644
--- a/packages/frontend/src/components/MkPagePreview.vue
+++ b/packages/frontend/src/components/MkPagePreview.vue
@@ -32,7 +32,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .vhpxefrj {
 	display: block;
 
diff --git a/packages/frontend/src/components/MkPageWindow.vue b/packages/frontend/src/components/MkPageWindow.vue
index 29d45558a7..aa28eb1f4b 100644
--- a/packages/frontend/src/components/MkPageWindow.vue
+++ b/packages/frontend/src/components/MkPageWindow.vue
@@ -132,7 +132,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .yrolvcoq {
 	min-height: 100%;
 	background: var(--bg);
diff --git a/packages/frontend/src/components/MkPagination.vue b/packages/frontend/src/components/MkPagination.vue
index 291409171a..b59fe03323 100644
--- a/packages/frontend/src/components/MkPagination.vue
+++ b/packages/frontend/src/components/MkPagination.vue
@@ -307,7 +307,9 @@ defineExpose({
 .fade-leave-to {
 	opacity: 0;
 }
+</style>
 
+<style lang="scss">
 .cxiknjgy {
 	> .button {
 		margin-left: auto;
diff --git a/packages/frontend/src/components/MkPoll.vue b/packages/frontend/src/components/MkPoll.vue
index a1b927e42a..6d3402a58c 100644
--- a/packages/frontend/src/components/MkPoll.vue
+++ b/packages/frontend/src/components/MkPoll.vue
@@ -86,7 +86,7 @@ const vote = async (id) => {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .tivcixzd {
 	> ul {
 		display: block;
diff --git a/packages/frontend/src/components/MkPollEditor.vue b/packages/frontend/src/components/MkPollEditor.vue
index 556abc5fd0..9a42bf1037 100644
--- a/packages/frontend/src/components/MkPollEditor.vue
+++ b/packages/frontend/src/components/MkPollEditor.vue
@@ -142,7 +142,7 @@ watch([choices, multiple, expiration, atDate, atTime, after, unit], () => emit('
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .zmdxowus {
 	padding: 8px 16px;
 
diff --git a/packages/frontend/src/components/MkPopupMenu.vue b/packages/frontend/src/components/MkPopupMenu.vue
index f04c7f5618..3cac9fb44d 100644
--- a/packages/frontend/src/components/MkPopupMenu.vue
+++ b/packages/frontend/src/components/MkPopupMenu.vue
@@ -25,7 +25,7 @@ const emit = defineEmits<{
 let modal = $ref<InstanceType<typeof MkModal>>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .sfhdhdhq {
 	&.drawer {
 		border-radius: 24px;
diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue
index f79e5a32cd..b2dc48c4f3 100644
--- a/packages/frontend/src/components/MkPostForm.vue
+++ b/packages/frontend/src/components/MkPostForm.vue
@@ -715,7 +715,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .gafaadew {
 	position: relative;
 
diff --git a/packages/frontend/src/components/MkPostFormAttaches.vue b/packages/frontend/src/components/MkPostFormAttaches.vue
index 766cc9a06c..2646cea6de 100644
--- a/packages/frontend/src/components/MkPostFormAttaches.vue
+++ b/packages/frontend/src/components/MkPostFormAttaches.vue
@@ -109,7 +109,7 @@ function showFileMenu(file, ev: MouseEvent) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .skeikyzd {
 	padding: 8px 16px;
 	position: relative;
diff --git a/packages/frontend/src/components/MkReactionTooltip.vue b/packages/frontend/src/components/MkReactionTooltip.vue
index 310d5954fc..49a29d36c6 100644
--- a/packages/frontend/src/components/MkReactionTooltip.vue
+++ b/packages/frontend/src/components/MkReactionTooltip.vue
@@ -24,7 +24,7 @@ const emit = defineEmits<{
 }>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .beeadbfb {
 	text-align: center;
 
diff --git a/packages/frontend/src/components/MkReactionsViewer.details.vue b/packages/frontend/src/components/MkReactionsViewer.details.vue
index 29902a5075..e5a99a9254 100644
--- a/packages/frontend/src/components/MkReactionsViewer.details.vue
+++ b/packages/frontend/src/components/MkReactionsViewer.details.vue
@@ -44,7 +44,7 @@ function getReactionName(reaction: string): string {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .bqxuuuey {
 	display: flex;
 
diff --git a/packages/frontend/src/components/MkReactionsViewer.reaction.vue b/packages/frontend/src/components/MkReactionsViewer.reaction.vue
index 31342b0b48..5fef5d6f4b 100644
--- a/packages/frontend/src/components/MkReactionsViewer.reaction.vue
+++ b/packages/frontend/src/components/MkReactionsViewer.reaction.vue
@@ -90,7 +90,7 @@ useTooltip(buttonRef, async (showing) => {
 }, 100);
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .hkzvhatu {
 	display: inline-block;
 	height: 32px;
diff --git a/packages/frontend/src/components/MkReactionsViewer.vue b/packages/frontend/src/components/MkReactionsViewer.vue
index a88311efa1..e6999194fd 100644
--- a/packages/frontend/src/components/MkReactionsViewer.vue
+++ b/packages/frontend/src/components/MkReactionsViewer.vue
@@ -19,7 +19,7 @@ const initialReactions = new Set(Object.keys(props.note.reactions));
 const isMe = computed(() => $i && $i.id === props.note.userId);
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .tdflqwzn {
 	margin: 4px -2px 0 -2px;
 
diff --git a/packages/frontend/src/components/MkRemoteCaution.vue b/packages/frontend/src/components/MkRemoteCaution.vue
index d5dc01c1f8..0942969910 100644
--- a/packages/frontend/src/components/MkRemoteCaution.vue
+++ b/packages/frontend/src/components/MkRemoteCaution.vue
@@ -10,7 +10,7 @@ defineProps<{
 }>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .jmgmzlwq {
 	font-size: 0.8em;
 	padding: 16px;
diff --git a/packages/frontend/src/components/MkRenoteButton.vue b/packages/frontend/src/components/MkRenoteButton.vue
index e0b1eaafc9..c267a93825 100644
--- a/packages/frontend/src/components/MkRenoteButton.vue
+++ b/packages/frontend/src/components/MkRenoteButton.vue
@@ -74,7 +74,7 @@ const renote = (viaKeyboard = false) => {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .eddddedb {
 	display: inline-block;
 	height: 32px;
diff --git a/packages/frontend/src/components/MkRipple.vue b/packages/frontend/src/components/MkRipple.vue
index 9d93211d5f..9a1352538f 100644
--- a/packages/frontend/src/components/MkRipple.vue
+++ b/packages/frontend/src/components/MkRipple.vue
@@ -100,7 +100,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .vswabwbm {
 	pointer-events: none;
 	position: fixed;
diff --git a/packages/frontend/src/components/MkSignin.vue b/packages/frontend/src/components/MkSignin.vue
index 96f18f8d61..21918a4c89 100644
--- a/packages/frontend/src/components/MkSignin.vue
+++ b/packages/frontend/src/components/MkSignin.vue
@@ -242,7 +242,7 @@ function resetPassword() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .eppvobhk {
 	> .auth {
 		> .avatar {
diff --git a/packages/frontend/src/components/MkSignup.vue b/packages/frontend/src/components/MkSignup.vue
index d987425ca3..07100b0985 100644
--- a/packages/frontend/src/components/MkSignup.vue
+++ b/packages/frontend/src/components/MkSignup.vue
@@ -237,7 +237,7 @@ function onSubmit(): void {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .qlvuhzng {
 	.captcha {
 		margin: 16px 0;
diff --git a/packages/frontend/src/components/MkSparkle.vue b/packages/frontend/src/components/MkSparkle.vue
index cdeaf9c417..9c3107e810 100644
--- a/packages/frontend/src/components/MkSparkle.vue
+++ b/packages/frontend/src/components/MkSparkle.vue
@@ -111,7 +111,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mk-sparkle {
 	position: relative;
 	display: inline-block;
diff --git a/packages/frontend/src/components/MkSubNoteContent.vue b/packages/frontend/src/components/MkSubNoteContent.vue
index 210923be46..b08a81b80d 100644
--- a/packages/frontend/src/components/MkSubNoteContent.vue
+++ b/packages/frontend/src/components/MkSubNoteContent.vue
@@ -39,7 +39,7 @@ const collapsed = $ref(
 	));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .wrmlmaau {
 	overflow-wrap: break-word;
 
diff --git a/packages/frontend/src/components/MkSuperMenu.vue b/packages/frontend/src/components/MkSuperMenu.vue
index e79794aea4..a91bfdced0 100644
--- a/packages/frontend/src/components/MkSuperMenu.vue
+++ b/packages/frontend/src/components/MkSuperMenu.vue
@@ -41,7 +41,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .rrevdjwu {
 	> .group {
 		& + .group {
diff --git a/packages/frontend/src/components/MkTagCloud.vue b/packages/frontend/src/components/MkTagCloud.vue
index 2dfd26edb0..51ad29457e 100644
--- a/packages/frontend/src/components/MkTagCloud.vue
+++ b/packages/frontend/src/components/MkTagCloud.vue
@@ -70,7 +70,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .meijqfqm {
 	position: relative;
 	overflow: clip;
diff --git a/packages/frontend/src/components/MkToast.vue b/packages/frontend/src/components/MkToast.vue
index c9fad64eb6..d5a592e0bd 100644
--- a/packages/frontend/src/components/MkToast.vue
+++ b/packages/frontend/src/components/MkToast.vue
@@ -40,7 +40,9 @@ onMounted(() => {
 	opacity: 0;
 	transform: translateY(-100%);
 }
+</style>
 
+<style lang="scss">
 .mk-toast {
 	> .body {
 		position: fixed;
diff --git a/packages/frontend/src/components/MkTooltip.vue b/packages/frontend/src/components/MkTooltip.vue
index 4c6258d245..84d3ecaa80 100644
--- a/packages/frontend/src/components/MkTooltip.vue
+++ b/packages/frontend/src/components/MkTooltip.vue
@@ -86,7 +86,9 @@ onUnmounted(() => {
 	opacity: 0;
 	transform: scale(0.75);
 }
+</style>
 
+<style lang="scss">
 .buebdbiu {
 	position: absolute;
 	font-size: 0.8em;
diff --git a/packages/frontend/src/components/MkUpdated.vue b/packages/frontend/src/components/MkUpdated.vue
index 48aeb30224..378f95633e 100644
--- a/packages/frontend/src/components/MkUpdated.vue
+++ b/packages/frontend/src/components/MkUpdated.vue
@@ -25,7 +25,7 @@ const whatIsNew = () => {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ewlycnyt {
 	position: relative;
 	padding: 32px;
diff --git a/packages/frontend/src/components/MkUrlPreview.vue b/packages/frontend/src/components/MkUrlPreview.vue
index b2d16ddb01..d4d3aac745 100644
--- a/packages/frontend/src/components/MkUrlPreview.vue
+++ b/packages/frontend/src/components/MkUrlPreview.vue
@@ -1,5 +1,5 @@
 <template>
-<div v-if="playerEnabled" class="player" :style="`padding: ${(player.height || 0) / (player.width || 1) * 100}% 0 0`">
+<div v-if="playerEnabled" class="mk-url-preview-player" :style="`padding: ${(player.height || 0) / (player.width || 1) * 100}% 0 0`">
 	<button class="disablePlayer" :title="i18n.ts.disablePlayer" @click="playerEnabled = false"><i class="ti ti-x"></i></button>
 	<iframe :src="player.url + (player.url.match(/\?/) ? '&autoplay=1&auto_play=1' : '?autoplay=1&auto_play=1')" :width="player.width || '100%'" :heigth="player.height || 250" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen/>
 </div>
@@ -121,8 +121,8 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
-.player {
+<style lang="scss">
+.mk-url-preview-player {
 	position: relative;
 	width: 100%;
 
diff --git a/packages/frontend/src/components/MkUrlPreviewPopup.vue b/packages/frontend/src/components/MkUrlPreviewPopup.vue
index f343c6d8a6..690c48eb88 100644
--- a/packages/frontend/src/components/MkUrlPreviewPopup.vue
+++ b/packages/frontend/src/components/MkUrlPreviewPopup.vue
@@ -35,7 +35,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .fgmtyycl {
 	position: absolute;
 	width: 500px;
diff --git a/packages/frontend/src/components/MkUserInfo.vue b/packages/frontend/src/components/MkUserInfo.vue
index 036cbea304..6d2ed47113 100644
--- a/packages/frontend/src/components/MkUserInfo.vue
+++ b/packages/frontend/src/components/MkUserInfo.vue
@@ -39,7 +39,7 @@ defineProps<{
 }>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .vjnjpkug {
 	position: relative;
 
diff --git a/packages/frontend/src/components/MkUserList.vue b/packages/frontend/src/components/MkUserList.vue
index e1f47c7673..fcd096f377 100644
--- a/packages/frontend/src/components/MkUserList.vue
+++ b/packages/frontend/src/components/MkUserList.vue
@@ -30,7 +30,7 @@ const props = defineProps<{
 const pagingComponent = ref<InstanceType<typeof MkPagination>>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .efvhhmdq {
 	display: grid;
 	grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
diff --git a/packages/frontend/src/components/MkUserOnlineIndicator.vue b/packages/frontend/src/components/MkUserOnlineIndicator.vue
index a4f6f80383..ad78cdc834 100644
--- a/packages/frontend/src/components/MkUserOnlineIndicator.vue
+++ b/packages/frontend/src/components/MkUserOnlineIndicator.vue
@@ -21,7 +21,7 @@ const text = $computed(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .fzgwjkgc {
 	box-shadow: 0 0 0 3px var(--panel);
 	border-radius: 120%; // Blinkのバグか知らんけど、100%ぴったりにすると何故か若干楕円でレンダリングされる
diff --git a/packages/frontend/src/components/MkUserPreview.vue b/packages/frontend/src/components/MkUserPreview.vue
index 4de2e8baa2..55105422c0 100644
--- a/packages/frontend/src/components/MkUserPreview.vue
+++ b/packages/frontend/src/components/MkUserPreview.vue
@@ -89,7 +89,9 @@ onMounted(() => {
 	opacity: 0;
 	transform: scale(0.9);
 }
+</style>
 
+<style lang="scss">
 .fxxzrfni {
 	position: absolute;
 	width: 300px;
diff --git a/packages/frontend/src/components/MkUserSelectDialog.vue b/packages/frontend/src/components/MkUserSelectDialog.vue
index 1d31769c30..530ff3469e 100644
--- a/packages/frontend/src/components/MkUserSelectDialog.vue
+++ b/packages/frontend/src/components/MkUserSelectDialog.vue
@@ -115,7 +115,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .tbhwbxda {
 	> .form {
 		padding: 0 var(--root-margin);
diff --git a/packages/frontend/src/components/MkUsersTooltip.vue b/packages/frontend/src/components/MkUsersTooltip.vue
index f0384e2d65..47a567130c 100644
--- a/packages/frontend/src/components/MkUsersTooltip.vue
+++ b/packages/frontend/src/components/MkUsersTooltip.vue
@@ -26,7 +26,7 @@ const emit = defineEmits<{
 }>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .beaffaef {
 	font-size: 0.9em;
 	text-align: left;
diff --git a/packages/frontend/src/components/MkVisibilityPicker.vue b/packages/frontend/src/components/MkVisibilityPicker.vue
index 8f0bcdeae8..4dd8891bc5 100644
--- a/packages/frontend/src/components/MkVisibilityPicker.vue
+++ b/packages/frontend/src/components/MkVisibilityPicker.vue
@@ -79,7 +79,7 @@ function choose(visibility: typeof misskey.noteVisibilities[number]): void {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .gqyayizv {
 	width: 240px;
 	padding: 8px 0;
diff --git a/packages/frontend/src/components/MkWaitingDialog.vue b/packages/frontend/src/components/MkWaitingDialog.vue
index f4a9f4f22c..35591536de 100644
--- a/packages/frontend/src/components/MkWaitingDialog.vue
+++ b/packages/frontend/src/components/MkWaitingDialog.vue
@@ -35,7 +35,7 @@ watch(() => props.showing, () => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .iuyakobc {
 	position: relative;
 	padding: 32px;
diff --git a/packages/frontend/src/components/MkWindow.vue b/packages/frontend/src/components/MkWindow.vue
index 629c105810..ab3120a642 100644
--- a/packages/frontend/src/components/MkWindow.vue
+++ b/packages/frontend/src/components/MkWindow.vue
@@ -416,7 +416,9 @@ defineExpose({
 	opacity: 0;
 	transform: scale(0.9);
 }
+</style>
 
+<style lang="scss">
 .ebkgocck {
 	position: fixed;
 	top: 0;
diff --git a/packages/frontend/src/components/form/checkbox.vue b/packages/frontend/src/components/form/checkbox.vue
index ba3b2dc146..347ef1cc64 100644
--- a/packages/frontend/src/components/form/checkbox.vue
+++ b/packages/frontend/src/components/form/checkbox.vue
@@ -50,7 +50,7 @@ const toggle = () => {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ziffeoms {
 	position: relative;
 	display: flex;
diff --git a/packages/frontend/src/components/form/folder.vue b/packages/frontend/src/components/form/folder.vue
index 1256dfcbb4..6facc1ee35 100644
--- a/packages/frontend/src/components/form/folder.vue
+++ b/packages/frontend/src/components/form/folder.vue
@@ -37,7 +37,7 @@ const toggle = () => {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .dwzlatin {
 	display: block;
 
diff --git a/packages/frontend/src/components/form/input.vue b/packages/frontend/src/components/form/input.vue
index 939e9691a6..ebff201e14 100644
--- a/packages/frontend/src/components/form/input.vue
+++ b/packages/frontend/src/components/form/input.vue
@@ -149,7 +149,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .matxzzsk {
 	> .label {
 		font-size: 0.85em;
diff --git a/packages/frontend/src/components/form/link.vue b/packages/frontend/src/components/form/link.vue
index a1775c0bdb..decb77511e 100644
--- a/packages/frontend/src/components/form/link.vue
+++ b/packages/frontend/src/components/form/link.vue
@@ -31,7 +31,7 @@ const props = defineProps<{
 }>();
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ffcbddfc {
 	display: block;
 
diff --git a/packages/frontend/src/components/form/radio.vue b/packages/frontend/src/components/form/radio.vue
index fcf454c77a..3421893022 100644
--- a/packages/frontend/src/components/form/radio.vue
+++ b/packages/frontend/src/components/form/radio.vue
@@ -39,7 +39,7 @@ function toggle(): void {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .novjtctn {
 	position: relative;
 	display: inline-block;
diff --git a/packages/frontend/src/components/form/range.vue b/packages/frontend/src/components/form/range.vue
index db21c35717..cb20453bfc 100644
--- a/packages/frontend/src/components/form/range.vue
+++ b/packages/frontend/src/components/form/range.vue
@@ -141,7 +141,7 @@ const onMousedown = (ev: MouseEvent | TouchEvent) => {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 @use "sass:math";
 
 .timctyfi {
diff --git a/packages/frontend/src/components/form/section.vue b/packages/frontend/src/components/form/section.vue
index c6e34ef1cc..b95caf40e5 100644
--- a/packages/frontend/src/components/form/section.vue
+++ b/packages/frontend/src/components/form/section.vue
@@ -10,7 +10,7 @@
 <script lang="ts" setup>
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .vrtktovh {
 	border-top: solid 0.5px var(--divider);
 	border-bottom: solid 0.5px var(--divider);
diff --git a/packages/frontend/src/components/form/select.vue b/packages/frontend/src/components/form/select.vue
index eaf4b131cd..324396ab79 100644
--- a/packages/frontend/src/components/form/select.vue
+++ b/packages/frontend/src/components/form/select.vue
@@ -164,7 +164,7 @@ const onClick = (ev: MouseEvent) => {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .vblkjoeq {
 	> .label {
 		font-size: 0.85em;
diff --git a/packages/frontend/src/components/form/slot.vue b/packages/frontend/src/components/form/slot.vue
index 79ce8fe51f..bc66c5b18b 100644
--- a/packages/frontend/src/components/form/slot.vue
+++ b/packages/frontend/src/components/form/slot.vue
@@ -16,7 +16,7 @@ function focus() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .adhpbeou {
 	> .label {
 		font-size: 0.85em;
diff --git a/packages/frontend/src/components/form/split.vue b/packages/frontend/src/components/form/split.vue
index 301a8a84e5..2534d484ef 100644
--- a/packages/frontend/src/components/form/split.vue
+++ b/packages/frontend/src/components/form/split.vue
@@ -14,7 +14,7 @@ const props = withDefaults(defineProps<{
 const minWidth = props.minWidth + 'px';
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .terlnhxf {
 	display: grid;
 	grid-template-columns: repeat(auto-fill, minmax(v-bind('minWidth'), 1fr));
diff --git a/packages/frontend/src/components/form/suspense.vue b/packages/frontend/src/components/form/suspense.vue
index 7efa501f27..5fbcde974c 100644
--- a/packages/frontend/src/components/form/suspense.vue
+++ b/packages/frontend/src/components/form/suspense.vue
@@ -86,7 +86,9 @@ export default defineComponent({
 .fade-leave-to {
 	opacity: 0;
 }
+</style>
 
+<style lang="scss">
 .wszdbhzo {
 	padding: 16px;
 	text-align: center;
diff --git a/packages/frontend/src/components/form/switch.vue b/packages/frontend/src/components/form/switch.vue
index 1ed00ae655..faf8acb0da 100644
--- a/packages/frontend/src/components/form/switch.vue
+++ b/packages/frontend/src/components/form/switch.vue
@@ -46,7 +46,7 @@ const toggle = () => {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ziffeomt {
 	position: relative;
 	display: flex;
diff --git a/packages/frontend/src/components/form/textarea.vue b/packages/frontend/src/components/form/textarea.vue
index d34d7b1775..78a7e8eedb 100644
--- a/packages/frontend/src/components/form/textarea.vue
+++ b/packages/frontend/src/components/form/textarea.vue
@@ -174,7 +174,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .adhpbeos {
 	> .label {
 		font-size: 0.85em;
diff --git a/packages/frontend/src/components/global/MkAcct.vue b/packages/frontend/src/components/global/MkAcct.vue
index c3e806b5fb..4cebae25e2 100644
--- a/packages/frontend/src/components/global/MkAcct.vue
+++ b/packages/frontend/src/components/global/MkAcct.vue
@@ -18,7 +18,7 @@ defineProps<{
 const host = toUnicode(hostRaw);
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mk-acct {
 	> .host {
 		opacity: 0.5;
diff --git a/packages/frontend/src/components/global/MkAd.vue b/packages/frontend/src/components/global/MkAd.vue
index a80efb142c..238fada4a0 100644
--- a/packages/frontend/src/components/global/MkAd.vue
+++ b/packages/frontend/src/components/global/MkAd.vue
@@ -92,7 +92,7 @@ function reduceFrequency(): void {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .qiivuoyo {
 	background-size: auto auto;
 	background-image: repeating-linear-gradient(45deg, transparent, transparent 8px, var(--ad) 8px, var(--ad) 14px );
diff --git a/packages/frontend/src/components/global/MkAvatar.vue b/packages/frontend/src/components/global/MkAvatar.vue
index 5f3e3c176d..ed1f9ff5ad 100644
--- a/packages/frontend/src/components/global/MkAvatar.vue
+++ b/packages/frontend/src/components/global/MkAvatar.vue
@@ -52,7 +52,7 @@ watch(() => props.user.avatarBlurhash, () => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 @keyframes earwiggleleft {
 	from { transform: rotate(37.6deg) skew(30deg); }
 	25% { transform: rotate(10deg) skew(30deg); }
diff --git a/packages/frontend/src/components/global/MkEllipsis.vue b/packages/frontend/src/components/global/MkEllipsis.vue
index 0a46f486d6..f02b228c71 100644
--- a/packages/frontend/src/components/global/MkEllipsis.vue
+++ b/packages/frontend/src/components/global/MkEllipsis.vue
@@ -1,10 +1,21 @@
 <template>
-	<span class="mk-ellipsis">
-		<span>.</span><span>.</span><span>.</span>
-	</span>
+<span class="mk-ellipsis">
+	<span>.</span><span>.</span><span>.</span>
+</span>
 </template>
 
 <style lang="scss" scoped>
+@keyframes ellipsis {
+	0%, 80%, 100% {
+		opacity: 1;
+	}
+	40% {
+		opacity: 0;
+	}
+}
+</style>
+
+<style lang="scss">
 .mk-ellipsis {
 	> span {
 		animation: ellipsis 1.4s infinite ease-in-out both;
@@ -22,13 +33,4 @@
 		}
 	}
 }
-
-@keyframes ellipsis {
-	0%, 80%, 100% {
-		opacity: 1;
-	}
-	40% {
-		opacity: 0;
-	}
-}
 </style>
diff --git a/packages/frontend/src/components/global/MkEmoji.vue b/packages/frontend/src/components/global/MkEmoji.vue
index ce1299a39f..4967b0949d 100644
--- a/packages/frontend/src/components/global/MkEmoji.vue
+++ b/packages/frontend/src/components/global/MkEmoji.vue
@@ -50,7 +50,7 @@ function computeTitle(event: PointerEvent): void {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mk-emoji {
 	height: 1.25em;
 	vertical-align: -0.25em;
diff --git a/packages/frontend/src/components/global/MkError.vue b/packages/frontend/src/components/global/MkError.vue
index e135d4184b..0ab31ac0da 100644
--- a/packages/frontend/src/components/global/MkError.vue
+++ b/packages/frontend/src/components/global/MkError.vue
@@ -13,7 +13,7 @@ import MkButton from '@/components/MkButton.vue';
 import { i18n } from '@/i18n';
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mjndxjcg {
 	padding: 32px;
 	text-align: center;
diff --git a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.vue b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.vue
index 70d0108e9f..dc98f14839 100644
--- a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.vue
+++ b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.vue
@@ -1,5 +1,5 @@
 <template>
-<MfmCore :text="text" :plain="plain" :nowrap="nowrap" :author="author" :customEmojis="customEmojis" :isNote="isNote" class="havbbuyv" :class="{ nowrap }"/>
+<MfmCore :text="text" :plain="plain" :nowrap="nowrap" :author="author" :custom-emojis="customEmojis" :is-note="isNote" class="havbbuyv" :class="{ nowrap }"/>
 </template>
 
 <script lang="ts" setup>
@@ -158,7 +158,7 @@ const props = withDefaults(defineProps<{
 }
 </style>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .havbbuyv {
 	white-space: pre-wrap;
 
diff --git a/packages/frontend/src/components/global/MkPageHeader.vue b/packages/frontend/src/components/global/MkPageHeader.vue
index a228dfe883..5b6779d247 100644
--- a/packages/frontend/src/components/global/MkPageHeader.vue
+++ b/packages/frontend/src/components/global/MkPageHeader.vue
@@ -65,7 +65,7 @@ const props = withDefaults(defineProps<{
 	thin?: boolean;
 	displayMyAvatar?: boolean;
 }>(), {
-	tabs: () => ([] as Tab[])
+	tabs: () => ([] as Tab[]),
 });
 
 const emit = defineEmits<{
@@ -178,7 +178,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .fdidabkb {
 	--height: 52px;
 	display: flex;
diff --git a/packages/frontend/src/components/global/MkUrl.vue b/packages/frontend/src/components/global/MkUrl.vue
index 9f5be96224..bc15d11a41 100644
--- a/packages/frontend/src/components/global/MkUrl.vue
+++ b/packages/frontend/src/components/global/MkUrl.vue
@@ -53,7 +53,7 @@ const attr = self ? 'to' : 'href';
 const target = self ? null : '_blank';
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ieqqeuvs {
 	word-break: break-all;
 
diff --git a/packages/frontend/src/components/page/page.button.vue b/packages/frontend/src/components/page/page.button.vue
index 83931021d8..875f22f4fc 100644
--- a/packages/frontend/src/components/page/page.button.vue
+++ b/packages/frontend/src/components/page/page.button.vue
@@ -56,7 +56,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .kudkigyw {
 	display: inline-block;
 	min-width: 200px;
diff --git a/packages/frontend/src/components/page/page.canvas.vue b/packages/frontend/src/components/page/page.canvas.vue
index 80f6c8339c..a2327db40d 100644
--- a/packages/frontend/src/components/page/page.canvas.vue
+++ b/packages/frontend/src/components/page/page.canvas.vue
@@ -35,7 +35,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ysrxegms {
 	display: inline-block;
 	vertical-align: bottom;
diff --git a/packages/frontend/src/components/page/page.counter.vue b/packages/frontend/src/components/page/page.counter.vue
index a9e1f41a54..8455b24307 100644
--- a/packages/frontend/src/components/page/page.counter.vue
+++ b/packages/frontend/src/components/page/page.counter.vue
@@ -42,7 +42,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .llumlmnx {
 	display: inline-block;
 	min-width: 300px;
diff --git a/packages/frontend/src/components/page/page.image.vue b/packages/frontend/src/components/page/page.image.vue
index 8ba70c5855..7b03167c6d 100644
--- a/packages/frontend/src/components/page/page.image.vue
+++ b/packages/frontend/src/components/page/page.image.vue
@@ -19,7 +19,7 @@ const props = defineProps<{
 const image = props.hpml.page.attachedFiles.find(x => x.id === props.block.fileId);
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .lzyxtsnt {
 	> img {
 		max-width: 100%;
diff --git a/packages/frontend/src/components/page/page.note.vue b/packages/frontend/src/components/page/page.note.vue
index 7d5c484a1b..064143751b 100644
--- a/packages/frontend/src/components/page/page.note.vue
+++ b/packages/frontend/src/components/page/page.note.vue
@@ -28,9 +28,9 @@ export default defineComponent({
 
 		onMounted(() => {
 			os.api('notes/show', { noteId: props.block.note })
-			.then(result => {
-				note.value = result;
-			});
+				.then(result => {
+					note.value = result;
+				});
 		});
 
 		return {
@@ -40,7 +40,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .voxdxuby {
 	margin: 1em 0;
 }
diff --git a/packages/frontend/src/components/page/page.number-input.vue b/packages/frontend/src/components/page/page.number-input.vue
index 50cf6d0770..7a76804d62 100644
--- a/packages/frontend/src/components/page/page.number-input.vue
+++ b/packages/frontend/src/components/page/page.number-input.vue
@@ -45,7 +45,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .kudkigyw {
 	display: inline-block;
 	min-width: 300px;
diff --git a/packages/frontend/src/components/page/page.post.vue b/packages/frontend/src/components/page/page.post.vue
index 0ef50d65cd..f1749454e9 100644
--- a/packages/frontend/src/components/page/page.post.vue
+++ b/packages/frontend/src/components/page/page.post.vue
@@ -86,7 +86,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ngbfujlo {
 	position: relative;
 	padding: 32px;
diff --git a/packages/frontend/src/components/page/page.section.vue b/packages/frontend/src/components/page/page.section.vue
index 630c1f5179..58be2e2872 100644
--- a/packages/frontend/src/components/page/page.section.vue
+++ b/packages/frontend/src/components/page/page.section.vue
@@ -34,7 +34,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .sdgxphyu {
 	margin: 1.5em 0;
 
diff --git a/packages/frontend/src/components/page/page.switch.vue b/packages/frontend/src/components/page/page.switch.vue
index 64dc4ff8aa..c90562d0a6 100644
--- a/packages/frontend/src/components/page/page.switch.vue
+++ b/packages/frontend/src/components/page/page.switch.vue
@@ -43,7 +43,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .hkcxmtwj {
 	display: inline-block;
 	margin: 16px auto;
diff --git a/packages/frontend/src/components/page/page.text-input.vue b/packages/frontend/src/components/page/page.text-input.vue
index 840649ece6..70ec1aeb16 100644
--- a/packages/frontend/src/components/page/page.text-input.vue
+++ b/packages/frontend/src/components/page/page.text-input.vue
@@ -45,7 +45,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .kudkigyw {
 	display: inline-block;
 	min-width: 300px;
diff --git a/packages/frontend/src/components/page/page.text.vue b/packages/frontend/src/components/page/page.text.vue
index 689c484521..02a33090c2 100644
--- a/packages/frontend/src/components/page/page.text.vue
+++ b/packages/frontend/src/components/page/page.text.vue
@@ -6,10 +6,10 @@
 </template>
 
 <script lang="ts">
-import { TextBlock } from '@/scripts/hpml/block';
-import { Hpml } from '@/scripts/hpml/evaluator';
 import { defineAsyncComponent, defineComponent, PropType } from 'vue';
 import * as mfm from 'mfm-js';
+import { TextBlock } from '@/scripts/hpml/block';
+import { Hpml } from '@/scripts/hpml/evaluator';
 import { extractUrlFromMfm } from '@/scripts/extract-url-from-mfm';
 
 export default defineComponent({
@@ -51,7 +51,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mrdgzndn {
 	&:not(:first-child) {
 		margin-top: 0.5em;
diff --git a/packages/frontend/src/components/page/page.vue b/packages/frontend/src/components/page/page.vue
index b5cb73c009..d43a4e4271 100644
--- a/packages/frontend/src/components/page/page.vue
+++ b/packages/frontend/src/components/page/page.vue
@@ -70,7 +70,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .iroscrza {
 	&.serif {
 		> div {
diff --git a/packages/frontend/src/pages/_error_.vue b/packages/frontend/src/pages/_error_.vue
index 232d525347..1d3ff7b220 100644
--- a/packages/frontend/src/pages/_error_.vue
+++ b/packages/frontend/src/pages/_error_.vue
@@ -62,7 +62,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mjndxjch {
 	padding: 32px;
 	text-align: center;
diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue
index 3ec972bcda..ded3c71620 100644
--- a/packages/frontend/src/pages/about-misskey.vue
+++ b/packages/frontend/src/pages/about-misskey.vue
@@ -207,7 +207,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .znqjceqz {
 	> .about {
 		position: relative;
diff --git a/packages/frontend/src/pages/about.emojis.vue b/packages/frontend/src/pages/about.emojis.vue
index 53ce1e4b75..b0b63028d9 100644
--- a/packages/frontend/src/pages/about.emojis.vue
+++ b/packages/frontend/src/pages/about.emojis.vue
@@ -95,7 +95,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .driuhtrh {
 	background: var(--bg);
 
diff --git a/packages/frontend/src/pages/about.federation.vue b/packages/frontend/src/pages/about.federation.vue
index 6c92ab1264..49ca65294d 100644
--- a/packages/frontend/src/pages/about.federation.vue
+++ b/packages/frontend/src/pages/about.federation.vue
@@ -86,7 +86,7 @@ function getStatus(instance) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .taeiyria {
 	> .query {
 		background: var(--bg);
diff --git a/packages/frontend/src/pages/about.vue b/packages/frontend/src/pages/about.vue
index 0ed692c5c5..b2e3789d55 100644
--- a/packages/frontend/src/pages/about.vue
+++ b/packages/frontend/src/pages/about.vue
@@ -136,7 +136,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .fwhjspax {
 	text-align: center;
 	border-radius: 10px;
diff --git a/packages/frontend/src/pages/admin-file.vue b/packages/frontend/src/pages/admin-file.vue
index a11249e75d..e971ccc45b 100644
--- a/packages/frontend/src/pages/admin-file.vue
+++ b/packages/frontend/src/pages/admin-file.vue
@@ -140,7 +140,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .cxqhhsmd {
 	> .thumbnail {
 		display: block;
diff --git a/packages/frontend/src/pages/admin/_header_.vue b/packages/frontend/src/pages/admin/_header_.vue
index bdb41b2d2c..f2c840c5f0 100644
--- a/packages/frontend/src/pages/admin/_header_.vue
+++ b/packages/frontend/src/pages/admin/_header_.vue
@@ -147,7 +147,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .fdidabkc {
 	--height: 60px;
 	display: flex;
diff --git a/packages/frontend/src/pages/admin/abuses.vue b/packages/frontend/src/pages/admin/abuses.vue
index 973ec871ab..3be203cc84 100644
--- a/packages/frontend/src/pages/admin/abuses.vue
+++ b/packages/frontend/src/pages/admin/abuses.vue
@@ -90,7 +90,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .lcixvhis {
 	margin: var(--margin);
 }
diff --git a/packages/frontend/src/pages/admin/ads.vue b/packages/frontend/src/pages/admin/ads.vue
index 2ec926c65c..e8ee929898 100644
--- a/packages/frontend/src/pages/admin/ads.vue
+++ b/packages/frontend/src/pages/admin/ads.vue
@@ -119,7 +119,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .uqshojas {
 	> .ad {
 		padding: 32px;
diff --git a/packages/frontend/src/pages/admin/announcements.vue b/packages/frontend/src/pages/admin/announcements.vue
index 607ad8aa02..3fdbc2e859 100644
--- a/packages/frontend/src/pages/admin/announcements.vue
+++ b/packages/frontend/src/pages/admin/announcements.vue
@@ -105,7 +105,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ztgjmzrw {
 	margin: var(--margin);
 }
diff --git a/packages/frontend/src/pages/admin/emoji-edit-dialog.vue b/packages/frontend/src/pages/admin/emoji-edit-dialog.vue
index bd601cb1de..3cfc77bede 100644
--- a/packages/frontend/src/pages/admin/emoji-edit-dialog.vue
+++ b/packages/frontend/src/pages/admin/emoji-edit-dialog.vue
@@ -95,7 +95,7 @@ async function del() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .yigymqpb {
 	> .img {
 		display: block;
diff --git a/packages/frontend/src/pages/admin/emojis.vue b/packages/frontend/src/pages/admin/emojis.vue
index 14c8466d73..5af28a27db 100644
--- a/packages/frontend/src/pages/admin/emojis.vue
+++ b/packages/frontend/src/pages/admin/emojis.vue
@@ -295,7 +295,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ogwlenmc {
 	> .local {
 		.empty {
diff --git a/packages/frontend/src/pages/admin/files.vue b/packages/frontend/src/pages/admin/files.vue
index 8ad6bd4fc0..6c599383a7 100644
--- a/packages/frontend/src/pages/admin/files.vue
+++ b/packages/frontend/src/pages/admin/files.vue
@@ -113,7 +113,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .xrmjdkdw {
 	margin: var(--margin);
 }
diff --git a/packages/frontend/src/pages/admin/index.vue b/packages/frontend/src/pages/admin/index.vue
index 6c07a87eeb..7da5d188d3 100644
--- a/packages/frontend/src/pages/admin/index.vue
+++ b/packages/frontend/src/pages/admin/index.vue
@@ -272,7 +272,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .hiyeyicy {
 	&.wide {
 		display: flex;
diff --git a/packages/frontend/src/pages/admin/metrics.vue b/packages/frontend/src/pages/admin/metrics.vue
index db8e448639..49954baa80 100644
--- a/packages/frontend/src/pages/admin/metrics.vue
+++ b/packages/frontend/src/pages/admin/metrics.vue
@@ -53,43 +53,43 @@
 <script lang="ts">
 import { defineComponent, markRaw } from 'vue';
 import {
-  Chart,
-  ArcElement,
-  LineElement,
-  BarElement,
-  PointElement,
-  BarController,
-  LineController,
-  CategoryScale,
-  LinearScale,
-  Legend,
-  Title,
-  Tooltip,
-  SubTitle,
+	Chart,
+	ArcElement,
+	LineElement,
+	BarElement,
+	PointElement,
+	BarController,
+	LineController,
+	CategoryScale,
+	LinearScale,
+	Legend,
+	Title,
+	Tooltip,
+	SubTitle,
 } from 'chart.js';
+import MkwFederation from '../../widgets/federation.vue';
 import MkButton from '@/components/MkButton.vue';
 import MkSelect from '@/components/form/select.vue';
 import MkInput from '@/components/form/input.vue';
 import MkContainer from '@/components/MkContainer.vue';
 import MkFolder from '@/components/MkFolder.vue';
-import MkwFederation from '../../widgets/federation.vue';
 import { version, url } from '@/config';
 import bytes from '@/filters/bytes';
 import number from '@/filters/number';
 
 Chart.register(
-  ArcElement,
-  LineElement,
-  BarElement,
-  PointElement,
-  BarController,
-  LineController,
-  CategoryScale,
-  LinearScale,
-  Legend,
-  Title,
-  Tooltip,
-  SubTitle,
+	ArcElement,
+	LineElement,
+	BarElement,
+	PointElement,
+	BarController,
+	LineController,
+	CategoryScale,
+	LinearScale,
+	Legend,
+	Title,
+	Tooltip,
+	SubTitle,
 );
 
 const alpha = (hex, a) => {
@@ -462,7 +462,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .xhexznfu {
 	> div:nth-child(2) {
 		padding: 16px;
diff --git a/packages/frontend/src/pages/admin/overview.instances.vue b/packages/frontend/src/pages/admin/overview.instances.vue
index 29848bf03b..f4c135663c 100644
--- a/packages/frontend/src/pages/admin/overview.instances.vue
+++ b/packages/frontend/src/pages/admin/overview.instances.vue
@@ -35,7 +35,7 @@ useInterval(fetch, 1000 * 60, {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .wbrkwale {
 	> .instances {
 		display: grid;
diff --git a/packages/frontend/src/pages/admin/overview.pie.vue b/packages/frontend/src/pages/admin/overview.pie.vue
index 94509cf006..93f3a1f283 100644
--- a/packages/frontend/src/pages/admin/overview.pie.vue
+++ b/packages/frontend/src/pages/admin/overview.pie.vue
@@ -105,6 +105,6 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/pages/admin/overview.queue.chart.vue b/packages/frontend/src/pages/admin/overview.queue.chart.vue
index 1e095bddaa..e2f4868fdc 100644
--- a/packages/frontend/src/pages/admin/overview.queue.chart.vue
+++ b/packages/frontend/src/pages/admin/overview.queue.chart.vue
@@ -181,6 +181,6 @@ defineExpose({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/pages/admin/overview.vue b/packages/frontend/src/pages/admin/overview.vue
index d656e55200..231f677eae 100644
--- a/packages/frontend/src/pages/admin/overview.vue
+++ b/packages/frontend/src/pages/admin/overview.vue
@@ -181,7 +181,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .edbbcaef {
 	display: grid;
 	grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
diff --git a/packages/frontend/src/pages/admin/queue.chart.chart.vue b/packages/frontend/src/pages/admin/queue.chart.chart.vue
index 5777674ae3..433774402a 100644
--- a/packages/frontend/src/pages/admin/queue.chart.chart.vue
+++ b/packages/frontend/src/pages/admin/queue.chart.chart.vue
@@ -181,6 +181,6 @@ defineExpose({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/pages/admin/queue.chart.vue b/packages/frontend/src/pages/admin/queue.chart.vue
index 186a22c43e..06030c75a5 100644
--- a/packages/frontend/src/pages/admin/queue.chart.vue
+++ b/packages/frontend/src/pages/admin/queue.chart.vue
@@ -113,7 +113,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .pumxzjhg {
 	> .status {
 		padding: 16px;
diff --git a/packages/frontend/src/pages/admin/relays.vue b/packages/frontend/src/pages/admin/relays.vue
index 4768ae67b1..3a58d69dac 100644
--- a/packages/frontend/src/pages/admin/relays.vue
+++ b/packages/frontend/src/pages/admin/relays.vue
@@ -81,7 +81,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .relaycxt {
 	> .status {
 		margin: 8px 0;
diff --git a/packages/frontend/src/pages/admin/users.vue b/packages/frontend/src/pages/admin/users.vue
index d466e21907..96a901c779 100644
--- a/packages/frontend/src/pages/admin/users.vue
+++ b/packages/frontend/src/pages/admin/users.vue
@@ -138,7 +138,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .lknzcolw {
 	> .users {
 
diff --git a/packages/frontend/src/pages/announcements.vue b/packages/frontend/src/pages/announcements.vue
index 6a93b3b9fa..c30f207d12 100644
--- a/packages/frontend/src/pages/announcements.vue
+++ b/packages/frontend/src/pages/announcements.vue
@@ -50,7 +50,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ruryvtyk {
 	> .announcement {
 		&:not(:last-child) {
diff --git a/packages/frontend/src/pages/antenna-timeline.vue b/packages/frontend/src/pages/antenna-timeline.vue
index 0b2c284c99..141af260b0 100644
--- a/packages/frontend/src/pages/antenna-timeline.vue
+++ b/packages/frontend/src/pages/antenna-timeline.vue
@@ -89,7 +89,7 @@ definePageMetadata(computed(() => antenna ? {
 } : null));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .tqmomfks {
 	padding: var(--margin);
 
diff --git a/packages/frontend/src/pages/auth.vue b/packages/frontend/src/pages/auth.vue
index bb55881a22..5c4916b657 100644
--- a/packages/frontend/src/pages/auth.vue
+++ b/packages/frontend/src/pages/auth.vue
@@ -86,6 +86,6 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/pages/channel-editor.vue b/packages/frontend/src/pages/channel-editor.vue
index 5ae7e63f99..4345163d9d 100644
--- a/packages/frontend/src/pages/channel-editor.vue
+++ b/packages/frontend/src/pages/channel-editor.vue
@@ -117,6 +117,6 @@ definePageMetadata(computed(() => props.channelId ? {
 }));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/pages/channel.vue b/packages/frontend/src/pages/channel.vue
index f271bb270f..04bbb6ed9a 100644
--- a/packages/frontend/src/pages/channel.vue
+++ b/packages/frontend/src/pages/channel.vue
@@ -83,7 +83,7 @@ definePageMetadata(computed(() => channel ? {
 } : null));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .wpgynlbz {
 	position: relative;
 
diff --git a/packages/frontend/src/pages/clip.vue b/packages/frontend/src/pages/clip.vue
index e0fbcb6bed..b47ce13557 100644
--- a/packages/frontend/src/pages/clip.vue
+++ b/packages/frontend/src/pages/clip.vue
@@ -1,7 +1,7 @@
 <template>
 <MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions"/></template>
-		<MkSpacer :content-max="800">
+	<MkSpacer :content-max="800">
 		<div v-if="clip">
 			<div class="okzinsic _panel">
 				<div v-if="clip.description" class="description">
@@ -105,7 +105,7 @@ definePageMetadata(computed(() => clip ? {
 } : null));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .okzinsic {
 	position: relative;
 	margin-bottom: var(--margin);
diff --git a/packages/frontend/src/pages/emojis.emoji.vue b/packages/frontend/src/pages/emojis.emoji.vue
index 40fe496520..55a4eb2cdf 100644
--- a/packages/frontend/src/pages/emojis.emoji.vue
+++ b/packages/frontend/src/pages/emojis.emoji.vue
@@ -33,7 +33,7 @@ function menu(ev) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .zuvgdzyu {
 	display: flex;
 	align-items: center;
diff --git a/packages/frontend/src/pages/explore.users.vue b/packages/frontend/src/pages/explore.users.vue
index bfee0a6c07..9d77aae731 100644
--- a/packages/frontend/src/pages/explore.users.vue
+++ b/packages/frontend/src/pages/explore.users.vue
@@ -135,7 +135,7 @@ os.api('hashtags/list', {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .vxjfqztj {
 	> * {
 		margin-right: 16px;
diff --git a/packages/frontend/src/pages/follow-requests.vue b/packages/frontend/src/pages/follow-requests.vue
index b20679ccc1..fe1482bd6a 100644
--- a/packages/frontend/src/pages/follow-requests.vue
+++ b/packages/frontend/src/pages/follow-requests.vue
@@ -71,7 +71,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mk-follow-requests {
 	> .user {
 		display: flex;
diff --git a/packages/frontend/src/pages/gallery/edit.vue b/packages/frontend/src/pages/gallery/edit.vue
index c8111d7890..ac1e2b4855 100644
--- a/packages/frontend/src/pages/gallery/edit.vue
+++ b/packages/frontend/src/pages/gallery/edit.vue
@@ -122,7 +122,7 @@ definePageMetadata(computed(() => props.postId ? {
 }));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .wqugxsfx {
 	height: 200px;
 	background-size: contain;
diff --git a/packages/frontend/src/pages/gallery/index.vue b/packages/frontend/src/pages/gallery/index.vue
index 24a634bab5..4b285658aa 100644
--- a/packages/frontend/src/pages/gallery/index.vue
+++ b/packages/frontend/src/pages/gallery/index.vue
@@ -125,7 +125,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .vfpdbgtk {
 	display: grid;
 	grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
diff --git a/packages/frontend/src/pages/gallery/post.vue b/packages/frontend/src/pages/gallery/post.vue
index 85ab1048be..86282bc9fb 100644
--- a/packages/frontend/src/pages/gallery/post.vue
+++ b/packages/frontend/src/pages/gallery/post.vue
@@ -161,7 +161,9 @@ definePageMetadata(computed(() => post ? {
 .fade-leave-to {
 	opacity: 0;
 }
+</style>
 
+<style lang="scss">
 .rkxwuolj {
 	> .files {
 		> .file {
diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue
index a2a1254360..d9a09d3e3a 100644
--- a/packages/frontend/src/pages/instance-info.vue
+++ b/packages/frontend/src/pages/instance-info.vue
@@ -225,7 +225,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .fnfelxur {
 	display: flex;
 	align-items: center;
diff --git a/packages/frontend/src/pages/messaging/index.vue b/packages/frontend/src/pages/messaging/index.vue
index 0d30998330..747dae06c5 100644
--- a/packages/frontend/src/pages/messaging/index.vue
+++ b/packages/frontend/src/pages/messaging/index.vue
@@ -162,7 +162,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .yweeujhr {
 
 	> .start {
diff --git a/packages/frontend/src/pages/messaging/messaging-room.form.vue b/packages/frontend/src/pages/messaging/messaging-room.form.vue
index 84572815c0..ae9923235f 100644
--- a/packages/frontend/src/pages/messaging/messaging-room.form.vue
+++ b/packages/frontend/src/pages/messaging/messaging-room.form.vue
@@ -235,7 +235,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .pemppnzi {
 	position: relative;
 
diff --git a/packages/frontend/src/pages/messaging/messaging-room.message.vue b/packages/frontend/src/pages/messaging/messaging-room.message.vue
index dbf0e37b73..1d30c21c17 100644
--- a/packages/frontend/src/pages/messaging/messaging-room.message.vue
+++ b/packages/frontend/src/pages/messaging/messaging-room.message.vue
@@ -59,7 +59,7 @@ function del(): void {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .thvuemwp {
 	$me-balloon-color: var(--accent);
 
diff --git a/packages/frontend/src/pages/messaging/messaging-room.vue b/packages/frontend/src/pages/messaging/messaging-room.vue
index b6eeb9260e..1ffd6ef4a5 100644
--- a/packages/frontend/src/pages/messaging/messaging-room.vue
+++ b/packages/frontend/src/pages/messaging/messaging-room.vue
@@ -305,6 +305,17 @@ definePageMetadata(computed(() => !fetching ? user ? {
 </script>
 
 <style lang="scss" scoped>
+.fade-enter-active, .fade-leave-active {
+	transition: opacity 0.1s;
+}
+
+.fade-enter-from, .fade-leave-to {
+	transition: opacity 0.5s;
+	opacity: 0;
+}
+</style>
+
+<style lang="scss">
 .mk-messaging-room {
 	position: relative;
 	overflow: auto;
@@ -399,13 +410,4 @@ definePageMetadata(computed(() => !fetching ? user ? {
 		}
 	}
 }
-
-.fade-enter-active, .fade-leave-active {
-	transition: opacity 0.1s;
-}
-
-.fade-enter-from, .fade-leave-to {
-	transition: opacity 0.5s;
-	opacity: 0;
-}
 </style>
diff --git a/packages/frontend/src/pages/mfm-cheat-sheet.vue b/packages/frontend/src/pages/mfm-cheat-sheet.vue
index 7c85dfb7ad..cf34697f9b 100644
--- a/packages/frontend/src/pages/mfm-cheat-sheet.vue
+++ b/packages/frontend/src/pages/mfm-cheat-sheet.vue
@@ -355,7 +355,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mwysmxbg {
 	background: var(--bg);
 
diff --git a/packages/frontend/src/pages/miauth.vue b/packages/frontend/src/pages/miauth.vue
index 5de072cbfa..e1a5676ad2 100644
--- a/packages/frontend/src/pages/miauth.vue
+++ b/packages/frontend/src/pages/miauth.vue
@@ -85,6 +85,6 @@ function onLogin(res): void {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/pages/my-antennas/create.vue b/packages/frontend/src/pages/my-antennas/create.vue
index 005b036696..5680ded96a 100644
--- a/packages/frontend/src/pages/my-antennas/create.vue
+++ b/packages/frontend/src/pages/my-antennas/create.vue
@@ -41,6 +41,6 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/pages/my-antennas/edit.vue b/packages/frontend/src/pages/my-antennas/edit.vue
index cb583faaeb..182d14ace9 100644
--- a/packages/frontend/src/pages/my-antennas/edit.vue
+++ b/packages/frontend/src/pages/my-antennas/edit.vue
@@ -38,6 +38,6 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/pages/my-antennas/editor.vue b/packages/frontend/src/pages/my-antennas/editor.vue
index a409a734b5..245706ab88 100644
--- a/packages/frontend/src/pages/my-antennas/editor.vue
+++ b/packages/frontend/src/pages/my-antennas/editor.vue
@@ -141,7 +141,7 @@ function addUser() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .shaynizk {
 	> .form {
 		padding: 32px;
diff --git a/packages/frontend/src/pages/my-antennas/index.vue b/packages/frontend/src/pages/my-antennas/index.vue
index 9daf23f9b5..e3512a3a20 100644
--- a/packages/frontend/src/pages/my-antennas/index.vue
+++ b/packages/frontend/src/pages/my-antennas/index.vue
@@ -1,18 +1,20 @@
-<template><MkStickyContainer>
+<template>
+<MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
-		<MkSpacer :content-max="700">
-	<div class="ieepwinx">
-		<MkButton :link="true" to="/my/antennas/create" primary class="add"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton>
+	<MkSpacer :content-max="700">
+		<div class="ieepwinx">
+			<MkButton :link="true" to="/my/antennas/create" primary class="add"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton>
 
-		<div class="">
-			<MkPagination v-slot="{items}" ref="list" :pagination="pagination">
-				<MkA v-for="antenna in items" :key="antenna.id" class="ljoevbzj" :to="`/my/antennas/${antenna.id}`">
-					<div class="name">{{ antenna.name }}</div>
-				</MkA>
-			</MkPagination>
+			<div class="">
+				<MkPagination v-slot="{items}" ref="list" :pagination="pagination">
+					<MkA v-for="antenna in items" :key="antenna.id" class="ljoevbzj" :to="`/my/antennas/${antenna.id}`">
+						<div class="name">{{ antenna.name }}</div>
+					</MkA>
+				</MkPagination>
+			</div>
 		</div>
-	</div>
-</MkSpacer></MkStickyContainer>
+	</MkSpacer>
+</MkStickyContainer>
 </template>
 
 <script lang="ts" setup>
@@ -37,7 +39,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ieepwinx {
 
 	> .add {
diff --git a/packages/frontend/src/pages/my-clips/index.vue b/packages/frontend/src/pages/my-clips/index.vue
index dd6b5b3a37..4bf1bde030 100644
--- a/packages/frontend/src/pages/my-clips/index.vue
+++ b/packages/frontend/src/pages/my-clips/index.vue
@@ -78,7 +78,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .qtcaoidl {
 	> .add {
 		margin: 0 auto 16px auto;
diff --git a/packages/frontend/src/pages/my-lists/index.vue b/packages/frontend/src/pages/my-lists/index.vue
index 3476436b27..24f9de1d90 100644
--- a/packages/frontend/src/pages/my-lists/index.vue
+++ b/packages/frontend/src/pages/my-lists/index.vue
@@ -55,7 +55,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .qkcjvfiv {
 	> .add {
 		margin: 0 auto var(--margin) auto;
diff --git a/packages/frontend/src/pages/my-lists/list.vue b/packages/frontend/src/pages/my-lists/list.vue
index f6234ffe44..e20fd5d241 100644
--- a/packages/frontend/src/pages/my-lists/list.vue
+++ b/packages/frontend/src/pages/my-lists/list.vue
@@ -126,7 +126,7 @@ definePageMetadata(computed(() => list ? {
 } : null));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mk-list-page {
 	> .members {
 		> ._content {
diff --git a/packages/frontend/src/pages/note.vue b/packages/frontend/src/pages/note.vue
index ba2bb91239..468a5c6d77 100644
--- a/packages/frontend/src/pages/note.vue
+++ b/packages/frontend/src/pages/note.vue
@@ -146,7 +146,9 @@ definePageMetadata(computed(() => note ? {
 .fade-leave-to {
 	opacity: 0;
 }
+</style>
 
+<style lang="scss">
 .fcuexfpr {
 	background: var(--bg);
 
diff --git a/packages/frontend/src/pages/page-editor/els/page-editor.el.image.vue b/packages/frontend/src/pages/page-editor/els/page-editor.el.image.vue
index a84cb1e80e..2fd0c7ccb8 100644
--- a/packages/frontend/src/pages/page-editor/els/page-editor.el.image.vue
+++ b/packages/frontend/src/pages/page-editor/els/page-editor.el.image.vue
@@ -54,7 +54,7 @@ onMounted(async () => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .oyyftmcf {
 	> .preview {
 		height: 150px;
diff --git a/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue b/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue
index 27324bdaef..14e369ba62 100644
--- a/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue
+++ b/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue
@@ -80,7 +80,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ilrvjyvi {
 	> .children {
 		margin: 16px;
diff --git a/packages/frontend/src/pages/page-editor/els/page-editor.el.text.vue b/packages/frontend/src/pages/page-editor/els/page-editor.el.text.vue
index 6f11e2a08b..97d037a9df 100644
--- a/packages/frontend/src/pages/page-editor/els/page-editor.el.text.vue
+++ b/packages/frontend/src/pages/page-editor/els/page-editor.el.text.vue
@@ -32,7 +32,7 @@ watch($$(text), () => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .vckmsadr {
 	> textarea {
 		display: block;
diff --git a/packages/frontend/src/pages/page-editor/page-editor.container.vue b/packages/frontend/src/pages/page-editor/page-editor.container.vue
index 15cdda5efb..abbbd503ff 100644
--- a/packages/frontend/src/pages/page-editor/page-editor.container.vue
+++ b/packages/frontend/src/pages/page-editor/page-editor.container.vue
@@ -68,7 +68,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .cpjygsrt {
 	position: relative;
 	overflow: hidden;
diff --git a/packages/frontend/src/pages/page-editor/page-editor.vue b/packages/frontend/src/pages/page-editor/page-editor.vue
index 968aa12de2..d1ce948822 100644
--- a/packages/frontend/src/pages/page-editor/page-editor.vue
+++ b/packages/frontend/src/pages/page-editor/page-editor.vue
@@ -303,7 +303,7 @@ definePageMetadata(computed(() => {
 }
 </style>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .jqqmcavi {
 	margin-bottom: 16px;
 
diff --git a/packages/frontend/src/pages/page.vue b/packages/frontend/src/pages/page.vue
index a95bfe485c..c2717a52f4 100644
--- a/packages/frontend/src/pages/page.vue
+++ b/packages/frontend/src/pages/page.vue
@@ -172,7 +172,9 @@ definePageMetadata(computed(() => page ? {
 .fade-leave-to {
 	opacity: 0;
 }
+</style>
 
+<style lang="scss">
 .xcukqgmh {
 	> .main {
 		padding: 32px;
diff --git a/packages/frontend/src/pages/pages.vue b/packages/frontend/src/pages/pages.vue
index b077180df8..99b084ff68 100644
--- a/packages/frontend/src/pages/pages.vue
+++ b/packages/frontend/src/pages/pages.vue
@@ -80,7 +80,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .rknalgpo {
 	&.my .ckltabjg:first-child {
 		margin-top: 16px;
diff --git a/packages/frontend/src/pages/preview.vue b/packages/frontend/src/pages/preview.vue
index 354f686e46..7d7e15c699 100644
--- a/packages/frontend/src/pages/preview.vue
+++ b/packages/frontend/src/pages/preview.vue
@@ -20,7 +20,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .graojtoi {
 	padding: var(--margin);
 }
diff --git a/packages/frontend/src/pages/registry.keys.vue b/packages/frontend/src/pages/registry.keys.vue
index f179fbe957..1dff2c9eb8 100644
--- a/packages/frontend/src/pages/registry.keys.vue
+++ b/packages/frontend/src/pages/registry.keys.vue
@@ -92,5 +92,5 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 </style>
diff --git a/packages/frontend/src/pages/registry.value.vue b/packages/frontend/src/pages/registry.value.vue
index 378420b1ba..2dfc0d1acd 100644
--- a/packages/frontend/src/pages/registry.value.vue
+++ b/packages/frontend/src/pages/registry.value.vue
@@ -119,5 +119,5 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 </style>
diff --git a/packages/frontend/src/pages/registry.vue b/packages/frontend/src/pages/registry.vue
index a2c65294fc..3a149a4f32 100644
--- a/packages/frontend/src/pages/registry.vue
+++ b/packages/frontend/src/pages/registry.vue
@@ -70,5 +70,5 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 </style>
diff --git a/packages/frontend/src/pages/reset-password.vue b/packages/frontend/src/pages/reset-password.vue
index 8ec15f6425..6fa0a84483 100644
--- a/packages/frontend/src/pages/reset-password.vue
+++ b/packages/frontend/src/pages/reset-password.vue
@@ -54,6 +54,6 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/pages/scratchpad.vue b/packages/frontend/src/pages/scratchpad.vue
index edb2d8e18c..80c40cec5d 100644
--- a/packages/frontend/src/pages/scratchpad.vue
+++ b/packages/frontend/src/pages/scratchpad.vue
@@ -116,7 +116,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .iltifgqe {
 	padding: 16px;
 
diff --git a/packages/frontend/src/pages/settings/accounts.vue b/packages/frontend/src/pages/settings/accounts.vue
index 493d3b2618..d4ddf1936f 100644
--- a/packages/frontend/src/pages/settings/accounts.vue
+++ b/packages/frontend/src/pages/settings/accounts.vue
@@ -112,7 +112,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .lcjjdxlm {
 	display: flex;
 	padding: 16px;
diff --git a/packages/frontend/src/pages/settings/apps.vue b/packages/frontend/src/pages/settings/apps.vue
index 05abadff23..cd2ab6ce35 100644
--- a/packages/frontend/src/pages/settings/apps.vue
+++ b/packages/frontend/src/pages/settings/apps.vue
@@ -70,7 +70,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .bfomjevm {
 	display: flex;
 	padding: 16px;
diff --git a/packages/frontend/src/pages/settings/drive.vue b/packages/frontend/src/pages/settings/drive.vue
index 2d45b1add8..52ad79669b 100644
--- a/packages/frontend/src/pages/settings/drive.vue
+++ b/packages/frontend/src/pages/settings/drive.vue
@@ -124,8 +124,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
-
+<style lang="scss">
 @use "sass:math";
 
 .uawsfosz {
diff --git a/packages/frontend/src/pages/settings/index.vue b/packages/frontend/src/pages/settings/index.vue
index 01436cd554..2ba0ddb195 100644
--- a/packages/frontend/src/pages/settings/index.vue
+++ b/packages/frontend/src/pages/settings/index.vue
@@ -244,7 +244,7 @@ definePageMetadata(INFO);
 // h 700
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .vvcocwet {
 	> .body {
 		> .nav {
diff --git a/packages/frontend/src/pages/settings/plugin.vue b/packages/frontend/src/pages/settings/plugin.vue
index 905efd833d..be7a5e20fa 100644
--- a/packages/frontend/src/pages/settings/plugin.vue
+++ b/packages/frontend/src/pages/settings/plugin.vue
@@ -93,6 +93,6 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/pages/settings/profile.vue b/packages/frontend/src/pages/settings/profile.vue
index 14eeeaaa11..716b6ef297 100644
--- a/packages/frontend/src/pages/settings/profile.vue
+++ b/packages/frontend/src/pages/settings/profile.vue
@@ -189,7 +189,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .llvierxe {
 	position: relative;
 	background-size: cover;
diff --git a/packages/frontend/src/pages/settings/reaction.vue b/packages/frontend/src/pages/settings/reaction.vue
index 2748cd7d4e..b0afd06f6c 100644
--- a/packages/frontend/src/pages/settings/reaction.vue
+++ b/packages/frontend/src/pages/settings/reaction.vue
@@ -135,7 +135,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .zoaiodol {
 	padding: 12px;
 	font-size: 1.1em;
diff --git a/packages/frontend/src/pages/settings/security.vue b/packages/frontend/src/pages/settings/security.vue
index 33f49eb3ef..dbf83f9971 100644
--- a/packages/frontend/src/pages/settings/security.vue
+++ b/packages/frontend/src/pages/settings/security.vue
@@ -107,7 +107,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .timnmucd {
 	padding: 16px;
 
diff --git a/packages/frontend/src/pages/settings/theme.vue b/packages/frontend/src/pages/settings/theme.vue
index f37c213b06..106e03e1ab 100644
--- a/packages/frontend/src/pages/settings/theme.vue
+++ b/packages/frontend/src/pages/settings/theme.vue
@@ -164,7 +164,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .rfqxtzch {
 	border-radius: 6px;
 
diff --git a/packages/frontend/src/pages/share.vue b/packages/frontend/src/pages/share.vue
index a7e797eeab..38ae6146af 100644
--- a/packages/frontend/src/pages/share.vue
+++ b/packages/frontend/src/pages/share.vue
@@ -16,7 +16,7 @@
 			class="_panel"
 			@posted="state = 'posted'"
 		/>
-		<MkButton v-else-if="state === 'posted'" primary class="close" @click="close()">{{ i18n.ts.close }}</MkButton>
+		<MkButton v-else-if="state === 'posted'" primary :class="$style.close" @click="close()">{{ i18n.ts.close }}</MkButton>
 	</MkSpacer>
 </MkStickyContainer>
 </template>
@@ -69,14 +69,14 @@ async function init() {
 				...(visibleAccts ? visibleAccts.split(',').map(Acct.parse) : []),
 			]
 			// TypeScriptの指示通りに変換する
-			.map(q => 'username' in q ? { username: q.username, host: q.host === null ? undefined : q.host } : q)
-			.map(q => os.api('users/show', q)
-				.then(user => {
-					visibleUsers.push(user);
-				}, () => {
-					console.error(`Invalid user query: ${JSON.stringify(q)}`);
-				}),
-			),
+				.map(q => 'username' in q ? { username: q.username, host: q.host === null ? undefined : q.host } : q)
+				.map(q => os.api('users/show', q)
+					.then(user => {
+						visibleUsers.push(user);
+					}, () => {
+						console.error(`Invalid user query: ${JSON.stringify(q)}`);
+					}),
+				),
 		);
 	}
 
@@ -120,13 +120,13 @@ async function init() {
 		if (fileIds) {
 			await Promise.all(
 				fileIds.split(',')
-				.map(fileId => os.api('drive/files/show', { fileId })
-					.then(file => {
-						files.push(file);
-					}, () => {
-						console.error(`Failed to fetch a file ${fileId}`);
-					}),
-				),
+					.map(fileId => os.api('drive/files/show', { fileId })
+						.then(file => {
+							files.push(file);
+						}, () => {
+							console.error(`Failed to fetch a file ${fileId}`);
+						}),
+					),
 			);
 		}
 		//#endregion
@@ -162,7 +162,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss" module>
 .close {
 	margin: 16px auto;
 }
diff --git a/packages/frontend/src/pages/signup-complete.vue b/packages/frontend/src/pages/signup-complete.vue
index 5459532310..7ca842a668 100644
--- a/packages/frontend/src/pages/signup-complete.vue
+++ b/packages/frontend/src/pages/signup-complete.vue
@@ -36,6 +36,6 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/pages/theme-editor.vue b/packages/frontend/src/pages/theme-editor.vue
index d8ff170ca2..09a59c7ffc 100644
--- a/packages/frontend/src/pages/theme-editor.vue
+++ b/packages/frontend/src/pages/theme-editor.vue
@@ -228,7 +228,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .cwepdizn {
 	::v-deep(.cwepdizn-colors) {
 		text-align: center;
diff --git a/packages/frontend/src/pages/timeline.vue b/packages/frontend/src/pages/timeline.vue
index 1c9e389367..eeccb7c1bc 100644
--- a/packages/frontend/src/pages/timeline.vue
+++ b/packages/frontend/src/pages/timeline.vue
@@ -154,7 +154,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .cmuxhskf {
 	> .new {
 		position: sticky;
diff --git a/packages/frontend/src/pages/user-info.vue b/packages/frontend/src/pages/user-info.vue
index addc8db9e6..cf2de8eb53 100644
--- a/packages/frontend/src/pages/user-info.vue
+++ b/packages/frontend/src/pages/user-info.vue
@@ -385,7 +385,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .aeakzknw {
 	display: flex;
 	align-items: center;
diff --git a/packages/frontend/src/pages/user-list-timeline.vue b/packages/frontend/src/pages/user-list-timeline.vue
index fdb3167375..f968d36d1d 100644
--- a/packages/frontend/src/pages/user-list-timeline.vue
+++ b/packages/frontend/src/pages/user-list-timeline.vue
@@ -82,7 +82,7 @@ definePageMetadata(computed(() => list ? {
 } : null));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .eqqrhokj {
 	padding: var(--margin);
 
diff --git a/packages/frontend/src/pages/user/clips.vue b/packages/frontend/src/pages/user/clips.vue
index 8c71aacb0c..4df48db023 100644
--- a/packages/frontend/src/pages/user/clips.vue
+++ b/packages/frontend/src/pages/user/clips.vue
@@ -29,7 +29,7 @@ const pagination = {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .pages-user-clips {
 	> .list {
 		> .item {
diff --git a/packages/frontend/src/pages/user/follow-list.vue b/packages/frontend/src/pages/user/follow-list.vue
index d42acd838f..c8ae1a2327 100644
--- a/packages/frontend/src/pages/user/follow-list.vue
+++ b/packages/frontend/src/pages/user/follow-list.vue
@@ -36,7 +36,7 @@ const followersPagination = {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mk-following-or-followers {
 	> .users {
 		display: grid;
diff --git a/packages/frontend/src/pages/user/followers.vue b/packages/frontend/src/pages/user/followers.vue
index 17c2843381..3803f80c7a 100644
--- a/packages/frontend/src/pages/user/followers.vue
+++ b/packages/frontend/src/pages/user/followers.vue
@@ -57,5 +57,5 @@ definePageMetadata(computed(() => user ? {
 } : null));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 </style>
diff --git a/packages/frontend/src/pages/user/following.vue b/packages/frontend/src/pages/user/following.vue
index 03892ec03d..31c3de9920 100644
--- a/packages/frontend/src/pages/user/following.vue
+++ b/packages/frontend/src/pages/user/following.vue
@@ -57,5 +57,5 @@ definePageMetadata(computed(() => user ? {
 } : null));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 </style>
diff --git a/packages/frontend/src/pages/user/gallery.vue b/packages/frontend/src/pages/user/gallery.vue
index b80e83fb11..7db7d14e3a 100644
--- a/packages/frontend/src/pages/user/gallery.vue
+++ b/packages/frontend/src/pages/user/gallery.vue
@@ -28,7 +28,7 @@ const pagination = {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .jrnovfpt {
 	display: grid;
 	grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue
index 43c1b37e1d..fa5167c149 100644
--- a/packages/frontend/src/pages/user/home.vue
+++ b/packages/frontend/src/pages/user/home.vue
@@ -188,7 +188,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ftskorzw {
 
 	> .main {
diff --git a/packages/frontend/src/pages/user/index.photos.vue b/packages/frontend/src/pages/user/index.photos.vue
index b33979a79d..472e82735f 100644
--- a/packages/frontend/src/pages/user/index.photos.vue
+++ b/packages/frontend/src/pages/user/index.photos.vue
@@ -73,7 +73,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ujigsodd {
 	padding: 8px;
 
diff --git a/packages/frontend/src/pages/user/pages.vue b/packages/frontend/src/pages/user/pages.vue
index 7833d6c42c..1a7cb0fcd8 100644
--- a/packages/frontend/src/pages/user/pages.vue
+++ b/packages/frontend/src/pages/user/pages.vue
@@ -25,6 +25,6 @@ const pagination = {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/pages/user/reactions.vue b/packages/frontend/src/pages/user/reactions.vue
index ab3df34301..fc165f7113 100644
--- a/packages/frontend/src/pages/user/reactions.vue
+++ b/packages/frontend/src/pages/user/reactions.vue
@@ -33,7 +33,7 @@ const pagination = {
 };
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .afdcfbfb {
 	> .header {
 		display: flex;
diff --git a/packages/frontend/src/pages/welcome.entrance.a.vue b/packages/frontend/src/pages/welcome.entrance.a.vue
index bfa54d39f2..c4ab5174b6 100644
--- a/packages/frontend/src/pages/welcome.entrance.a.vue
+++ b/packages/frontend/src/pages/welcome.entrance.a.vue
@@ -127,7 +127,7 @@ function showMenu(ev) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .rsqzvsbo {
 	> .top {
 		display: flex;
diff --git a/packages/frontend/src/pages/welcome.entrance.b.vue b/packages/frontend/src/pages/welcome.entrance.b.vue
index 8230adaf1f..8cdf3cfc6b 100644
--- a/packages/frontend/src/pages/welcome.entrance.b.vue
+++ b/packages/frontend/src/pages/welcome.entrance.b.vue
@@ -38,12 +38,12 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { toUnicode } from 'punycode/';
+import XTimeline from './welcome.timeline.vue';
 import XSigninDialog from '@/components/MkSigninDialog.vue';
 import XSignupDialog from '@/components/MkSignupDialog.vue';
 import MkButton from '@/components/MkButton.vue';
 import XNote from '@/components/MkNote.vue';
 import MkFeaturedPhotos from '@/components/MkFeaturedPhotos.vue';
-import XTimeline from './welcome.timeline.vue';
 import { host, instanceName } from '@/config';
 import * as os from '@/os';
 import number from '@/filters/number';
@@ -118,7 +118,7 @@ export default defineComponent({
 				text: this.$ts.help,
 				icon: 'ti ti-question-circle',
 				action: () => {
-					window.open(`https://misskey-hub.net/help.md`, '_blank');
+					window.open('https://misskey-hub.net/help.md', '_blank');
 				},
 			}], ev.currentTarget ?? ev.target);
 		},
@@ -128,7 +128,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .rsqzvsbo {
 	> .top {
 		min-height: 100vh;
diff --git a/packages/frontend/src/pages/welcome.entrance.c.vue b/packages/frontend/src/pages/welcome.entrance.c.vue
index d2d07bb1f0..c05ba908e0 100644
--- a/packages/frontend/src/pages/welcome.entrance.c.vue
+++ b/packages/frontend/src/pages/welcome.entrance.c.vue
@@ -58,12 +58,12 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { toUnicode } from 'punycode/';
+import XTimeline from './welcome.timeline.vue';
 import XSigninDialog from '@/components/MkSigninDialog.vue';
 import XSignupDialog from '@/components/MkSignupDialog.vue';
 import MkButton from '@/components/MkButton.vue';
 import XNote from '@/components/MkNote.vue';
 import MkFeaturedPhotos from '@/components/MkFeaturedPhotos.vue';
-import XTimeline from './welcome.timeline.vue';
 import { host, instanceName } from '@/config';
 import * as os from '@/os';
 import number from '@/filters/number';
@@ -138,7 +138,7 @@ export default defineComponent({
 				text: this.$ts.help,
 				icon: 'ti ti-question-circle',
 				action: () => {
-					window.open(`https://misskey-hub.net/help.md`, '_blank');
+					window.open('https://misskey-hub.net/help.md', '_blank');
 				},
 			}], ev.currentTarget ?? ev.target);
 		},
@@ -148,7 +148,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .rsqzvsbo {
 	> .top {
 		display: flex;
diff --git a/packages/frontend/src/pages/welcome.setup.vue b/packages/frontend/src/pages/welcome.setup.vue
index 2729d30d4b..be91acb238 100644
--- a/packages/frontend/src/pages/welcome.setup.vue
+++ b/packages/frontend/src/pages/welcome.setup.vue
@@ -54,7 +54,7 @@ function submit() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mk-setup {
 	border-radius: var(--radius);
 	box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
diff --git a/packages/frontend/src/pages/welcome.timeline.vue b/packages/frontend/src/pages/welcome.timeline.vue
index d6a88540d1..d8c93053db 100644
--- a/packages/frontend/src/pages/welcome.timeline.vue
+++ b/packages/frontend/src/pages/welcome.timeline.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="civpbkhh">
-	<div ref="scroll" class="scrollbox" v-bind:class="{ scroll: isScrolling }">
+	<div ref="scroll" class="scrollbox" :class="{ scroll: isScrolling }">
 		<div v-for="note in notes" class="note">
 			<div class="content _panel">
 				<div class="body">
@@ -12,7 +12,7 @@
 					<XMediaList :media-list="note.files"/>
 				</div>
 				<div v-if="note.poll">
-					<XPoll :note="note" :readOnly="true"/>
+					<XPoll :note="note" :read-only="true"/>
 				</div>
 			</div>
 			<XReactionsViewer ref="reactionsViewer" :note="note"/>
@@ -71,7 +71,9 @@ export default defineComponent({
 		transform: translate3d(0, calc(-100% + 90vh), 0);
 	}
 }
+</style>
 
+<style lang="scss">
 .civpbkhh {
 	text-align: right;
 
diff --git a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
index 50b28de063..b4831ece87 100644
--- a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
+++ b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
@@ -128,7 +128,7 @@ function more() {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .kmwsukvl {
 	> .body {
 		display: flex;
diff --git a/packages/frontend/src/ui/_common_/navbar.vue b/packages/frontend/src/ui/_common_/navbar.vue
index b82da15f13..ae1f5896e8 100644
--- a/packages/frontend/src/ui/_common_/navbar.vue
+++ b/packages/frontend/src/ui/_common_/navbar.vue
@@ -153,7 +153,7 @@ function more(ev: MouseEvent) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mvcprjjd {
 	$nav-width: 250px;
 	$nav-icon-only-width: 80px;
diff --git a/packages/frontend/src/ui/_common_/statusbar-federation.vue b/packages/frontend/src/ui/_common_/statusbar-federation.vue
index 24fc4f6f6d..84a2aa727e 100644
--- a/packages/frontend/src/ui/_common_/statusbar-federation.vue
+++ b/packages/frontend/src/ui/_common_/statusbar-federation.vue
@@ -77,7 +77,9 @@ function getInstanceIcon(instance): string {
   opacity: 0;
 	transform: translateY(100%);
 }
+</style>
 
+<style lang="scss">
 .nmidsaqw {
 	display: inline-block;
 	position: relative;
diff --git a/packages/frontend/src/ui/_common_/statusbar-rss.vue b/packages/frontend/src/ui/_common_/statusbar-rss.vue
index e7f88e4984..e6f383244d 100644
--- a/packages/frontend/src/ui/_common_/statusbar-rss.vue
+++ b/packages/frontend/src/ui/_common_/statusbar-rss.vue
@@ -69,7 +69,9 @@ useInterval(tick, Math.max(5000, props.refreshIntervalSec * 1000), {
   opacity: 0;
 	transform: translateY(100%);
 }
+</style>
 
+<style lang="scss">
 .xbhtxfms {
 	display: inline-block;
 	position: relative;
diff --git a/packages/frontend/src/ui/_common_/statusbar-user-list.vue b/packages/frontend/src/ui/_common_/statusbar-user-list.vue
index f4d989c387..28fe646fcb 100644
--- a/packages/frontend/src/ui/_common_/statusbar-user-list.vue
+++ b/packages/frontend/src/ui/_common_/statusbar-user-list.vue
@@ -74,7 +74,9 @@ useInterval(tick, Math.max(5000, props.refreshIntervalSec * 1000), {
   opacity: 0;
 	transform: translateY(100%);
 }
+</style>
 
+<style lang="scss">
 .osdsvwzy {
 	display: inline-block;
 	position: relative;
diff --git a/packages/frontend/src/ui/_common_/statusbars.vue b/packages/frontend/src/ui/_common_/statusbars.vue
index 114ca5be8c..c51bad0b4d 100644
--- a/packages/frontend/src/ui/_common_/statusbars.vue
+++ b/packages/frontend/src/ui/_common_/statusbars.vue
@@ -26,7 +26,7 @@ const XFederation = defineAsyncComponent(() => import('./statusbar-federation.vu
 const XUserList = defineAsyncComponent(() => import('./statusbar-user-list.vue'));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .dlrsnxqu {
 	font-size: 15px;
 	background: var(--panel);
diff --git a/packages/frontend/src/ui/_common_/stream-indicator.vue b/packages/frontend/src/ui/_common_/stream-indicator.vue
index a855de8ab9..931ef122ad 100644
--- a/packages/frontend/src/ui/_common_/stream-indicator.vue
+++ b/packages/frontend/src/ui/_common_/stream-indicator.vue
@@ -34,7 +34,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .nsbbhtug {
 	position: fixed;
 	z-index: 16385;
diff --git a/packages/frontend/src/ui/_common_/upload.vue b/packages/frontend/src/ui/_common_/upload.vue
index 70882bd251..d05a6c7a2f 100644
--- a/packages/frontend/src/ui/_common_/upload.vue
+++ b/packages/frontend/src/ui/_common_/upload.vue
@@ -26,7 +26,7 @@ import { i18n } from '@/i18n';
 const zIndex = os.claimZIndex('high');
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mk-uploader {
 	position: fixed;
 	right: 16px;
diff --git a/packages/frontend/src/ui/classic.header.vue b/packages/frontend/src/ui/classic.header.vue
index 46d79e6355..e32a95337b 100644
--- a/packages/frontend/src/ui/classic.header.vue
+++ b/packages/frontend/src/ui/classic.header.vue
@@ -117,7 +117,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .azykntjl {
 	$height: 60px;
 	$avatar-size: 32px;
diff --git a/packages/frontend/src/ui/classic.sidebar.vue b/packages/frontend/src/ui/classic.sidebar.vue
index dac09ea703..3b02d51041 100644
--- a/packages/frontend/src/ui/classic.sidebar.vue
+++ b/packages/frontend/src/ui/classic.sidebar.vue
@@ -135,7 +135,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .npcljfve {
 	$ui-font-size: 1em; // TODO: どこかに集約したい
 	$nav-icon-only-width: 78px; // TODO: どこかに集約したい
diff --git a/packages/frontend/src/ui/classic.vue b/packages/frontend/src/ui/classic.vue
index 44b017ea96..85a35b9118 100644
--- a/packages/frontend/src/ui/classic.vue
+++ b/packages/frontend/src/ui/classic.vue
@@ -193,7 +193,9 @@ onMounted(() => {
 .tray-back-leave-active {
 	opacity: 0;
 }
+</style>
 
+<style lang="scss">
 .gbhvwtnk {
 	$ui-font-size: 1em;
 	$widgets-hide-threshold: 1200px;
diff --git a/packages/frontend/src/ui/deck.vue b/packages/frontend/src/ui/deck.vue
index f3415cfd09..ddb2170e6d 100644
--- a/packages/frontend/src/ui/deck.vue
+++ b/packages/frontend/src/ui/deck.vue
@@ -245,7 +245,9 @@ async function deleteProfile() {
 .menu-back-leave-active {
 	opacity: 0;
 }
+</style>
 
+<style lang="scss">
 .mk-deck {
 	$nav-hide-threshold: 650px; // TODO: どこかに集約したい
 
diff --git a/packages/frontend/src/ui/deck/antenna-column.vue b/packages/frontend/src/ui/deck/antenna-column.vue
index ba14530662..3dc6e33690 100644
--- a/packages/frontend/src/ui/deck/antenna-column.vue
+++ b/packages/frontend/src/ui/deck/antenna-column.vue
@@ -66,5 +66,5 @@ defineExpose({
 */
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 </style>
diff --git a/packages/frontend/src/ui/deck/column.vue b/packages/frontend/src/ui/deck/column.vue
index 2a99b621e6..40fae0831a 100644
--- a/packages/frontend/src/ui/deck/column.vue
+++ b/packages/frontend/src/ui/deck/column.vue
@@ -245,7 +245,7 @@ function onDrop(ev) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .dnpfarvg {
 	--root-margin: 10px;
 	--deckColumnHeaderHeight: 40px;
diff --git a/packages/frontend/src/ui/deck/list-column.vue b/packages/frontend/src/ui/deck/list-column.vue
index d9f3f7b4e7..571804b33c 100644
--- a/packages/frontend/src/ui/deck/list-column.vue
+++ b/packages/frontend/src/ui/deck/list-column.vue
@@ -54,5 +54,5 @@ const menu = [{
 }];
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 </style>
diff --git a/packages/frontend/src/ui/deck/tl-column.vue b/packages/frontend/src/ui/deck/tl-column.vue
index 49b29145ff..25cb4839fa 100644
--- a/packages/frontend/src/ui/deck/tl-column.vue
+++ b/packages/frontend/src/ui/deck/tl-column.vue
@@ -104,7 +104,7 @@ const menu = [{
 }];
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .iwaalbte {
 	text-align: center;
 
diff --git a/packages/frontend/src/ui/deck/widgets-column.vue b/packages/frontend/src/ui/deck/widgets-column.vue
index edc54c1c2b..ea2bb22a5f 100644
--- a/packages/frontend/src/ui/deck/widgets-column.vue
+++ b/packages/frontend/src/ui/deck/widgets-column.vue
@@ -54,7 +54,7 @@ const menu = [{
 }];
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .wtdtxvec {
 	--margin: 8px;
 	--panelBorder: none;
diff --git a/packages/frontend/src/ui/universal.vue b/packages/frontend/src/ui/universal.vue
index 2cb8a9d6a6..4340124a96 100644
--- a/packages/frontend/src/ui/universal.vue
+++ b/packages/frontend/src/ui/universal.vue
@@ -215,7 +215,9 @@ const wallpaper = localStorage.getItem('wallpaper') != null;
 .menuDrawer-back-leave-active {
 	opacity: 0;
 }
+</style>
 
+<style lang="scss">
 .dkgtipfy {
 	$ui-font-size: 1em; // TODO: どこかに集約したい
 	$widgets-hide-threshold: 1090px;
diff --git a/packages/frontend/src/ui/universal.widgets.vue b/packages/frontend/src/ui/universal.widgets.vue
index 002aab1090..9a7b833fe0 100644
--- a/packages/frontend/src/ui/universal.widgets.vue
+++ b/packages/frontend/src/ui/universal.widgets.vue
@@ -81,7 +81,7 @@ function updateWidgets(thisWidgets) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .efzpzdvf {
 	position: sticky;
 	height: min-content;
diff --git a/packages/frontend/src/ui/visitor/kanban.vue b/packages/frontend/src/ui/visitor/kanban.vue
index 51e47f277d..efb929ad95 100644
--- a/packages/frontend/src/ui/visitor/kanban.vue
+++ b/packages/frontend/src/ui/visitor/kanban.vue
@@ -106,7 +106,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .rwqkcmrc {
 	position: relative;
 	text-align: center;
diff --git a/packages/frontend/src/ui/zen.vue b/packages/frontend/src/ui/zen.vue
index 84c96a1dae..9aa79e9453 100644
--- a/packages/frontend/src/ui/zen.vue
+++ b/packages/frontend/src/ui/zen.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="mk-app">
+<div class="mk-zen">
 	<RouterView/>
 
 	<XCommon/>
@@ -26,8 +26,8 @@ provideMetadataReceiver((info) => {
 document.documentElement.style.overflowY = 'scroll';
 </script>
 
-<style lang="scss" scoped>
-.mk-app {
+<style lang="scss">
+.mk-zen {
 	min-height: 100dvh;
 	box-sizing: border-box;
 }
diff --git a/packages/frontend/src/widgets/aichan.vue b/packages/frontend/src/widgets/aichan.vue
index 828490fd9c..ec3a52c814 100644
--- a/packages/frontend/src/widgets/aichan.vue
+++ b/packages/frontend/src/widgets/aichan.vue
@@ -64,7 +64,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .dedjhjmo {
 	width: 100%;
 	height: 350px;
diff --git a/packages/frontend/src/widgets/aiscript.vue b/packages/frontend/src/widgets/aiscript.vue
index 4009edb8b8..a0d1b755f6 100644
--- a/packages/frontend/src/widgets/aiscript.vue
+++ b/packages/frontend/src/widgets/aiscript.vue
@@ -119,7 +119,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .uylguesu {
 	text-align: right;
 
diff --git a/packages/frontend/src/widgets/button.vue b/packages/frontend/src/widgets/button.vue
index f0148d7f4e..48890a6225 100644
--- a/packages/frontend/src/widgets/button.vue
+++ b/packages/frontend/src/widgets/button.vue
@@ -97,7 +97,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mkw-button {
 }
 </style>
diff --git a/packages/frontend/src/widgets/calendar.vue b/packages/frontend/src/widgets/calendar.vue
index 99bd36e2fc..106cd5f24d 100644
--- a/packages/frontend/src/widgets/calendar.vue
+++ b/packages/frontend/src/widgets/calendar.vue
@@ -115,7 +115,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mkw-calendar {
 	padding: 16px 0;
 
diff --git a/packages/frontend/src/widgets/clock.vue b/packages/frontend/src/widgets/clock.vue
index dc99b6631e..63b58ab6ec 100644
--- a/packages/frontend/src/widgets/clock.vue
+++ b/packages/frontend/src/widgets/clock.vue
@@ -143,7 +143,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .vubelbmv {
 	position: relative;
 
diff --git a/packages/frontend/src/widgets/digital-clock.vue b/packages/frontend/src/widgets/digital-clock.vue
index d2bfd523f3..142c1950a8 100644
--- a/packages/frontend/src/widgets/digital-clock.vue
+++ b/packages/frontend/src/widgets/digital-clock.vue
@@ -79,7 +79,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mkw-digitalClock {
 	padding: 16px 0;
 	text-align: center;
diff --git a/packages/frontend/src/widgets/federation.vue b/packages/frontend/src/widgets/federation.vue
index 3374783b0c..7bb61f5997 100644
--- a/packages/frontend/src/widgets/federation.vue
+++ b/packages/frontend/src/widgets/federation.vue
@@ -83,7 +83,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .wbrkwalb {
 	$bodyTitleHieght: 18px;
 	$bodyInfoHieght: 16px;
diff --git a/packages/frontend/src/widgets/instance-cloud.vue b/packages/frontend/src/widgets/instance-cloud.vue
index 4965616995..26bc3ec638 100644
--- a/packages/frontend/src/widgets/instance-cloud.vue
+++ b/packages/frontend/src/widgets/instance-cloud.vue
@@ -76,6 +76,6 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 
 </style>
diff --git a/packages/frontend/src/widgets/memo.vue b/packages/frontend/src/widgets/memo.vue
index 1cc0e10bba..e28d8a6c3d 100644
--- a/packages/frontend/src/widgets/memo.vue
+++ b/packages/frontend/src/widgets/memo.vue
@@ -67,7 +67,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .otgbylcu {
 	padding-bottom: 28px + 16px;
 
diff --git a/packages/frontend/src/widgets/online-users.vue b/packages/frontend/src/widgets/online-users.vue
index e9ab79b111..f2a9f93b0d 100644
--- a/packages/frontend/src/widgets/online-users.vue
+++ b/packages/frontend/src/widgets/online-users.vue
@@ -57,7 +57,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mkw-onlineUsers {
 	text-align: center;
 
diff --git a/packages/frontend/src/widgets/rss.vue b/packages/frontend/src/widgets/rss.vue
index c0338c8e47..6080680ad1 100644
--- a/packages/frontend/src/widgets/rss.vue
+++ b/packages/frontend/src/widgets/rss.vue
@@ -73,7 +73,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .ekmkgxbj {
 	> .feed {
 		padding: 0;
diff --git a/packages/frontend/src/widgets/server-metric/cpu-mem.vue b/packages/frontend/src/widgets/server-metric/cpu-mem.vue
index 80a8e427e1..59ecfc7e6a 100644
--- a/packages/frontend/src/widgets/server-metric/cpu-mem.vue
+++ b/packages/frontend/src/widgets/server-metric/cpu-mem.vue
@@ -137,7 +137,7 @@ function onStatsLog(statsLog) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .lcfyofjk {
 	display: flex;
 
diff --git a/packages/frontend/src/widgets/server-metric/cpu.vue b/packages/frontend/src/widgets/server-metric/cpu.vue
index e7b2226d1f..91c4e00fb3 100644
--- a/packages/frontend/src/widgets/server-metric/cpu.vue
+++ b/packages/frontend/src/widgets/server-metric/cpu.vue
@@ -33,7 +33,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .vrvdvrys {
 	display: flex;
 	padding: 16px;
diff --git a/packages/frontend/src/widgets/server-metric/disk.vue b/packages/frontend/src/widgets/server-metric/disk.vue
index 3d22d05383..d2cabd0442 100644
--- a/packages/frontend/src/widgets/server-metric/disk.vue
+++ b/packages/frontend/src/widgets/server-metric/disk.vue
@@ -25,7 +25,7 @@ const used = $computed(() => props.meta.fs.used);
 const available = $computed(() => props.meta.fs.total - props.meta.fs.used);
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .zbwaqsat {
 	display: flex;
 	padding: 16px;
diff --git a/packages/frontend/src/widgets/server-metric/mem.vue b/packages/frontend/src/widgets/server-metric/mem.vue
index 6018eb4265..96bc5f49d5 100644
--- a/packages/frontend/src/widgets/server-metric/mem.vue
+++ b/packages/frontend/src/widgets/server-metric/mem.vue
@@ -41,7 +41,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .zlxnikvl {
 	display: flex;
 	padding: 16px;
diff --git a/packages/frontend/src/widgets/server-metric/net.vue b/packages/frontend/src/widgets/server-metric/net.vue
index ab8b0fe471..dd2a990e02 100644
--- a/packages/frontend/src/widgets/server-metric/net.vue
+++ b/packages/frontend/src/widgets/server-metric/net.vue
@@ -110,7 +110,7 @@ function onStatsLog(statsLog) {
 }
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .oxxrhrto {
 	display: flex;
 
diff --git a/packages/frontend/src/widgets/server-metric/pie.vue b/packages/frontend/src/widgets/server-metric/pie.vue
index 868dbc0484..14b34d266f 100644
--- a/packages/frontend/src/widgets/server-metric/pie.vue
+++ b/packages/frontend/src/widgets/server-metric/pie.vue
@@ -33,7 +33,7 @@ const color = $computed(() => `hsl(${180 - (props.value * 180)}, 80%, 70%)`);
 const strokeDashoffset = $computed(() => (1 - props.value) * (Math.PI * (r * 2)));
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .hsalcinq {
 	display: block;
 	height: 100%;
diff --git a/packages/frontend/src/widgets/slideshow.vue b/packages/frontend/src/widgets/slideshow.vue
index e317b8ab94..2a8d049b4a 100644
--- a/packages/frontend/src/widgets/slideshow.vue
+++ b/packages/frontend/src/widgets/slideshow.vue
@@ -116,7 +116,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .kvausudm {
 	position: relative;
 
diff --git a/packages/frontend/src/widgets/trends.vue b/packages/frontend/src/widgets/trends.vue
index 02eec0431e..f4be22f6d2 100644
--- a/packages/frontend/src/widgets/trends.vue
+++ b/packages/frontend/src/widgets/trends.vue
@@ -72,7 +72,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .wbrkwala {
 	height: (62px + 1px) + (62px + 1px) + (62px + 1px) + (62px + 1px) + 62px;
 	overflow: hidden;
diff --git a/packages/frontend/src/widgets/unix-clock.vue b/packages/frontend/src/widgets/unix-clock.vue
index cf85ac782c..d97de34ad2 100644
--- a/packages/frontend/src/widgets/unix-clock.vue
+++ b/packages/frontend/src/widgets/unix-clock.vue
@@ -91,7 +91,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 .mkw-unixClock {
 	padding: 16px 0;
 	text-align: center;
-- 
cgit v1.2.3-freya


From 4f15b6f7c2800f60e702b0137a1d596e89f5029c Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Tue, 27 Dec 2022 18:29:39 +0900
Subject: Revert "perf?(client): remove needless scoped annotation for style"

This reverts commit ada04c1932dd694af1775e562fdcfa2c506454de.
---
 packages/frontend/src/components/MkAbuseReport.vue |  2 +-
 .../src/components/MkAbuseReportWindow.vue         |  2 +-
 packages/frontend/src/components/MkAnalogClock.vue |  2 +-
 .../frontend/src/components/MkAutocomplete.vue     |  2 +-
 packages/frontend/src/components/MkButton.vue      |  2 +-
 .../src/components/MkChannelFollowButton.vue       |  2 +-
 .../frontend/src/components/MkChannelPreview.vue   |  2 +-
 packages/frontend/src/components/MkChart.vue       |  2 +-
 .../frontend/src/components/MkChartTooltip.vue     |  2 +-
 packages/frontend/src/components/MkContainer.vue   |  2 -
 packages/frontend/src/components/MkContextMenu.vue | 10 ++--
 .../frontend/src/components/MkCropperDialog.vue    |  2 -
 packages/frontend/src/components/MkCwButton.vue    |  2 +-
 packages/frontend/src/components/MkDialog.vue      |  2 +-
 .../frontend/src/components/MkDigitalClock.vue     |  2 +-
 packages/frontend/src/components/MkDrive.file.vue  |  2 +-
 .../frontend/src/components/MkDrive.folder.vue     |  2 +-
 .../frontend/src/components/MkDrive.navFolder.vue  |  5 +-
 packages/frontend/src/components/MkDrive.vue       |  2 +-
 .../src/components/MkDriveFileThumbnail.vue        |  2 +-
 .../src/components/MkEmojiPicker.section.vue       |  2 +-
 packages/frontend/src/components/MkEmojiPicker.vue |  2 +-
 .../src/components/MkEmojiPickerDialog.vue         |  2 +-
 .../src/components/MkEmojiPickerWindow.vue         |  5 +-
 .../frontend/src/components/MkFeaturedPhotos.vue   |  2 +-
 .../frontend/src/components/MkFileListForAdmin.vue |  2 -
 packages/frontend/src/components/MkFolder.vue      | 12 -----
 .../frontend/src/components/MkFollowButton.vue     |  2 +-
 .../frontend/src/components/MkForgotPassword.vue   |  5 +-
 packages/frontend/src/components/MkFormDialog.vue  |  2 +-
 .../src/components/MkGalleryPostPreview.vue        |  2 +-
 packages/frontend/src/components/MkGoogle.vue      |  2 +-
 packages/frontend/src/components/MkImageViewer.vue |  2 +-
 .../frontend/src/components/MkImgWithBlurhash.vue  |  2 +-
 packages/frontend/src/components/MkInfo.vue        |  2 +-
 packages/frontend/src/components/MkKeyValue.vue    |  2 +-
 packages/frontend/src/components/MkLaunchPad.vue   |  2 +-
 packages/frontend/src/components/MkLink.vue        |  2 +-
 packages/frontend/src/components/MkMediaBanner.vue |  2 +-
 packages/frontend/src/components/MkMediaImage.vue  |  2 +-
 packages/frontend/src/components/MkMediaList.vue   |  2 +-
 packages/frontend/src/components/MkMediaVideo.vue  |  2 +-
 packages/frontend/src/components/MkMention.vue     |  2 +-
 packages/frontend/src/components/MkMenu.child.vue  |  2 +-
 packages/frontend/src/components/MkMenu.vue        |  2 +-
 packages/frontend/src/components/MkModal.vue       |  2 -
 .../frontend/src/components/MkModalPageWindow.vue  |  2 +-
 packages/frontend/src/components/MkModalWindow.vue |  2 +-
 packages/frontend/src/components/MkNote.vue        |  6 +--
 .../frontend/src/components/MkNoteDetailed.vue     |  6 +--
 packages/frontend/src/components/MkNoteHeader.vue  |  2 +-
 packages/frontend/src/components/MkNotePreview.vue |  2 +-
 packages/frontend/src/components/MkNoteSimple.vue  |  2 +-
 packages/frontend/src/components/MkNoteSub.vue     |  2 +-
 packages/frontend/src/components/MkNotes.vue       |  2 +-
 .../frontend/src/components/MkNotification.vue     |  2 +-
 .../src/components/MkNotificationToast.vue         |  2 -
 .../frontend/src/components/MkNotifications.vue    |  2 +-
 packages/frontend/src/components/MkNumberDiff.vue  |  2 +-
 .../frontend/src/components/MkObjectView.value.vue |  2 +-
 packages/frontend/src/components/MkObjectView.vue  |  2 +-
 packages/frontend/src/components/MkPagePreview.vue |  2 +-
 packages/frontend/src/components/MkPageWindow.vue  |  2 +-
 packages/frontend/src/components/MkPagination.vue  |  2 -
 packages/frontend/src/components/MkPoll.vue        |  2 +-
 packages/frontend/src/components/MkPollEditor.vue  |  2 +-
 packages/frontend/src/components/MkPopupMenu.vue   |  2 +-
 packages/frontend/src/components/MkPostForm.vue    |  2 +-
 .../frontend/src/components/MkPostFormAttaches.vue |  2 +-
 .../frontend/src/components/MkReactionTooltip.vue  |  2 +-
 .../src/components/MkReactionsViewer.details.vue   |  2 +-
 .../src/components/MkReactionsViewer.reaction.vue  |  2 +-
 .../frontend/src/components/MkReactionsViewer.vue  |  2 +-
 .../frontend/src/components/MkRemoteCaution.vue    |  2 +-
 .../frontend/src/components/MkRenoteButton.vue     |  2 +-
 packages/frontend/src/components/MkRipple.vue      |  2 +-
 packages/frontend/src/components/MkSignin.vue      |  2 +-
 packages/frontend/src/components/MkSignup.vue      |  2 +-
 packages/frontend/src/components/MkSparkle.vue     |  2 +-
 .../frontend/src/components/MkSubNoteContent.vue   |  2 +-
 packages/frontend/src/components/MkSuperMenu.vue   |  2 +-
 packages/frontend/src/components/MkTagCloud.vue    |  2 +-
 packages/frontend/src/components/MkToast.vue       |  2 -
 packages/frontend/src/components/MkTooltip.vue     |  2 -
 packages/frontend/src/components/MkUpdated.vue     |  2 +-
 packages/frontend/src/components/MkUrlPreview.vue  |  6 +--
 .../frontend/src/components/MkUrlPreviewPopup.vue  |  2 +-
 packages/frontend/src/components/MkUserInfo.vue    |  2 +-
 packages/frontend/src/components/MkUserList.vue    |  2 +-
 .../src/components/MkUserOnlineIndicator.vue       |  2 +-
 packages/frontend/src/components/MkUserPreview.vue |  2 -
 .../frontend/src/components/MkUserSelectDialog.vue |  2 +-
 .../frontend/src/components/MkUsersTooltip.vue     |  2 +-
 .../frontend/src/components/MkVisibilityPicker.vue |  2 +-
 .../frontend/src/components/MkWaitingDialog.vue    |  2 +-
 packages/frontend/src/components/MkWindow.vue      |  2 -
 packages/frontend/src/components/form/checkbox.vue |  2 +-
 packages/frontend/src/components/form/folder.vue   |  2 +-
 packages/frontend/src/components/form/input.vue    |  2 +-
 packages/frontend/src/components/form/link.vue     |  2 +-
 packages/frontend/src/components/form/radio.vue    |  2 +-
 packages/frontend/src/components/form/range.vue    |  2 +-
 packages/frontend/src/components/form/section.vue  |  2 +-
 packages/frontend/src/components/form/select.vue   |  2 +-
 packages/frontend/src/components/form/slot.vue     |  2 +-
 packages/frontend/src/components/form/split.vue    |  2 +-
 packages/frontend/src/components/form/suspense.vue |  2 -
 packages/frontend/src/components/form/switch.vue   |  2 +-
 packages/frontend/src/components/form/textarea.vue |  2 +-
 packages/frontend/src/components/global/MkAcct.vue |  2 +-
 packages/frontend/src/components/global/MkAd.vue   |  2 +-
 .../frontend/src/components/global/MkAvatar.vue    |  2 +-
 .../frontend/src/components/global/MkEllipsis.vue  | 26 +++++------
 .../frontend/src/components/global/MkEmoji.vue     |  2 +-
 .../frontend/src/components/global/MkError.vue     |  2 +-
 .../global/MkMisskeyFlavoredMarkdown.vue           |  4 +-
 .../src/components/global/MkPageHeader.vue         |  4 +-
 packages/frontend/src/components/global/MkUrl.vue  |  2 +-
 .../frontend/src/components/page/page.button.vue   |  2 +-
 .../frontend/src/components/page/page.canvas.vue   |  2 +-
 .../frontend/src/components/page/page.counter.vue  |  2 +-
 .../frontend/src/components/page/page.image.vue    |  2 +-
 .../frontend/src/components/page/page.note.vue     |  8 ++--
 .../src/components/page/page.number-input.vue      |  2 +-
 .../frontend/src/components/page/page.post.vue     |  2 +-
 .../frontend/src/components/page/page.section.vue  |  2 +-
 .../frontend/src/components/page/page.switch.vue   |  2 +-
 .../src/components/page/page.text-input.vue        |  2 +-
 .../frontend/src/components/page/page.text.vue     |  6 +--
 packages/frontend/src/components/page/page.vue     |  2 +-
 packages/frontend/src/pages/_error_.vue            |  2 +-
 packages/frontend/src/pages/about-misskey.vue      |  2 +-
 packages/frontend/src/pages/about.emojis.vue       |  2 +-
 packages/frontend/src/pages/about.federation.vue   |  2 +-
 packages/frontend/src/pages/about.vue              |  2 +-
 packages/frontend/src/pages/admin-file.vue         |  2 +-
 packages/frontend/src/pages/admin/_header_.vue     |  2 +-
 packages/frontend/src/pages/admin/abuses.vue       |  2 +-
 packages/frontend/src/pages/admin/ads.vue          |  2 +-
 .../frontend/src/pages/admin/announcements.vue     |  2 +-
 .../frontend/src/pages/admin/emoji-edit-dialog.vue |  2 +-
 packages/frontend/src/pages/admin/emojis.vue       |  2 +-
 packages/frontend/src/pages/admin/files.vue        |  2 +-
 packages/frontend/src/pages/admin/index.vue        |  2 +-
 packages/frontend/src/pages/admin/metrics.vue      | 54 +++++++++++-----------
 .../src/pages/admin/overview.instances.vue         |  2 +-
 packages/frontend/src/pages/admin/overview.pie.vue |  2 +-
 .../src/pages/admin/overview.queue.chart.vue       |  2 +-
 packages/frontend/src/pages/admin/overview.vue     |  2 +-
 .../frontend/src/pages/admin/queue.chart.chart.vue |  2 +-
 packages/frontend/src/pages/admin/queue.chart.vue  |  2 +-
 packages/frontend/src/pages/admin/relays.vue       |  2 +-
 packages/frontend/src/pages/admin/users.vue        |  2 +-
 packages/frontend/src/pages/announcements.vue      |  2 +-
 packages/frontend/src/pages/antenna-timeline.vue   |  2 +-
 packages/frontend/src/pages/auth.vue               |  2 +-
 packages/frontend/src/pages/channel-editor.vue     |  2 +-
 packages/frontend/src/pages/channel.vue            |  2 +-
 packages/frontend/src/pages/clip.vue               |  4 +-
 packages/frontend/src/pages/emojis.emoji.vue       |  2 +-
 packages/frontend/src/pages/explore.users.vue      |  2 +-
 packages/frontend/src/pages/follow-requests.vue    |  2 +-
 packages/frontend/src/pages/gallery/edit.vue       |  2 +-
 packages/frontend/src/pages/gallery/index.vue      |  2 +-
 packages/frontend/src/pages/gallery/post.vue       |  2 -
 packages/frontend/src/pages/instance-info.vue      |  2 +-
 packages/frontend/src/pages/messaging/index.vue    |  2 +-
 .../src/pages/messaging/messaging-room.form.vue    |  2 +-
 .../src/pages/messaging/messaging-room.message.vue |  2 +-
 .../src/pages/messaging/messaging-room.vue         | 20 ++++----
 packages/frontend/src/pages/mfm-cheat-sheet.vue    |  2 +-
 packages/frontend/src/pages/miauth.vue             |  2 +-
 packages/frontend/src/pages/my-antennas/create.vue |  2 +-
 packages/frontend/src/pages/my-antennas/edit.vue   |  2 +-
 packages/frontend/src/pages/my-antennas/editor.vue |  2 +-
 packages/frontend/src/pages/my-antennas/index.vue  | 28 ++++++-----
 packages/frontend/src/pages/my-clips/index.vue     |  2 +-
 packages/frontend/src/pages/my-lists/index.vue     |  2 +-
 packages/frontend/src/pages/my-lists/list.vue      |  2 +-
 packages/frontend/src/pages/note.vue               |  2 -
 .../pages/page-editor/els/page-editor.el.image.vue |  2 +-
 .../page-editor/els/page-editor.el.section.vue     |  2 +-
 .../pages/page-editor/els/page-editor.el.text.vue  |  2 +-
 .../pages/page-editor/page-editor.container.vue    |  2 +-
 .../frontend/src/pages/page-editor/page-editor.vue |  2 +-
 packages/frontend/src/pages/page.vue               |  2 -
 packages/frontend/src/pages/pages.vue              |  2 +-
 packages/frontend/src/pages/preview.vue            |  2 +-
 packages/frontend/src/pages/registry.keys.vue      |  2 +-
 packages/frontend/src/pages/registry.value.vue     |  2 +-
 packages/frontend/src/pages/registry.vue           |  2 +-
 packages/frontend/src/pages/reset-password.vue     |  2 +-
 packages/frontend/src/pages/scratchpad.vue         |  2 +-
 packages/frontend/src/pages/settings/accounts.vue  |  2 +-
 packages/frontend/src/pages/settings/apps.vue      |  2 +-
 packages/frontend/src/pages/settings/drive.vue     |  3 +-
 packages/frontend/src/pages/settings/index.vue     |  2 +-
 packages/frontend/src/pages/settings/plugin.vue    |  2 +-
 packages/frontend/src/pages/settings/profile.vue   |  2 +-
 packages/frontend/src/pages/settings/reaction.vue  |  2 +-
 packages/frontend/src/pages/settings/security.vue  |  2 +-
 packages/frontend/src/pages/settings/theme.vue     |  2 +-
 packages/frontend/src/pages/share.vue              | 34 +++++++-------
 packages/frontend/src/pages/signup-complete.vue    |  2 +-
 packages/frontend/src/pages/theme-editor.vue       |  2 +-
 packages/frontend/src/pages/timeline.vue           |  2 +-
 packages/frontend/src/pages/user-info.vue          |  2 +-
 packages/frontend/src/pages/user-list-timeline.vue |  2 +-
 packages/frontend/src/pages/user/clips.vue         |  2 +-
 packages/frontend/src/pages/user/follow-list.vue   |  2 +-
 packages/frontend/src/pages/user/followers.vue     |  2 +-
 packages/frontend/src/pages/user/following.vue     |  2 +-
 packages/frontend/src/pages/user/gallery.vue       |  2 +-
 packages/frontend/src/pages/user/home.vue          |  2 +-
 packages/frontend/src/pages/user/index.photos.vue  |  2 +-
 packages/frontend/src/pages/user/pages.vue         |  2 +-
 packages/frontend/src/pages/user/reactions.vue     |  2 +-
 packages/frontend/src/pages/welcome.entrance.a.vue |  2 +-
 packages/frontend/src/pages/welcome.entrance.b.vue |  6 +--
 packages/frontend/src/pages/welcome.entrance.c.vue |  6 +--
 packages/frontend/src/pages/welcome.setup.vue      |  2 +-
 packages/frontend/src/pages/welcome.timeline.vue   |  6 +--
 .../frontend/src/ui/_common_/navbar-for-mobile.vue |  2 +-
 packages/frontend/src/ui/_common_/navbar.vue       |  2 +-
 .../src/ui/_common_/statusbar-federation.vue       |  2 -
 .../frontend/src/ui/_common_/statusbar-rss.vue     |  2 -
 .../src/ui/_common_/statusbar-user-list.vue        |  2 -
 packages/frontend/src/ui/_common_/statusbars.vue   |  2 +-
 .../frontend/src/ui/_common_/stream-indicator.vue  |  2 +-
 packages/frontend/src/ui/_common_/upload.vue       |  2 +-
 packages/frontend/src/ui/classic.header.vue        |  2 +-
 packages/frontend/src/ui/classic.sidebar.vue       |  2 +-
 packages/frontend/src/ui/classic.vue               |  2 -
 packages/frontend/src/ui/deck.vue                  |  2 -
 packages/frontend/src/ui/deck/antenna-column.vue   |  2 +-
 packages/frontend/src/ui/deck/column.vue           |  2 +-
 packages/frontend/src/ui/deck/list-column.vue      |  2 +-
 packages/frontend/src/ui/deck/tl-column.vue        |  2 +-
 packages/frontend/src/ui/deck/widgets-column.vue   |  2 +-
 packages/frontend/src/ui/universal.vue             |  2 -
 packages/frontend/src/ui/universal.widgets.vue     |  2 +-
 packages/frontend/src/ui/visitor/kanban.vue        |  2 +-
 packages/frontend/src/ui/zen.vue                   |  6 +--
 packages/frontend/src/widgets/aichan.vue           |  2 +-
 packages/frontend/src/widgets/aiscript.vue         |  2 +-
 packages/frontend/src/widgets/button.vue           |  2 +-
 packages/frontend/src/widgets/calendar.vue         |  2 +-
 packages/frontend/src/widgets/clock.vue            |  2 +-
 packages/frontend/src/widgets/digital-clock.vue    |  2 +-
 packages/frontend/src/widgets/federation.vue       |  2 +-
 packages/frontend/src/widgets/instance-cloud.vue   |  2 +-
 packages/frontend/src/widgets/memo.vue             |  2 +-
 packages/frontend/src/widgets/online-users.vue     |  2 +-
 packages/frontend/src/widgets/rss.vue              |  2 +-
 .../frontend/src/widgets/server-metric/cpu-mem.vue |  2 +-
 .../frontend/src/widgets/server-metric/cpu.vue     |  2 +-
 .../frontend/src/widgets/server-metric/disk.vue    |  2 +-
 .../frontend/src/widgets/server-metric/mem.vue     |  2 +-
 .../frontend/src/widgets/server-metric/net.vue     |  2 +-
 .../frontend/src/widgets/server-metric/pie.vue     |  2 +-
 packages/frontend/src/widgets/slideshow.vue        |  2 +-
 packages/frontend/src/widgets/trends.vue           |  2 +-
 packages/frontend/src/widgets/unix-clock.vue       |  2 +-
 263 files changed, 343 insertions(+), 407 deletions(-)

(limited to 'packages/frontend/src/components/MkFileListForAdmin.vue')

diff --git a/packages/frontend/src/components/MkAbuseReport.vue b/packages/frontend/src/components/MkAbuseReport.vue
index 19f20e6806..9a3464b640 100644
--- a/packages/frontend/src/components/MkAbuseReport.vue
+++ b/packages/frontend/src/components/MkAbuseReport.vue
@@ -63,7 +63,7 @@ function resolve() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .bcekxzvu {
 	display: flex;
 
diff --git a/packages/frontend/src/components/MkAbuseReportWindow.vue b/packages/frontend/src/components/MkAbuseReportWindow.vue
index c38094787c..039f77c859 100644
--- a/packages/frontend/src/components/MkAbuseReportWindow.vue
+++ b/packages/frontend/src/components/MkAbuseReportWindow.vue
@@ -58,7 +58,7 @@ function send() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .dpvffvvy {
 	--root-margin: 16px;
 }
diff --git a/packages/frontend/src/components/MkAnalogClock.vue b/packages/frontend/src/components/MkAnalogClock.vue
index b34b028ae6..40ef626aed 100644
--- a/packages/frontend/src/components/MkAnalogClock.vue
+++ b/packages/frontend/src/components/MkAnalogClock.vue
@@ -205,7 +205,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mbcofsoe {
 	display: block;
 
diff --git a/packages/frontend/src/components/MkAutocomplete.vue b/packages/frontend/src/components/MkAutocomplete.vue
index dea49435d3..72783921d5 100644
--- a/packages/frontend/src/components/MkAutocomplete.vue
+++ b/packages/frontend/src/components/MkAutocomplete.vue
@@ -376,7 +376,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .swhvrteh {
 	position: fixed;
 	max-width: 100%;
diff --git a/packages/frontend/src/components/MkButton.vue b/packages/frontend/src/components/MkButton.vue
index b60b0b8b89..891645bb2a 100644
--- a/packages/frontend/src/components/MkButton.vue
+++ b/packages/frontend/src/components/MkButton.vue
@@ -98,7 +98,7 @@ function onMousedown(evt: MouseEvent): void {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .bghgjjyj {
 	position: relative;
 	z-index: 1; // 他コンポーネントのbox-shadowに隠されないようにするため
diff --git a/packages/frontend/src/components/MkChannelFollowButton.vue b/packages/frontend/src/components/MkChannelFollowButton.vue
index acd4209c2f..9e275d6172 100644
--- a/packages/frontend/src/components/MkChannelFollowButton.vue
+++ b/packages/frontend/src/components/MkChannelFollowButton.vue
@@ -57,7 +57,7 @@ async function onClick() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .hdcaacmi {
 	position: relative;
 	display: inline-block;
diff --git a/packages/frontend/src/components/MkChannelPreview.vue b/packages/frontend/src/components/MkChannelPreview.vue
index 8aef6c4b35..6ef50bddcf 100644
--- a/packages/frontend/src/components/MkChannelPreview.vue
+++ b/packages/frontend/src/components/MkChannelPreview.vue
@@ -50,7 +50,7 @@ const bannerStyle = computed(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .eftoefju {
 	display: block;
 	overflow: hidden;
diff --git a/packages/frontend/src/components/MkChart.vue b/packages/frontend/src/components/MkChart.vue
index 0bb4d4f042..fbbc231b88 100644
--- a/packages/frontend/src/components/MkChart.vue
+++ b/packages/frontend/src/components/MkChart.vue
@@ -838,7 +838,7 @@ onMounted(() => {
 /* eslint-enable id-denylist */
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .cbbedffa {
 	position: relative;
 
diff --git a/packages/frontend/src/components/MkChartTooltip.vue b/packages/frontend/src/components/MkChartTooltip.vue
index 0ad10162a8..d36f45463c 100644
--- a/packages/frontend/src/components/MkChartTooltip.vue
+++ b/packages/frontend/src/components/MkChartTooltip.vue
@@ -33,7 +33,7 @@ const emit = defineEmits<{
 }>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .qpcyisrl {
 	> .title {
 		margin-bottom: 4px;
diff --git a/packages/frontend/src/components/MkContainer.vue b/packages/frontend/src/components/MkContainer.vue
index 8bd2a0ad22..6d4d5be2bc 100644
--- a/packages/frontend/src/components/MkContainer.vue
+++ b/packages/frontend/src/components/MkContainer.vue
@@ -140,9 +140,7 @@ export default defineComponent({
 .container-toggle-leave-to {
 	opacity: 0;
 }
-</style>
 
-<style lang="scss">
 .ukygtjoj {
 	position: relative;
 	overflow: clip;
diff --git a/packages/frontend/src/components/MkContextMenu.vue b/packages/frontend/src/components/MkContextMenu.vue
index 4aee919670..cfc9502b41 100644
--- a/packages/frontend/src/components/MkContextMenu.vue
+++ b/packages/frontend/src/components/MkContextMenu.vue
@@ -69,6 +69,10 @@ function onMousedown(evt: Event) {
 </script>
 
 <style lang="scss" scoped>
+.nvlagfpb {
+	position: absolute;
+}
+
 .fade-enter-active, .fade-leave-active {
 	transition: opacity 0.5s cubic-bezier(0.16, 1, 0.3, 1), transform 0.5s cubic-bezier(0.16, 1, 0.3, 1);
 	transform-origin: left top;
@@ -79,9 +83,3 @@ function onMousedown(evt: Event) {
 	transform: scale(0.9);
 }
 </style>
-
-<style lang="scss">
-.nvlagfpb {
-	position: absolute;
-}
-</style>
diff --git a/packages/frontend/src/components/MkCropperDialog.vue b/packages/frontend/src/components/MkCropperDialog.vue
index 31269cbc51..ae18160dea 100644
--- a/packages/frontend/src/components/MkCropperDialog.vue
+++ b/packages/frontend/src/components/MkCropperDialog.vue
@@ -133,9 +133,7 @@ onMounted(() => {
 .fade-leave-to {
 	opacity: 0;
 }
-</style>
 
-<style lang="scss">
 .mk-cropper-dialog {
 	display: flex;
 	flex-direction: column;
diff --git a/packages/frontend/src/components/MkCwButton.vue b/packages/frontend/src/components/MkCwButton.vue
index 94f06093fe..ee611921ef 100644
--- a/packages/frontend/src/components/MkCwButton.vue
+++ b/packages/frontend/src/components/MkCwButton.vue
@@ -34,7 +34,7 @@ const toggle = () => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .nrvgflfu {
 	display: inline-block;
 	padding: 4px 8px;
diff --git a/packages/frontend/src/components/MkDialog.vue b/packages/frontend/src/components/MkDialog.vue
index 6225668211..374ecd8abf 100644
--- a/packages/frontend/src/components/MkDialog.vue
+++ b/packages/frontend/src/components/MkDialog.vue
@@ -143,7 +143,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mk-dialog {
 	position: relative;
 	padding: 32px;
diff --git a/packages/frontend/src/components/MkDigitalClock.vue b/packages/frontend/src/components/MkDigitalClock.vue
index c2a17f2a03..9ed8d63d19 100644
--- a/packages/frontend/src/components/MkDigitalClock.vue
+++ b/packages/frontend/src/components/MkDigitalClock.vue
@@ -62,7 +62,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .zjobosdg {
 	> .colon {
 		opacity: 0;
diff --git a/packages/frontend/src/components/MkDrive.file.vue b/packages/frontend/src/components/MkDrive.file.vue
index 28510ea153..8c17c0530a 100644
--- a/packages/frontend/src/components/MkDrive.file.vue
+++ b/packages/frontend/src/components/MkDrive.file.vue
@@ -176,7 +176,7 @@ async function deleteFile() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ncvczrfv {
 	position: relative;
 	padding: 8px 0 0 0;
diff --git a/packages/frontend/src/components/MkDrive.folder.vue b/packages/frontend/src/components/MkDrive.folder.vue
index 4e26500769..82653ca0b4 100644
--- a/packages/frontend/src/components/MkDrive.folder.vue
+++ b/packages/frontend/src/components/MkDrive.folder.vue
@@ -264,7 +264,7 @@ function onContextmenu(ev: MouseEvent) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .rghtznwe {
 	position: relative;
 	padding: 8px;
diff --git a/packages/frontend/src/components/MkDrive.navFolder.vue b/packages/frontend/src/components/MkDrive.navFolder.vue
index 13784a8691..dbbfef5f05 100644
--- a/packages/frontend/src/components/MkDrive.navFolder.vue
+++ b/packages/frontend/src/components/MkDrive.navFolder.vue
@@ -1,6 +1,5 @@
 <template>
-<div
-	class="drylbebk"
+<div class="drylbebk"
 	:class="{ draghover }"
 	@click="onClick"
 	@dragover.prevent.stop="onDragover"
@@ -131,7 +130,7 @@ function onDrop(ev: DragEvent) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .drylbebk {
 	> * {
 		pointer-events: none;
diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue
index 04806c474b..4053870950 100644
--- a/packages/frontend/src/components/MkDrive.vue
+++ b/packages/frontend/src/components/MkDrive.vue
@@ -655,7 +655,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .yfudmmck {
 	display: flex;
 	flex-direction: column;
diff --git a/packages/frontend/src/components/MkDriveFileThumbnail.vue b/packages/frontend/src/components/MkDriveFileThumbnail.vue
index 92f2cefefa..33379ed5ca 100644
--- a/packages/frontend/src/components/MkDriveFileThumbnail.vue
+++ b/packages/frontend/src/components/MkDriveFileThumbnail.vue
@@ -53,7 +53,7 @@ const isThumbnailAvailable = computed(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .zdjebgpv {
 	position: relative;
 	display: flex;
diff --git a/packages/frontend/src/components/MkEmojiPicker.section.vue b/packages/frontend/src/components/MkEmojiPicker.section.vue
index 61f8811b06..f6ba7abfc4 100644
--- a/packages/frontend/src/components/MkEmojiPicker.section.vue
+++ b/packages/frontend/src/components/MkEmojiPicker.section.vue
@@ -32,5 +32,5 @@ const emit = defineEmits<{
 const shown = ref(!!props.initialShown);
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 </style>
diff --git a/packages/frontend/src/components/MkEmojiPicker.vue b/packages/frontend/src/components/MkEmojiPicker.vue
index 57ae02ca20..814f71168a 100644
--- a/packages/frontend/src/components/MkEmojiPicker.vue
+++ b/packages/frontend/src/components/MkEmojiPicker.vue
@@ -354,7 +354,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .omfetrab {
 	$pad: 8px;
 
diff --git a/packages/frontend/src/components/MkEmojiPickerDialog.vue b/packages/frontend/src/components/MkEmojiPickerDialog.vue
index 6370d9b972..3b41f9d75b 100644
--- a/packages/frontend/src/components/MkEmojiPickerDialog.vue
+++ b/packages/frontend/src/components/MkEmojiPickerDialog.vue
@@ -62,7 +62,7 @@ function opening() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ryghynhb {
 	&.drawer {
 		border-radius: 24px;
diff --git a/packages/frontend/src/components/MkEmojiPickerWindow.vue b/packages/frontend/src/components/MkEmojiPickerWindow.vue
index 04b8c5cc18..523e4ba695 100644
--- a/packages/frontend/src/components/MkEmojiPickerWindow.vue
+++ b/packages/frontend/src/components/MkEmojiPickerWindow.vue
@@ -1,6 +1,5 @@
 <template>
-<MkWindow
-	ref="window"
+<MkWindow ref="window"
 	:initial-width="null"
 	:initial-height="null"
 	:can-resize="false"
@@ -35,7 +34,7 @@ function chosen(emoji: any) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .omfetrab {
 	$pad: 8px;
 	--eachSize: 40px;
diff --git a/packages/frontend/src/components/MkFeaturedPhotos.vue b/packages/frontend/src/components/MkFeaturedPhotos.vue
index ef6350438f..e58b5d2849 100644
--- a/packages/frontend/src/components/MkFeaturedPhotos.vue
+++ b/packages/frontend/src/components/MkFeaturedPhotos.vue
@@ -14,7 +14,7 @@ os.api('meta', { detail: true }).then(gotMeta => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .xfbouadm {
 	background-position: center;
 	background-size: cover;
diff --git a/packages/frontend/src/components/MkFileListForAdmin.vue b/packages/frontend/src/components/MkFileListForAdmin.vue
index 8bdea6154b..4910506a95 100644
--- a/packages/frontend/src/components/MkFileListForAdmin.vue
+++ b/packages/frontend/src/components/MkFileListForAdmin.vue
@@ -51,9 +51,7 @@ const props = defineProps<{
 	0% { opacity: 1; }
 	50% { opacity: 0; }
 }
-</style>
 
-<style lang="scss">
 .urempief {
 	margin-top: var(--margin);
 
diff --git a/packages/frontend/src/components/MkFolder.vue b/packages/frontend/src/components/MkFolder.vue
index 5999152359..9e83b07cd7 100644
--- a/packages/frontend/src/components/MkFolder.vue
+++ b/packages/frontend/src/components/MkFolder.vue
@@ -107,9 +107,7 @@ export default defineComponent({
 .folder-toggle-leave-to {
 	opacity: 0;
 }
-</style>
 
-<style lang="scss">
 .ssazuxis {
 	position: relative;
 
@@ -158,14 +156,4 @@ export default defineComponent({
 		}
 	}
 }
-
-@container (max-width: 500px) {
-	.ssazuxis {
-		> header {
-			> .title {
-				padding: 8px 10px 8px 0;
-			}
-		}
-	}
-}
 </style>
diff --git a/packages/frontend/src/components/MkFollowButton.vue b/packages/frontend/src/components/MkFollowButton.vue
index fadf166acc..ee256d9263 100644
--- a/packages/frontend/src/components/MkFollowButton.vue
+++ b/packages/frontend/src/components/MkFollowButton.vue
@@ -109,7 +109,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .kpoogebi {
 	position: relative;
 	display: inline-block;
diff --git a/packages/frontend/src/components/MkForgotPassword.vue b/packages/frontend/src/components/MkForgotPassword.vue
index 5139c84142..1b55451c94 100644
--- a/packages/frontend/src/components/MkForgotPassword.vue
+++ b/packages/frontend/src/components/MkForgotPassword.vue
@@ -1,6 +1,5 @@
 <template>
-<XModalWindow
-	ref="dialog"
+<XModalWindow ref="dialog"
 	:width="370"
 	:height="400"
 	@close="dialog.close()"
@@ -63,7 +62,7 @@ async function onSubmit() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .bafeceda {
 	> .main {
 		padding: 24px;
diff --git a/packages/frontend/src/components/MkFormDialog.vue b/packages/frontend/src/components/MkFormDialog.vue
index d81159be9b..b2bf76a8c7 100644
--- a/packages/frontend/src/components/MkFormDialog.vue
+++ b/packages/frontend/src/components/MkFormDialog.vue
@@ -120,7 +120,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .xkpnjxcv {
 
 }
diff --git a/packages/frontend/src/components/MkGalleryPostPreview.vue b/packages/frontend/src/components/MkGalleryPostPreview.vue
index 78a8ea39ac..a133f6431b 100644
--- a/packages/frontend/src/components/MkGalleryPostPreview.vue
+++ b/packages/frontend/src/components/MkGalleryPostPreview.vue
@@ -25,7 +25,7 @@ const props = defineProps<{
 }>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ttasepnz {
 	display: block;
 	position: relative;
diff --git a/packages/frontend/src/components/MkGoogle.vue b/packages/frontend/src/components/MkGoogle.vue
index d53602d9a1..d104cd4cd4 100644
--- a/packages/frontend/src/components/MkGoogle.vue
+++ b/packages/frontend/src/components/MkGoogle.vue
@@ -19,7 +19,7 @@ const search = () => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mk-google {
 	display: flex;
 	margin: 8px 0;
diff --git a/packages/frontend/src/components/MkImageViewer.vue b/packages/frontend/src/components/MkImageViewer.vue
index 77c7a93518..f074b1a2f2 100644
--- a/packages/frontend/src/components/MkImageViewer.vue
+++ b/packages/frontend/src/components/MkImageViewer.vue
@@ -31,7 +31,7 @@ const emit = defineEmits<{
 const modal = $ref<InstanceType<typeof MkModal>>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .xubzgfga {
 	display: flex;
 	flex-direction: column;
diff --git a/packages/frontend/src/components/MkImgWithBlurhash.vue b/packages/frontend/src/components/MkImgWithBlurhash.vue
index dc92844131..80d7c201a4 100644
--- a/packages/frontend/src/components/MkImgWithBlurhash.vue
+++ b/packages/frontend/src/components/MkImgWithBlurhash.vue
@@ -45,7 +45,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .xubzgfgb {
 	position: relative;
 	width: 100%;
diff --git a/packages/frontend/src/components/MkInfo.vue b/packages/frontend/src/components/MkInfo.vue
index 1bcb637493..7aaf2c5bcb 100644
--- a/packages/frontend/src/components/MkInfo.vue
+++ b/packages/frontend/src/components/MkInfo.vue
@@ -14,7 +14,7 @@ const props = defineProps<{
 }>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .fpezltsf {
 	padding: 12px 14px;
 	font-size: 90%;
diff --git a/packages/frontend/src/components/MkKeyValue.vue b/packages/frontend/src/components/MkKeyValue.vue
index 975ec7e3f0..ff69c79641 100644
--- a/packages/frontend/src/components/MkKeyValue.vue
+++ b/packages/frontend/src/components/MkKeyValue.vue
@@ -30,7 +30,7 @@ const copy_ = () => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .alqyeyti {
 	> .key {
 		font-size: 0.85em;
diff --git a/packages/frontend/src/components/MkLaunchPad.vue b/packages/frontend/src/components/MkLaunchPad.vue
index b61b376d9b..1ccc648c72 100644
--- a/packages/frontend/src/components/MkLaunchPad.vue
+++ b/packages/frontend/src/components/MkLaunchPad.vue
@@ -62,7 +62,7 @@ function close() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .szkkfdyq {
 	max-height: 100%;
 	width: min(460px, 100vw);
diff --git a/packages/frontend/src/components/MkLink.vue b/packages/frontend/src/components/MkLink.vue
index a069fbe59b..6148ec6195 100644
--- a/packages/frontend/src/components/MkLink.vue
+++ b/packages/frontend/src/components/MkLink.vue
@@ -35,7 +35,7 @@ useTooltip($$(el), (showing) => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .xlcxczvw {
 	word-break: break-all;
 
diff --git a/packages/frontend/src/components/MkMediaBanner.vue b/packages/frontend/src/components/MkMediaBanner.vue
index 432af84492..aa06c00fc6 100644
--- a/packages/frontend/src/components/MkMediaBanner.vue
+++ b/packages/frontend/src/components/MkMediaBanner.vue
@@ -50,7 +50,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mk-media-banner {
 	width: 100%;
 	border-radius: 4px;
diff --git a/packages/frontend/src/components/MkMediaImage.vue b/packages/frontend/src/components/MkMediaImage.vue
index 6ac616d908..56570eaa05 100644
--- a/packages/frontend/src/components/MkMediaImage.vue
+++ b/packages/frontend/src/components/MkMediaImage.vue
@@ -49,7 +49,7 @@ watch(() => props.image, () => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .qjewsnkg {
 	position: relative;
 
diff --git a/packages/frontend/src/components/MkMediaList.vue b/packages/frontend/src/components/MkMediaList.vue
index f91a021fcc..c6f8612182 100644
--- a/packages/frontend/src/components/MkMediaList.vue
+++ b/packages/frontend/src/components/MkMediaList.vue
@@ -101,7 +101,7 @@ const previewable = (file: misskey.entities.DriveFile): boolean => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .hoawjimk {
 	> .gird-container {
 		position: relative;
diff --git a/packages/frontend/src/components/MkMediaVideo.vue b/packages/frontend/src/components/MkMediaVideo.vue
index a55eff5d70..df0bf84116 100644
--- a/packages/frontend/src/components/MkMediaVideo.vue
+++ b/packages/frontend/src/components/MkMediaVideo.vue
@@ -35,7 +35,7 @@ const props = defineProps<{
 const hide = ref((defaultStore.state.nsfw === 'force') ? true : props.video.isSensitive && (defaultStore.state.nsfw !== 'ignore'));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .kkjnbbplepmiyuadieoenjgutgcmtsvu {
 	position: relative;
 
diff --git a/packages/frontend/src/components/MkMention.vue b/packages/frontend/src/components/MkMention.vue
index fffd6f8a31..3091b435e4 100644
--- a/packages/frontend/src/components/MkMention.vue
+++ b/packages/frontend/src/components/MkMention.vue
@@ -39,7 +39,7 @@ bg.setAlpha(0.1);
 const bgCss = bg.toRgbString();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .akbvjaqn {
 	display: inline-block;
 	padding: 4px 8px 4px 4px;
diff --git a/packages/frontend/src/components/MkMenu.child.vue b/packages/frontend/src/components/MkMenu.child.vue
index 60576b914d..3ada4afbdc 100644
--- a/packages/frontend/src/components/MkMenu.child.vue
+++ b/packages/frontend/src/components/MkMenu.child.vue
@@ -58,7 +58,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .sfhdhdhr {
 	position: absolute;
 }
diff --git a/packages/frontend/src/components/MkMenu.vue b/packages/frontend/src/components/MkMenu.vue
index b87ec06882..64d18b6b7c 100644
--- a/packages/frontend/src/components/MkMenu.vue
+++ b/packages/frontend/src/components/MkMenu.vue
@@ -186,7 +186,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .rrevdjwt {
 	padding: 8px 0;
 	box-sizing: border-box;
diff --git a/packages/frontend/src/components/MkModal.vue b/packages/frontend/src/components/MkModal.vue
index 532d8364ac..2305a02794 100644
--- a/packages/frontend/src/components/MkModal.vue
+++ b/packages/frontend/src/components/MkModal.vue
@@ -328,9 +328,7 @@ defineExpose({
 		transform: translateY(100%);
 	}
 }
-</style>
 
-<style lang="scss">
 .qzhlnise {
 	> .bg {
 		&.transparent {
diff --git a/packages/frontend/src/components/MkModalPageWindow.vue b/packages/frontend/src/components/MkModalPageWindow.vue
index fc10a8c6f4..ced8a7a714 100644
--- a/packages/frontend/src/components/MkModalPageWindow.vue
+++ b/packages/frontend/src/components/MkModalPageWindow.vue
@@ -115,7 +115,7 @@ function onContextmenu(ev: MouseEvent) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .hrmcaedk {
 	overflow: hidden;
 	display: flex;
diff --git a/packages/frontend/src/components/MkModalWindow.vue b/packages/frontend/src/components/MkModalWindow.vue
index 1465138245..d977ca6e9c 100644
--- a/packages/frontend/src/components/MkModalWindow.vue
+++ b/packages/frontend/src/components/MkModalWindow.vue
@@ -83,7 +83,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ebkgoccj {
 	overflow: hidden;
 	display: flex;
diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue
index ea1aeaeab7..a4100e1f2c 100644
--- a/packages/frontend/src/components/MkNote.vue
+++ b/packages/frontend/src/components/MkNote.vue
@@ -90,7 +90,7 @@
 		</div>
 	</article>
 </div>
-<div v-else class="tkcbzcuz-muted" @click="muted = false">
+<div v-else class="muted" @click="muted = false">
 	<I18n :src="i18n.ts.userSaysSomething" tag="small">
 		<template #name>
 			<MkA v-user-preview="appearNote.userId" class="name" :to="userPage(appearNote.user)">
@@ -292,7 +292,7 @@ function readPromo() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .tkcbzcuz {
 	position: relative;
 	transition: box-shadow 0.1s ease;
@@ -650,7 +650,7 @@ function readPromo() {
 	}
 }
 
-.tkcbzcuz-muted {
+.muted {
 	padding: 8px;
 	text-align: center;
 	opacity: 0.7;
diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue
index 4190f73ff7..7ce8e039d9 100644
--- a/packages/frontend/src/components/MkNoteDetailed.vue
+++ b/packages/frontend/src/components/MkNoteDetailed.vue
@@ -101,7 +101,7 @@
 	</article>
 	<MkNoteSub v-for="note in replies" :key="note.id" :note="note" class="reply" :detail="true"/>
 </div>
-<div v-else class="_panel lxwezrsl-muted" @click="muted = false">
+<div v-else class="_panel muted" @click="muted = false">
 	<I18n :src="i18n.ts.userSaysSomething" tag="small">
 		<template #name>
 			<MkA v-user-preview="appearNote.userId" class="name" :to="userPage(appearNote.user)">
@@ -295,7 +295,7 @@ if (appearNote.replyId) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .lxwezrsl {
 	position: relative;
 	transition: box-shadow 0.1s ease;
@@ -669,7 +669,7 @@ if (appearNote.replyId) {
 	}
 }
 
-.lxwezrsl-muted {
+.muted {
 	padding: 8px;
 	text-align: center;
 	opacity: 0.7;
diff --git a/packages/frontend/src/components/MkNoteHeader.vue b/packages/frontend/src/components/MkNoteHeader.vue
index 098428f10c..333c3ddbd9 100644
--- a/packages/frontend/src/components/MkNoteHeader.vue
+++ b/packages/frontend/src/components/MkNoteHeader.vue
@@ -27,7 +27,7 @@ defineProps<{
 }>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .kkwtjztg {
 	display: flex;
 	align-items: baseline;
diff --git a/packages/frontend/src/components/MkNotePreview.vue b/packages/frontend/src/components/MkNotePreview.vue
index 47a04429e8..0c81059091 100644
--- a/packages/frontend/src/components/MkNotePreview.vue
+++ b/packages/frontend/src/components/MkNotePreview.vue
@@ -22,7 +22,7 @@ const props = defineProps<{
 }>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .fefdfafb {
 	display: flex;
 	margin: 0;
diff --git a/packages/frontend/src/components/MkNoteSimple.vue b/packages/frontend/src/components/MkNoteSimple.vue
index 7a1e2087a8..96d29831d2 100644
--- a/packages/frontend/src/components/MkNoteSimple.vue
+++ b/packages/frontend/src/components/MkNoteSimple.vue
@@ -31,7 +31,7 @@ const props = defineProps<{
 const showContent = $ref(false);
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .yohlumlk {
 	display: flex;
 	margin: 0;
diff --git a/packages/frontend/src/components/MkNoteSub.vue b/packages/frontend/src/components/MkNoteSub.vue
index 29b4f01270..d03ce7c434 100644
--- a/packages/frontend/src/components/MkNoteSub.vue
+++ b/packages/frontend/src/components/MkNoteSub.vue
@@ -57,7 +57,7 @@ if (props.detail) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .wrpstxzv {
 	padding: 16px 32px;
 	font-size: 0.9em;
diff --git a/packages/frontend/src/components/MkNotes.vue b/packages/frontend/src/components/MkNotes.vue
index 6bdde1da2c..5abcdc2298 100644
--- a/packages/frontend/src/components/MkNotes.vue
+++ b/packages/frontend/src/components/MkNotes.vue
@@ -36,7 +36,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .giivymft {
 	&.noGap {
 		> .notes {
diff --git a/packages/frontend/src/components/MkNotification.vue b/packages/frontend/src/components/MkNotification.vue
index 9d3e240004..8b8d3f452d 100644
--- a/packages/frontend/src/components/MkNotification.vue
+++ b/packages/frontend/src/components/MkNotification.vue
@@ -160,7 +160,7 @@ useTooltip(reactionRef, (showing) => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .qglefbjs {
 	position: relative;
 	box-sizing: border-box;
diff --git a/packages/frontend/src/components/MkNotificationToast.vue b/packages/frontend/src/components/MkNotificationToast.vue
index e4d96bde91..07640792c0 100644
--- a/packages/frontend/src/components/MkNotificationToast.vue
+++ b/packages/frontend/src/components/MkNotificationToast.vue
@@ -37,9 +37,7 @@ onMounted(() => {
 	opacity: 0;
 	transform: translateX(-250px);
 }
-</style>
 
-<style lang="scss">
 .mk-notification-toast {
 	position: fixed;
 	left: 0;
diff --git a/packages/frontend/src/components/MkNotifications.vue b/packages/frontend/src/components/MkNotifications.vue
index 882c873bdf..0e1cc06743 100644
--- a/packages/frontend/src/components/MkNotifications.vue
+++ b/packages/frontend/src/components/MkNotifications.vue
@@ -97,7 +97,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .elsfgstc {
 	background: var(--panel);
 }
diff --git a/packages/frontend/src/components/MkNumberDiff.vue b/packages/frontend/src/components/MkNumberDiff.vue
index 9e816654c6..e7d4a5472a 100644
--- a/packages/frontend/src/components/MkNumberDiff.vue
+++ b/packages/frontend/src/components/MkNumberDiff.vue
@@ -30,7 +30,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ceaaebcd {
 	&.isPlus {
 		color: var(--success);
diff --git a/packages/frontend/src/components/MkObjectView.value.vue b/packages/frontend/src/components/MkObjectView.value.vue
index bf0ebbd5d1..0c7230d783 100644
--- a/packages/frontend/src/components/MkObjectView.value.vue
+++ b/packages/frontend/src/components/MkObjectView.value.vue
@@ -78,7 +78,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .igpposuu {
 	display: inline;
 
diff --git a/packages/frontend/src/components/MkObjectView.vue b/packages/frontend/src/components/MkObjectView.vue
index 5101f5e351..55578a37f6 100644
--- a/packages/frontend/src/components/MkObjectView.vue
+++ b/packages/frontend/src/components/MkObjectView.vue
@@ -13,7 +13,7 @@ const props = defineProps<{
 }>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .zhyxdalp {
 
 }
diff --git a/packages/frontend/src/components/MkPagePreview.vue b/packages/frontend/src/components/MkPagePreview.vue
index 2c323e5a39..009582e540 100644
--- a/packages/frontend/src/components/MkPagePreview.vue
+++ b/packages/frontend/src/components/MkPagePreview.vue
@@ -32,7 +32,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .vhpxefrj {
 	display: block;
 
diff --git a/packages/frontend/src/components/MkPageWindow.vue b/packages/frontend/src/components/MkPageWindow.vue
index aa28eb1f4b..29d45558a7 100644
--- a/packages/frontend/src/components/MkPageWindow.vue
+++ b/packages/frontend/src/components/MkPageWindow.vue
@@ -132,7 +132,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .yrolvcoq {
 	min-height: 100%;
 	background: var(--bg);
diff --git a/packages/frontend/src/components/MkPagination.vue b/packages/frontend/src/components/MkPagination.vue
index b59fe03323..291409171a 100644
--- a/packages/frontend/src/components/MkPagination.vue
+++ b/packages/frontend/src/components/MkPagination.vue
@@ -307,9 +307,7 @@ defineExpose({
 .fade-leave-to {
 	opacity: 0;
 }
-</style>
 
-<style lang="scss">
 .cxiknjgy {
 	> .button {
 		margin-left: auto;
diff --git a/packages/frontend/src/components/MkPoll.vue b/packages/frontend/src/components/MkPoll.vue
index 6d3402a58c..a1b927e42a 100644
--- a/packages/frontend/src/components/MkPoll.vue
+++ b/packages/frontend/src/components/MkPoll.vue
@@ -86,7 +86,7 @@ const vote = async (id) => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .tivcixzd {
 	> ul {
 		display: block;
diff --git a/packages/frontend/src/components/MkPollEditor.vue b/packages/frontend/src/components/MkPollEditor.vue
index 9a42bf1037..556abc5fd0 100644
--- a/packages/frontend/src/components/MkPollEditor.vue
+++ b/packages/frontend/src/components/MkPollEditor.vue
@@ -142,7 +142,7 @@ watch([choices, multiple, expiration, atDate, atTime, after, unit], () => emit('
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .zmdxowus {
 	padding: 8px 16px;
 
diff --git a/packages/frontend/src/components/MkPopupMenu.vue b/packages/frontend/src/components/MkPopupMenu.vue
index 3cac9fb44d..f04c7f5618 100644
--- a/packages/frontend/src/components/MkPopupMenu.vue
+++ b/packages/frontend/src/components/MkPopupMenu.vue
@@ -25,7 +25,7 @@ const emit = defineEmits<{
 let modal = $ref<InstanceType<typeof MkModal>>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .sfhdhdhq {
 	&.drawer {
 		border-radius: 24px;
diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue
index b2dc48c4f3..f79e5a32cd 100644
--- a/packages/frontend/src/components/MkPostForm.vue
+++ b/packages/frontend/src/components/MkPostForm.vue
@@ -715,7 +715,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .gafaadew {
 	position: relative;
 
diff --git a/packages/frontend/src/components/MkPostFormAttaches.vue b/packages/frontend/src/components/MkPostFormAttaches.vue
index 2646cea6de..766cc9a06c 100644
--- a/packages/frontend/src/components/MkPostFormAttaches.vue
+++ b/packages/frontend/src/components/MkPostFormAttaches.vue
@@ -109,7 +109,7 @@ function showFileMenu(file, ev: MouseEvent) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .skeikyzd {
 	padding: 8px 16px;
 	position: relative;
diff --git a/packages/frontend/src/components/MkReactionTooltip.vue b/packages/frontend/src/components/MkReactionTooltip.vue
index 49a29d36c6..310d5954fc 100644
--- a/packages/frontend/src/components/MkReactionTooltip.vue
+++ b/packages/frontend/src/components/MkReactionTooltip.vue
@@ -24,7 +24,7 @@ const emit = defineEmits<{
 }>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .beeadbfb {
 	text-align: center;
 
diff --git a/packages/frontend/src/components/MkReactionsViewer.details.vue b/packages/frontend/src/components/MkReactionsViewer.details.vue
index e5a99a9254..29902a5075 100644
--- a/packages/frontend/src/components/MkReactionsViewer.details.vue
+++ b/packages/frontend/src/components/MkReactionsViewer.details.vue
@@ -44,7 +44,7 @@ function getReactionName(reaction: string): string {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .bqxuuuey {
 	display: flex;
 
diff --git a/packages/frontend/src/components/MkReactionsViewer.reaction.vue b/packages/frontend/src/components/MkReactionsViewer.reaction.vue
index 5fef5d6f4b..31342b0b48 100644
--- a/packages/frontend/src/components/MkReactionsViewer.reaction.vue
+++ b/packages/frontend/src/components/MkReactionsViewer.reaction.vue
@@ -90,7 +90,7 @@ useTooltip(buttonRef, async (showing) => {
 }, 100);
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .hkzvhatu {
 	display: inline-block;
 	height: 32px;
diff --git a/packages/frontend/src/components/MkReactionsViewer.vue b/packages/frontend/src/components/MkReactionsViewer.vue
index e6999194fd..a88311efa1 100644
--- a/packages/frontend/src/components/MkReactionsViewer.vue
+++ b/packages/frontend/src/components/MkReactionsViewer.vue
@@ -19,7 +19,7 @@ const initialReactions = new Set(Object.keys(props.note.reactions));
 const isMe = computed(() => $i && $i.id === props.note.userId);
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .tdflqwzn {
 	margin: 4px -2px 0 -2px;
 
diff --git a/packages/frontend/src/components/MkRemoteCaution.vue b/packages/frontend/src/components/MkRemoteCaution.vue
index 0942969910..d5dc01c1f8 100644
--- a/packages/frontend/src/components/MkRemoteCaution.vue
+++ b/packages/frontend/src/components/MkRemoteCaution.vue
@@ -10,7 +10,7 @@ defineProps<{
 }>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .jmgmzlwq {
 	font-size: 0.8em;
 	padding: 16px;
diff --git a/packages/frontend/src/components/MkRenoteButton.vue b/packages/frontend/src/components/MkRenoteButton.vue
index c267a93825..e0b1eaafc9 100644
--- a/packages/frontend/src/components/MkRenoteButton.vue
+++ b/packages/frontend/src/components/MkRenoteButton.vue
@@ -74,7 +74,7 @@ const renote = (viaKeyboard = false) => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .eddddedb {
 	display: inline-block;
 	height: 32px;
diff --git a/packages/frontend/src/components/MkRipple.vue b/packages/frontend/src/components/MkRipple.vue
index 9a1352538f..9d93211d5f 100644
--- a/packages/frontend/src/components/MkRipple.vue
+++ b/packages/frontend/src/components/MkRipple.vue
@@ -100,7 +100,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .vswabwbm {
 	pointer-events: none;
 	position: fixed;
diff --git a/packages/frontend/src/components/MkSignin.vue b/packages/frontend/src/components/MkSignin.vue
index 21918a4c89..96f18f8d61 100644
--- a/packages/frontend/src/components/MkSignin.vue
+++ b/packages/frontend/src/components/MkSignin.vue
@@ -242,7 +242,7 @@ function resetPassword() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .eppvobhk {
 	> .auth {
 		> .avatar {
diff --git a/packages/frontend/src/components/MkSignup.vue b/packages/frontend/src/components/MkSignup.vue
index 07100b0985..d987425ca3 100644
--- a/packages/frontend/src/components/MkSignup.vue
+++ b/packages/frontend/src/components/MkSignup.vue
@@ -237,7 +237,7 @@ function onSubmit(): void {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .qlvuhzng {
 	.captcha {
 		margin: 16px 0;
diff --git a/packages/frontend/src/components/MkSparkle.vue b/packages/frontend/src/components/MkSparkle.vue
index 9c3107e810..cdeaf9c417 100644
--- a/packages/frontend/src/components/MkSparkle.vue
+++ b/packages/frontend/src/components/MkSparkle.vue
@@ -111,7 +111,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mk-sparkle {
 	position: relative;
 	display: inline-block;
diff --git a/packages/frontend/src/components/MkSubNoteContent.vue b/packages/frontend/src/components/MkSubNoteContent.vue
index b08a81b80d..210923be46 100644
--- a/packages/frontend/src/components/MkSubNoteContent.vue
+++ b/packages/frontend/src/components/MkSubNoteContent.vue
@@ -39,7 +39,7 @@ const collapsed = $ref(
 	));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .wrmlmaau {
 	overflow-wrap: break-word;
 
diff --git a/packages/frontend/src/components/MkSuperMenu.vue b/packages/frontend/src/components/MkSuperMenu.vue
index a91bfdced0..e79794aea4 100644
--- a/packages/frontend/src/components/MkSuperMenu.vue
+++ b/packages/frontend/src/components/MkSuperMenu.vue
@@ -41,7 +41,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .rrevdjwu {
 	> .group {
 		& + .group {
diff --git a/packages/frontend/src/components/MkTagCloud.vue b/packages/frontend/src/components/MkTagCloud.vue
index 51ad29457e..2dfd26edb0 100644
--- a/packages/frontend/src/components/MkTagCloud.vue
+++ b/packages/frontend/src/components/MkTagCloud.vue
@@ -70,7 +70,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .meijqfqm {
 	position: relative;
 	overflow: clip;
diff --git a/packages/frontend/src/components/MkToast.vue b/packages/frontend/src/components/MkToast.vue
index d5a592e0bd..c9fad64eb6 100644
--- a/packages/frontend/src/components/MkToast.vue
+++ b/packages/frontend/src/components/MkToast.vue
@@ -40,9 +40,7 @@ onMounted(() => {
 	opacity: 0;
 	transform: translateY(-100%);
 }
-</style>
 
-<style lang="scss">
 .mk-toast {
 	> .body {
 		position: fixed;
diff --git a/packages/frontend/src/components/MkTooltip.vue b/packages/frontend/src/components/MkTooltip.vue
index 84d3ecaa80..4c6258d245 100644
--- a/packages/frontend/src/components/MkTooltip.vue
+++ b/packages/frontend/src/components/MkTooltip.vue
@@ -86,9 +86,7 @@ onUnmounted(() => {
 	opacity: 0;
 	transform: scale(0.75);
 }
-</style>
 
-<style lang="scss">
 .buebdbiu {
 	position: absolute;
 	font-size: 0.8em;
diff --git a/packages/frontend/src/components/MkUpdated.vue b/packages/frontend/src/components/MkUpdated.vue
index 378f95633e..48aeb30224 100644
--- a/packages/frontend/src/components/MkUpdated.vue
+++ b/packages/frontend/src/components/MkUpdated.vue
@@ -25,7 +25,7 @@ const whatIsNew = () => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ewlycnyt {
 	position: relative;
 	padding: 32px;
diff --git a/packages/frontend/src/components/MkUrlPreview.vue b/packages/frontend/src/components/MkUrlPreview.vue
index d4d3aac745..b2d16ddb01 100644
--- a/packages/frontend/src/components/MkUrlPreview.vue
+++ b/packages/frontend/src/components/MkUrlPreview.vue
@@ -1,5 +1,5 @@
 <template>
-<div v-if="playerEnabled" class="mk-url-preview-player" :style="`padding: ${(player.height || 0) / (player.width || 1) * 100}% 0 0`">
+<div v-if="playerEnabled" class="player" :style="`padding: ${(player.height || 0) / (player.width || 1) * 100}% 0 0`">
 	<button class="disablePlayer" :title="i18n.ts.disablePlayer" @click="playerEnabled = false"><i class="ti ti-x"></i></button>
 	<iframe :src="player.url + (player.url.match(/\?/) ? '&autoplay=1&auto_play=1' : '?autoplay=1&auto_play=1')" :width="player.width || '100%'" :heigth="player.height || 250" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen/>
 </div>
@@ -121,8 +121,8 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss">
-.mk-url-preview-player {
+<style lang="scss" scoped>
+.player {
 	position: relative;
 	width: 100%;
 
diff --git a/packages/frontend/src/components/MkUrlPreviewPopup.vue b/packages/frontend/src/components/MkUrlPreviewPopup.vue
index 690c48eb88..f343c6d8a6 100644
--- a/packages/frontend/src/components/MkUrlPreviewPopup.vue
+++ b/packages/frontend/src/components/MkUrlPreviewPopup.vue
@@ -35,7 +35,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .fgmtyycl {
 	position: absolute;
 	width: 500px;
diff --git a/packages/frontend/src/components/MkUserInfo.vue b/packages/frontend/src/components/MkUserInfo.vue
index 6d2ed47113..036cbea304 100644
--- a/packages/frontend/src/components/MkUserInfo.vue
+++ b/packages/frontend/src/components/MkUserInfo.vue
@@ -39,7 +39,7 @@ defineProps<{
 }>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .vjnjpkug {
 	position: relative;
 
diff --git a/packages/frontend/src/components/MkUserList.vue b/packages/frontend/src/components/MkUserList.vue
index fcd096f377..e1f47c7673 100644
--- a/packages/frontend/src/components/MkUserList.vue
+++ b/packages/frontend/src/components/MkUserList.vue
@@ -30,7 +30,7 @@ const props = defineProps<{
 const pagingComponent = ref<InstanceType<typeof MkPagination>>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .efvhhmdq {
 	display: grid;
 	grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
diff --git a/packages/frontend/src/components/MkUserOnlineIndicator.vue b/packages/frontend/src/components/MkUserOnlineIndicator.vue
index ad78cdc834..a4f6f80383 100644
--- a/packages/frontend/src/components/MkUserOnlineIndicator.vue
+++ b/packages/frontend/src/components/MkUserOnlineIndicator.vue
@@ -21,7 +21,7 @@ const text = $computed(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .fzgwjkgc {
 	box-shadow: 0 0 0 3px var(--panel);
 	border-radius: 120%; // Blinkのバグか知らんけど、100%ぴったりにすると何故か若干楕円でレンダリングされる
diff --git a/packages/frontend/src/components/MkUserPreview.vue b/packages/frontend/src/components/MkUserPreview.vue
index 55105422c0..4de2e8baa2 100644
--- a/packages/frontend/src/components/MkUserPreview.vue
+++ b/packages/frontend/src/components/MkUserPreview.vue
@@ -89,9 +89,7 @@ onMounted(() => {
 	opacity: 0;
 	transform: scale(0.9);
 }
-</style>
 
-<style lang="scss">
 .fxxzrfni {
 	position: absolute;
 	width: 300px;
diff --git a/packages/frontend/src/components/MkUserSelectDialog.vue b/packages/frontend/src/components/MkUserSelectDialog.vue
index 530ff3469e..1d31769c30 100644
--- a/packages/frontend/src/components/MkUserSelectDialog.vue
+++ b/packages/frontend/src/components/MkUserSelectDialog.vue
@@ -115,7 +115,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .tbhwbxda {
 	> .form {
 		padding: 0 var(--root-margin);
diff --git a/packages/frontend/src/components/MkUsersTooltip.vue b/packages/frontend/src/components/MkUsersTooltip.vue
index 47a567130c..f0384e2d65 100644
--- a/packages/frontend/src/components/MkUsersTooltip.vue
+++ b/packages/frontend/src/components/MkUsersTooltip.vue
@@ -26,7 +26,7 @@ const emit = defineEmits<{
 }>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .beaffaef {
 	font-size: 0.9em;
 	text-align: left;
diff --git a/packages/frontend/src/components/MkVisibilityPicker.vue b/packages/frontend/src/components/MkVisibilityPicker.vue
index 4dd8891bc5..8f0bcdeae8 100644
--- a/packages/frontend/src/components/MkVisibilityPicker.vue
+++ b/packages/frontend/src/components/MkVisibilityPicker.vue
@@ -79,7 +79,7 @@ function choose(visibility: typeof misskey.noteVisibilities[number]): void {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .gqyayizv {
 	width: 240px;
 	padding: 8px 0;
diff --git a/packages/frontend/src/components/MkWaitingDialog.vue b/packages/frontend/src/components/MkWaitingDialog.vue
index 35591536de..f4a9f4f22c 100644
--- a/packages/frontend/src/components/MkWaitingDialog.vue
+++ b/packages/frontend/src/components/MkWaitingDialog.vue
@@ -35,7 +35,7 @@ watch(() => props.showing, () => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .iuyakobc {
 	position: relative;
 	padding: 32px;
diff --git a/packages/frontend/src/components/MkWindow.vue b/packages/frontend/src/components/MkWindow.vue
index ab3120a642..629c105810 100644
--- a/packages/frontend/src/components/MkWindow.vue
+++ b/packages/frontend/src/components/MkWindow.vue
@@ -416,9 +416,7 @@ defineExpose({
 	opacity: 0;
 	transform: scale(0.9);
 }
-</style>
 
-<style lang="scss">
 .ebkgocck {
 	position: fixed;
 	top: 0;
diff --git a/packages/frontend/src/components/form/checkbox.vue b/packages/frontend/src/components/form/checkbox.vue
index 347ef1cc64..ba3b2dc146 100644
--- a/packages/frontend/src/components/form/checkbox.vue
+++ b/packages/frontend/src/components/form/checkbox.vue
@@ -50,7 +50,7 @@ const toggle = () => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ziffeoms {
 	position: relative;
 	display: flex;
diff --git a/packages/frontend/src/components/form/folder.vue b/packages/frontend/src/components/form/folder.vue
index 6facc1ee35..1256dfcbb4 100644
--- a/packages/frontend/src/components/form/folder.vue
+++ b/packages/frontend/src/components/form/folder.vue
@@ -37,7 +37,7 @@ const toggle = () => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .dwzlatin {
 	display: block;
 
diff --git a/packages/frontend/src/components/form/input.vue b/packages/frontend/src/components/form/input.vue
index ebff201e14..939e9691a6 100644
--- a/packages/frontend/src/components/form/input.vue
+++ b/packages/frontend/src/components/form/input.vue
@@ -149,7 +149,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .matxzzsk {
 	> .label {
 		font-size: 0.85em;
diff --git a/packages/frontend/src/components/form/link.vue b/packages/frontend/src/components/form/link.vue
index decb77511e..a1775c0bdb 100644
--- a/packages/frontend/src/components/form/link.vue
+++ b/packages/frontend/src/components/form/link.vue
@@ -31,7 +31,7 @@ const props = defineProps<{
 }>();
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ffcbddfc {
 	display: block;
 
diff --git a/packages/frontend/src/components/form/radio.vue b/packages/frontend/src/components/form/radio.vue
index 3421893022..fcf454c77a 100644
--- a/packages/frontend/src/components/form/radio.vue
+++ b/packages/frontend/src/components/form/radio.vue
@@ -39,7 +39,7 @@ function toggle(): void {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .novjtctn {
 	position: relative;
 	display: inline-block;
diff --git a/packages/frontend/src/components/form/range.vue b/packages/frontend/src/components/form/range.vue
index cb20453bfc..db21c35717 100644
--- a/packages/frontend/src/components/form/range.vue
+++ b/packages/frontend/src/components/form/range.vue
@@ -141,7 +141,7 @@ const onMousedown = (ev: MouseEvent | TouchEvent) => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 @use "sass:math";
 
 .timctyfi {
diff --git a/packages/frontend/src/components/form/section.vue b/packages/frontend/src/components/form/section.vue
index b95caf40e5..c6e34ef1cc 100644
--- a/packages/frontend/src/components/form/section.vue
+++ b/packages/frontend/src/components/form/section.vue
@@ -10,7 +10,7 @@
 <script lang="ts" setup>
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .vrtktovh {
 	border-top: solid 0.5px var(--divider);
 	border-bottom: solid 0.5px var(--divider);
diff --git a/packages/frontend/src/components/form/select.vue b/packages/frontend/src/components/form/select.vue
index 324396ab79..eaf4b131cd 100644
--- a/packages/frontend/src/components/form/select.vue
+++ b/packages/frontend/src/components/form/select.vue
@@ -164,7 +164,7 @@ const onClick = (ev: MouseEvent) => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .vblkjoeq {
 	> .label {
 		font-size: 0.85em;
diff --git a/packages/frontend/src/components/form/slot.vue b/packages/frontend/src/components/form/slot.vue
index bc66c5b18b..79ce8fe51f 100644
--- a/packages/frontend/src/components/form/slot.vue
+++ b/packages/frontend/src/components/form/slot.vue
@@ -16,7 +16,7 @@ function focus() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .adhpbeou {
 	> .label {
 		font-size: 0.85em;
diff --git a/packages/frontend/src/components/form/split.vue b/packages/frontend/src/components/form/split.vue
index 2534d484ef..301a8a84e5 100644
--- a/packages/frontend/src/components/form/split.vue
+++ b/packages/frontend/src/components/form/split.vue
@@ -14,7 +14,7 @@ const props = withDefaults(defineProps<{
 const minWidth = props.minWidth + 'px';
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .terlnhxf {
 	display: grid;
 	grid-template-columns: repeat(auto-fill, minmax(v-bind('minWidth'), 1fr));
diff --git a/packages/frontend/src/components/form/suspense.vue b/packages/frontend/src/components/form/suspense.vue
index 5fbcde974c..7efa501f27 100644
--- a/packages/frontend/src/components/form/suspense.vue
+++ b/packages/frontend/src/components/form/suspense.vue
@@ -86,9 +86,7 @@ export default defineComponent({
 .fade-leave-to {
 	opacity: 0;
 }
-</style>
 
-<style lang="scss">
 .wszdbhzo {
 	padding: 16px;
 	text-align: center;
diff --git a/packages/frontend/src/components/form/switch.vue b/packages/frontend/src/components/form/switch.vue
index faf8acb0da..1ed00ae655 100644
--- a/packages/frontend/src/components/form/switch.vue
+++ b/packages/frontend/src/components/form/switch.vue
@@ -46,7 +46,7 @@ const toggle = () => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ziffeomt {
 	position: relative;
 	display: flex;
diff --git a/packages/frontend/src/components/form/textarea.vue b/packages/frontend/src/components/form/textarea.vue
index 78a7e8eedb..d34d7b1775 100644
--- a/packages/frontend/src/components/form/textarea.vue
+++ b/packages/frontend/src/components/form/textarea.vue
@@ -174,7 +174,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .adhpbeos {
 	> .label {
 		font-size: 0.85em;
diff --git a/packages/frontend/src/components/global/MkAcct.vue b/packages/frontend/src/components/global/MkAcct.vue
index 4cebae25e2..c3e806b5fb 100644
--- a/packages/frontend/src/components/global/MkAcct.vue
+++ b/packages/frontend/src/components/global/MkAcct.vue
@@ -18,7 +18,7 @@ defineProps<{
 const host = toUnicode(hostRaw);
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mk-acct {
 	> .host {
 		opacity: 0.5;
diff --git a/packages/frontend/src/components/global/MkAd.vue b/packages/frontend/src/components/global/MkAd.vue
index 238fada4a0..a80efb142c 100644
--- a/packages/frontend/src/components/global/MkAd.vue
+++ b/packages/frontend/src/components/global/MkAd.vue
@@ -92,7 +92,7 @@ function reduceFrequency(): void {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .qiivuoyo {
 	background-size: auto auto;
 	background-image: repeating-linear-gradient(45deg, transparent, transparent 8px, var(--ad) 8px, var(--ad) 14px );
diff --git a/packages/frontend/src/components/global/MkAvatar.vue b/packages/frontend/src/components/global/MkAvatar.vue
index ed1f9ff5ad..5f3e3c176d 100644
--- a/packages/frontend/src/components/global/MkAvatar.vue
+++ b/packages/frontend/src/components/global/MkAvatar.vue
@@ -52,7 +52,7 @@ watch(() => props.user.avatarBlurhash, () => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 @keyframes earwiggleleft {
 	from { transform: rotate(37.6deg) skew(30deg); }
 	25% { transform: rotate(10deg) skew(30deg); }
diff --git a/packages/frontend/src/components/global/MkEllipsis.vue b/packages/frontend/src/components/global/MkEllipsis.vue
index f02b228c71..0a46f486d6 100644
--- a/packages/frontend/src/components/global/MkEllipsis.vue
+++ b/packages/frontend/src/components/global/MkEllipsis.vue
@@ -1,21 +1,10 @@
 <template>
-<span class="mk-ellipsis">
-	<span>.</span><span>.</span><span>.</span>
-</span>
+	<span class="mk-ellipsis">
+		<span>.</span><span>.</span><span>.</span>
+	</span>
 </template>
 
 <style lang="scss" scoped>
-@keyframes ellipsis {
-	0%, 80%, 100% {
-		opacity: 1;
-	}
-	40% {
-		opacity: 0;
-	}
-}
-</style>
-
-<style lang="scss">
 .mk-ellipsis {
 	> span {
 		animation: ellipsis 1.4s infinite ease-in-out both;
@@ -33,4 +22,13 @@
 		}
 	}
 }
+
+@keyframes ellipsis {
+	0%, 80%, 100% {
+		opacity: 1;
+	}
+	40% {
+		opacity: 0;
+	}
+}
 </style>
diff --git a/packages/frontend/src/components/global/MkEmoji.vue b/packages/frontend/src/components/global/MkEmoji.vue
index 4967b0949d..ce1299a39f 100644
--- a/packages/frontend/src/components/global/MkEmoji.vue
+++ b/packages/frontend/src/components/global/MkEmoji.vue
@@ -50,7 +50,7 @@ function computeTitle(event: PointerEvent): void {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mk-emoji {
 	height: 1.25em;
 	vertical-align: -0.25em;
diff --git a/packages/frontend/src/components/global/MkError.vue b/packages/frontend/src/components/global/MkError.vue
index 0ab31ac0da..e135d4184b 100644
--- a/packages/frontend/src/components/global/MkError.vue
+++ b/packages/frontend/src/components/global/MkError.vue
@@ -13,7 +13,7 @@ import MkButton from '@/components/MkButton.vue';
 import { i18n } from '@/i18n';
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mjndxjcg {
 	padding: 32px;
 	text-align: center;
diff --git a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.vue b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.vue
index dc98f14839..70d0108e9f 100644
--- a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.vue
+++ b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.vue
@@ -1,5 +1,5 @@
 <template>
-<MfmCore :text="text" :plain="plain" :nowrap="nowrap" :author="author" :custom-emojis="customEmojis" :is-note="isNote" class="havbbuyv" :class="{ nowrap }"/>
+<MfmCore :text="text" :plain="plain" :nowrap="nowrap" :author="author" :customEmojis="customEmojis" :isNote="isNote" class="havbbuyv" :class="{ nowrap }"/>
 </template>
 
 <script lang="ts" setup>
@@ -158,7 +158,7 @@ const props = withDefaults(defineProps<{
 }
 </style>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .havbbuyv {
 	white-space: pre-wrap;
 
diff --git a/packages/frontend/src/components/global/MkPageHeader.vue b/packages/frontend/src/components/global/MkPageHeader.vue
index 5b6779d247..a228dfe883 100644
--- a/packages/frontend/src/components/global/MkPageHeader.vue
+++ b/packages/frontend/src/components/global/MkPageHeader.vue
@@ -65,7 +65,7 @@ const props = withDefaults(defineProps<{
 	thin?: boolean;
 	displayMyAvatar?: boolean;
 }>(), {
-	tabs: () => ([] as Tab[]),
+	tabs: () => ([] as Tab[])
 });
 
 const emit = defineEmits<{
@@ -178,7 +178,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .fdidabkb {
 	--height: 52px;
 	display: flex;
diff --git a/packages/frontend/src/components/global/MkUrl.vue b/packages/frontend/src/components/global/MkUrl.vue
index bc15d11a41..9f5be96224 100644
--- a/packages/frontend/src/components/global/MkUrl.vue
+++ b/packages/frontend/src/components/global/MkUrl.vue
@@ -53,7 +53,7 @@ const attr = self ? 'to' : 'href';
 const target = self ? null : '_blank';
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ieqqeuvs {
 	word-break: break-all;
 
diff --git a/packages/frontend/src/components/page/page.button.vue b/packages/frontend/src/components/page/page.button.vue
index 875f22f4fc..83931021d8 100644
--- a/packages/frontend/src/components/page/page.button.vue
+++ b/packages/frontend/src/components/page/page.button.vue
@@ -56,7 +56,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .kudkigyw {
 	display: inline-block;
 	min-width: 200px;
diff --git a/packages/frontend/src/components/page/page.canvas.vue b/packages/frontend/src/components/page/page.canvas.vue
index a2327db40d..80f6c8339c 100644
--- a/packages/frontend/src/components/page/page.canvas.vue
+++ b/packages/frontend/src/components/page/page.canvas.vue
@@ -35,7 +35,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ysrxegms {
 	display: inline-block;
 	vertical-align: bottom;
diff --git a/packages/frontend/src/components/page/page.counter.vue b/packages/frontend/src/components/page/page.counter.vue
index 8455b24307..a9e1f41a54 100644
--- a/packages/frontend/src/components/page/page.counter.vue
+++ b/packages/frontend/src/components/page/page.counter.vue
@@ -42,7 +42,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .llumlmnx {
 	display: inline-block;
 	min-width: 300px;
diff --git a/packages/frontend/src/components/page/page.image.vue b/packages/frontend/src/components/page/page.image.vue
index 7b03167c6d..8ba70c5855 100644
--- a/packages/frontend/src/components/page/page.image.vue
+++ b/packages/frontend/src/components/page/page.image.vue
@@ -19,7 +19,7 @@ const props = defineProps<{
 const image = props.hpml.page.attachedFiles.find(x => x.id === props.block.fileId);
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .lzyxtsnt {
 	> img {
 		max-width: 100%;
diff --git a/packages/frontend/src/components/page/page.note.vue b/packages/frontend/src/components/page/page.note.vue
index 064143751b..7d5c484a1b 100644
--- a/packages/frontend/src/components/page/page.note.vue
+++ b/packages/frontend/src/components/page/page.note.vue
@@ -28,9 +28,9 @@ export default defineComponent({
 
 		onMounted(() => {
 			os.api('notes/show', { noteId: props.block.note })
-				.then(result => {
-					note.value = result;
-				});
+			.then(result => {
+				note.value = result;
+			});
 		});
 
 		return {
@@ -40,7 +40,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .voxdxuby {
 	margin: 1em 0;
 }
diff --git a/packages/frontend/src/components/page/page.number-input.vue b/packages/frontend/src/components/page/page.number-input.vue
index 7a76804d62..50cf6d0770 100644
--- a/packages/frontend/src/components/page/page.number-input.vue
+++ b/packages/frontend/src/components/page/page.number-input.vue
@@ -45,7 +45,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .kudkigyw {
 	display: inline-block;
 	min-width: 300px;
diff --git a/packages/frontend/src/components/page/page.post.vue b/packages/frontend/src/components/page/page.post.vue
index f1749454e9..0ef50d65cd 100644
--- a/packages/frontend/src/components/page/page.post.vue
+++ b/packages/frontend/src/components/page/page.post.vue
@@ -86,7 +86,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ngbfujlo {
 	position: relative;
 	padding: 32px;
diff --git a/packages/frontend/src/components/page/page.section.vue b/packages/frontend/src/components/page/page.section.vue
index 58be2e2872..630c1f5179 100644
--- a/packages/frontend/src/components/page/page.section.vue
+++ b/packages/frontend/src/components/page/page.section.vue
@@ -34,7 +34,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .sdgxphyu {
 	margin: 1.5em 0;
 
diff --git a/packages/frontend/src/components/page/page.switch.vue b/packages/frontend/src/components/page/page.switch.vue
index c90562d0a6..64dc4ff8aa 100644
--- a/packages/frontend/src/components/page/page.switch.vue
+++ b/packages/frontend/src/components/page/page.switch.vue
@@ -43,7 +43,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .hkcxmtwj {
 	display: inline-block;
 	margin: 16px auto;
diff --git a/packages/frontend/src/components/page/page.text-input.vue b/packages/frontend/src/components/page/page.text-input.vue
index 70ec1aeb16..840649ece6 100644
--- a/packages/frontend/src/components/page/page.text-input.vue
+++ b/packages/frontend/src/components/page/page.text-input.vue
@@ -45,7 +45,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .kudkigyw {
 	display: inline-block;
 	min-width: 300px;
diff --git a/packages/frontend/src/components/page/page.text.vue b/packages/frontend/src/components/page/page.text.vue
index 02a33090c2..689c484521 100644
--- a/packages/frontend/src/components/page/page.text.vue
+++ b/packages/frontend/src/components/page/page.text.vue
@@ -6,10 +6,10 @@
 </template>
 
 <script lang="ts">
-import { defineAsyncComponent, defineComponent, PropType } from 'vue';
-import * as mfm from 'mfm-js';
 import { TextBlock } from '@/scripts/hpml/block';
 import { Hpml } from '@/scripts/hpml/evaluator';
+import { defineAsyncComponent, defineComponent, PropType } from 'vue';
+import * as mfm from 'mfm-js';
 import { extractUrlFromMfm } from '@/scripts/extract-url-from-mfm';
 
 export default defineComponent({
@@ -51,7 +51,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mrdgzndn {
 	&:not(:first-child) {
 		margin-top: 0.5em;
diff --git a/packages/frontend/src/components/page/page.vue b/packages/frontend/src/components/page/page.vue
index d43a4e4271..b5cb73c009 100644
--- a/packages/frontend/src/components/page/page.vue
+++ b/packages/frontend/src/components/page/page.vue
@@ -70,7 +70,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .iroscrza {
 	&.serif {
 		> div {
diff --git a/packages/frontend/src/pages/_error_.vue b/packages/frontend/src/pages/_error_.vue
index 1d3ff7b220..232d525347 100644
--- a/packages/frontend/src/pages/_error_.vue
+++ b/packages/frontend/src/pages/_error_.vue
@@ -62,7 +62,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mjndxjch {
 	padding: 32px;
 	text-align: center;
diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue
index ded3c71620..3ec972bcda 100644
--- a/packages/frontend/src/pages/about-misskey.vue
+++ b/packages/frontend/src/pages/about-misskey.vue
@@ -207,7 +207,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .znqjceqz {
 	> .about {
 		position: relative;
diff --git a/packages/frontend/src/pages/about.emojis.vue b/packages/frontend/src/pages/about.emojis.vue
index b0b63028d9..53ce1e4b75 100644
--- a/packages/frontend/src/pages/about.emojis.vue
+++ b/packages/frontend/src/pages/about.emojis.vue
@@ -95,7 +95,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .driuhtrh {
 	background: var(--bg);
 
diff --git a/packages/frontend/src/pages/about.federation.vue b/packages/frontend/src/pages/about.federation.vue
index 49ca65294d..6c92ab1264 100644
--- a/packages/frontend/src/pages/about.federation.vue
+++ b/packages/frontend/src/pages/about.federation.vue
@@ -86,7 +86,7 @@ function getStatus(instance) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .taeiyria {
 	> .query {
 		background: var(--bg);
diff --git a/packages/frontend/src/pages/about.vue b/packages/frontend/src/pages/about.vue
index b2e3789d55..0ed692c5c5 100644
--- a/packages/frontend/src/pages/about.vue
+++ b/packages/frontend/src/pages/about.vue
@@ -136,7 +136,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .fwhjspax {
 	text-align: center;
 	border-radius: 10px;
diff --git a/packages/frontend/src/pages/admin-file.vue b/packages/frontend/src/pages/admin-file.vue
index e971ccc45b..a11249e75d 100644
--- a/packages/frontend/src/pages/admin-file.vue
+++ b/packages/frontend/src/pages/admin-file.vue
@@ -140,7 +140,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .cxqhhsmd {
 	> .thumbnail {
 		display: block;
diff --git a/packages/frontend/src/pages/admin/_header_.vue b/packages/frontend/src/pages/admin/_header_.vue
index f2c840c5f0..bdb41b2d2c 100644
--- a/packages/frontend/src/pages/admin/_header_.vue
+++ b/packages/frontend/src/pages/admin/_header_.vue
@@ -147,7 +147,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .fdidabkc {
 	--height: 60px;
 	display: flex;
diff --git a/packages/frontend/src/pages/admin/abuses.vue b/packages/frontend/src/pages/admin/abuses.vue
index 3be203cc84..973ec871ab 100644
--- a/packages/frontend/src/pages/admin/abuses.vue
+++ b/packages/frontend/src/pages/admin/abuses.vue
@@ -90,7 +90,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .lcixvhis {
 	margin: var(--margin);
 }
diff --git a/packages/frontend/src/pages/admin/ads.vue b/packages/frontend/src/pages/admin/ads.vue
index e8ee929898..2ec926c65c 100644
--- a/packages/frontend/src/pages/admin/ads.vue
+++ b/packages/frontend/src/pages/admin/ads.vue
@@ -119,7 +119,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .uqshojas {
 	> .ad {
 		padding: 32px;
diff --git a/packages/frontend/src/pages/admin/announcements.vue b/packages/frontend/src/pages/admin/announcements.vue
index 3fdbc2e859..607ad8aa02 100644
--- a/packages/frontend/src/pages/admin/announcements.vue
+++ b/packages/frontend/src/pages/admin/announcements.vue
@@ -105,7 +105,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ztgjmzrw {
 	margin: var(--margin);
 }
diff --git a/packages/frontend/src/pages/admin/emoji-edit-dialog.vue b/packages/frontend/src/pages/admin/emoji-edit-dialog.vue
index 3cfc77bede..bd601cb1de 100644
--- a/packages/frontend/src/pages/admin/emoji-edit-dialog.vue
+++ b/packages/frontend/src/pages/admin/emoji-edit-dialog.vue
@@ -95,7 +95,7 @@ async function del() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .yigymqpb {
 	> .img {
 		display: block;
diff --git a/packages/frontend/src/pages/admin/emojis.vue b/packages/frontend/src/pages/admin/emojis.vue
index 5af28a27db..14c8466d73 100644
--- a/packages/frontend/src/pages/admin/emojis.vue
+++ b/packages/frontend/src/pages/admin/emojis.vue
@@ -295,7 +295,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ogwlenmc {
 	> .local {
 		.empty {
diff --git a/packages/frontend/src/pages/admin/files.vue b/packages/frontend/src/pages/admin/files.vue
index 6c599383a7..8ad6bd4fc0 100644
--- a/packages/frontend/src/pages/admin/files.vue
+++ b/packages/frontend/src/pages/admin/files.vue
@@ -113,7 +113,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .xrmjdkdw {
 	margin: var(--margin);
 }
diff --git a/packages/frontend/src/pages/admin/index.vue b/packages/frontend/src/pages/admin/index.vue
index 7da5d188d3..6c07a87eeb 100644
--- a/packages/frontend/src/pages/admin/index.vue
+++ b/packages/frontend/src/pages/admin/index.vue
@@ -272,7 +272,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .hiyeyicy {
 	&.wide {
 		display: flex;
diff --git a/packages/frontend/src/pages/admin/metrics.vue b/packages/frontend/src/pages/admin/metrics.vue
index 49954baa80..db8e448639 100644
--- a/packages/frontend/src/pages/admin/metrics.vue
+++ b/packages/frontend/src/pages/admin/metrics.vue
@@ -53,43 +53,43 @@
 <script lang="ts">
 import { defineComponent, markRaw } from 'vue';
 import {
-	Chart,
-	ArcElement,
-	LineElement,
-	BarElement,
-	PointElement,
-	BarController,
-	LineController,
-	CategoryScale,
-	LinearScale,
-	Legend,
-	Title,
-	Tooltip,
-	SubTitle,
+  Chart,
+  ArcElement,
+  LineElement,
+  BarElement,
+  PointElement,
+  BarController,
+  LineController,
+  CategoryScale,
+  LinearScale,
+  Legend,
+  Title,
+  Tooltip,
+  SubTitle,
 } from 'chart.js';
-import MkwFederation from '../../widgets/federation.vue';
 import MkButton from '@/components/MkButton.vue';
 import MkSelect from '@/components/form/select.vue';
 import MkInput from '@/components/form/input.vue';
 import MkContainer from '@/components/MkContainer.vue';
 import MkFolder from '@/components/MkFolder.vue';
+import MkwFederation from '../../widgets/federation.vue';
 import { version, url } from '@/config';
 import bytes from '@/filters/bytes';
 import number from '@/filters/number';
 
 Chart.register(
-	ArcElement,
-	LineElement,
-	BarElement,
-	PointElement,
-	BarController,
-	LineController,
-	CategoryScale,
-	LinearScale,
-	Legend,
-	Title,
-	Tooltip,
-	SubTitle,
+  ArcElement,
+  LineElement,
+  BarElement,
+  PointElement,
+  BarController,
+  LineController,
+  CategoryScale,
+  LinearScale,
+  Legend,
+  Title,
+  Tooltip,
+  SubTitle,
 );
 
 const alpha = (hex, a) => {
@@ -462,7 +462,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .xhexznfu {
 	> div:nth-child(2) {
 		padding: 16px;
diff --git a/packages/frontend/src/pages/admin/overview.instances.vue b/packages/frontend/src/pages/admin/overview.instances.vue
index f4c135663c..29848bf03b 100644
--- a/packages/frontend/src/pages/admin/overview.instances.vue
+++ b/packages/frontend/src/pages/admin/overview.instances.vue
@@ -35,7 +35,7 @@ useInterval(fetch, 1000 * 60, {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .wbrkwale {
 	> .instances {
 		display: grid;
diff --git a/packages/frontend/src/pages/admin/overview.pie.vue b/packages/frontend/src/pages/admin/overview.pie.vue
index 93f3a1f283..94509cf006 100644
--- a/packages/frontend/src/pages/admin/overview.pie.vue
+++ b/packages/frontend/src/pages/admin/overview.pie.vue
@@ -105,6 +105,6 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/pages/admin/overview.queue.chart.vue b/packages/frontend/src/pages/admin/overview.queue.chart.vue
index e2f4868fdc..1e095bddaa 100644
--- a/packages/frontend/src/pages/admin/overview.queue.chart.vue
+++ b/packages/frontend/src/pages/admin/overview.queue.chart.vue
@@ -181,6 +181,6 @@ defineExpose({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/pages/admin/overview.vue b/packages/frontend/src/pages/admin/overview.vue
index 231f677eae..d656e55200 100644
--- a/packages/frontend/src/pages/admin/overview.vue
+++ b/packages/frontend/src/pages/admin/overview.vue
@@ -181,7 +181,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .edbbcaef {
 	display: grid;
 	grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
diff --git a/packages/frontend/src/pages/admin/queue.chart.chart.vue b/packages/frontend/src/pages/admin/queue.chart.chart.vue
index 433774402a..5777674ae3 100644
--- a/packages/frontend/src/pages/admin/queue.chart.chart.vue
+++ b/packages/frontend/src/pages/admin/queue.chart.chart.vue
@@ -181,6 +181,6 @@ defineExpose({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/pages/admin/queue.chart.vue b/packages/frontend/src/pages/admin/queue.chart.vue
index 06030c75a5..186a22c43e 100644
--- a/packages/frontend/src/pages/admin/queue.chart.vue
+++ b/packages/frontend/src/pages/admin/queue.chart.vue
@@ -113,7 +113,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .pumxzjhg {
 	> .status {
 		padding: 16px;
diff --git a/packages/frontend/src/pages/admin/relays.vue b/packages/frontend/src/pages/admin/relays.vue
index 3a58d69dac..4768ae67b1 100644
--- a/packages/frontend/src/pages/admin/relays.vue
+++ b/packages/frontend/src/pages/admin/relays.vue
@@ -81,7 +81,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .relaycxt {
 	> .status {
 		margin: 8px 0;
diff --git a/packages/frontend/src/pages/admin/users.vue b/packages/frontend/src/pages/admin/users.vue
index 96a901c779..d466e21907 100644
--- a/packages/frontend/src/pages/admin/users.vue
+++ b/packages/frontend/src/pages/admin/users.vue
@@ -138,7 +138,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .lknzcolw {
 	> .users {
 
diff --git a/packages/frontend/src/pages/announcements.vue b/packages/frontend/src/pages/announcements.vue
index c30f207d12..6a93b3b9fa 100644
--- a/packages/frontend/src/pages/announcements.vue
+++ b/packages/frontend/src/pages/announcements.vue
@@ -50,7 +50,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ruryvtyk {
 	> .announcement {
 		&:not(:last-child) {
diff --git a/packages/frontend/src/pages/antenna-timeline.vue b/packages/frontend/src/pages/antenna-timeline.vue
index 141af260b0..0b2c284c99 100644
--- a/packages/frontend/src/pages/antenna-timeline.vue
+++ b/packages/frontend/src/pages/antenna-timeline.vue
@@ -89,7 +89,7 @@ definePageMetadata(computed(() => antenna ? {
 } : null));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .tqmomfks {
 	padding: var(--margin);
 
diff --git a/packages/frontend/src/pages/auth.vue b/packages/frontend/src/pages/auth.vue
index 5c4916b657..bb55881a22 100644
--- a/packages/frontend/src/pages/auth.vue
+++ b/packages/frontend/src/pages/auth.vue
@@ -86,6 +86,6 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/pages/channel-editor.vue b/packages/frontend/src/pages/channel-editor.vue
index 4345163d9d..5ae7e63f99 100644
--- a/packages/frontend/src/pages/channel-editor.vue
+++ b/packages/frontend/src/pages/channel-editor.vue
@@ -117,6 +117,6 @@ definePageMetadata(computed(() => props.channelId ? {
 }));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/pages/channel.vue b/packages/frontend/src/pages/channel.vue
index 04bbb6ed9a..f271bb270f 100644
--- a/packages/frontend/src/pages/channel.vue
+++ b/packages/frontend/src/pages/channel.vue
@@ -83,7 +83,7 @@ definePageMetadata(computed(() => channel ? {
 } : null));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .wpgynlbz {
 	position: relative;
 
diff --git a/packages/frontend/src/pages/clip.vue b/packages/frontend/src/pages/clip.vue
index b47ce13557..e0fbcb6bed 100644
--- a/packages/frontend/src/pages/clip.vue
+++ b/packages/frontend/src/pages/clip.vue
@@ -1,7 +1,7 @@
 <template>
 <MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions"/></template>
-	<MkSpacer :content-max="800">
+		<MkSpacer :content-max="800">
 		<div v-if="clip">
 			<div class="okzinsic _panel">
 				<div v-if="clip.description" class="description">
@@ -105,7 +105,7 @@ definePageMetadata(computed(() => clip ? {
 } : null));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .okzinsic {
 	position: relative;
 	margin-bottom: var(--margin);
diff --git a/packages/frontend/src/pages/emojis.emoji.vue b/packages/frontend/src/pages/emojis.emoji.vue
index 55a4eb2cdf..40fe496520 100644
--- a/packages/frontend/src/pages/emojis.emoji.vue
+++ b/packages/frontend/src/pages/emojis.emoji.vue
@@ -33,7 +33,7 @@ function menu(ev) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .zuvgdzyu {
 	display: flex;
 	align-items: center;
diff --git a/packages/frontend/src/pages/explore.users.vue b/packages/frontend/src/pages/explore.users.vue
index 9d77aae731..bfee0a6c07 100644
--- a/packages/frontend/src/pages/explore.users.vue
+++ b/packages/frontend/src/pages/explore.users.vue
@@ -135,7 +135,7 @@ os.api('hashtags/list', {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .vxjfqztj {
 	> * {
 		margin-right: 16px;
diff --git a/packages/frontend/src/pages/follow-requests.vue b/packages/frontend/src/pages/follow-requests.vue
index fe1482bd6a..b20679ccc1 100644
--- a/packages/frontend/src/pages/follow-requests.vue
+++ b/packages/frontend/src/pages/follow-requests.vue
@@ -71,7 +71,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mk-follow-requests {
 	> .user {
 		display: flex;
diff --git a/packages/frontend/src/pages/gallery/edit.vue b/packages/frontend/src/pages/gallery/edit.vue
index ac1e2b4855..c8111d7890 100644
--- a/packages/frontend/src/pages/gallery/edit.vue
+++ b/packages/frontend/src/pages/gallery/edit.vue
@@ -122,7 +122,7 @@ definePageMetadata(computed(() => props.postId ? {
 }));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .wqugxsfx {
 	height: 200px;
 	background-size: contain;
diff --git a/packages/frontend/src/pages/gallery/index.vue b/packages/frontend/src/pages/gallery/index.vue
index 4b285658aa..24a634bab5 100644
--- a/packages/frontend/src/pages/gallery/index.vue
+++ b/packages/frontend/src/pages/gallery/index.vue
@@ -125,7 +125,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .vfpdbgtk {
 	display: grid;
 	grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
diff --git a/packages/frontend/src/pages/gallery/post.vue b/packages/frontend/src/pages/gallery/post.vue
index 86282bc9fb..85ab1048be 100644
--- a/packages/frontend/src/pages/gallery/post.vue
+++ b/packages/frontend/src/pages/gallery/post.vue
@@ -161,9 +161,7 @@ definePageMetadata(computed(() => post ? {
 .fade-leave-to {
 	opacity: 0;
 }
-</style>
 
-<style lang="scss">
 .rkxwuolj {
 	> .files {
 		> .file {
diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue
index d9a09d3e3a..a2a1254360 100644
--- a/packages/frontend/src/pages/instance-info.vue
+++ b/packages/frontend/src/pages/instance-info.vue
@@ -225,7 +225,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .fnfelxur {
 	display: flex;
 	align-items: center;
diff --git a/packages/frontend/src/pages/messaging/index.vue b/packages/frontend/src/pages/messaging/index.vue
index 747dae06c5..0d30998330 100644
--- a/packages/frontend/src/pages/messaging/index.vue
+++ b/packages/frontend/src/pages/messaging/index.vue
@@ -162,7 +162,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .yweeujhr {
 
 	> .start {
diff --git a/packages/frontend/src/pages/messaging/messaging-room.form.vue b/packages/frontend/src/pages/messaging/messaging-room.form.vue
index ae9923235f..84572815c0 100644
--- a/packages/frontend/src/pages/messaging/messaging-room.form.vue
+++ b/packages/frontend/src/pages/messaging/messaging-room.form.vue
@@ -235,7 +235,7 @@ defineExpose({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .pemppnzi {
 	position: relative;
 
diff --git a/packages/frontend/src/pages/messaging/messaging-room.message.vue b/packages/frontend/src/pages/messaging/messaging-room.message.vue
index 1d30c21c17..dbf0e37b73 100644
--- a/packages/frontend/src/pages/messaging/messaging-room.message.vue
+++ b/packages/frontend/src/pages/messaging/messaging-room.message.vue
@@ -59,7 +59,7 @@ function del(): void {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .thvuemwp {
 	$me-balloon-color: var(--accent);
 
diff --git a/packages/frontend/src/pages/messaging/messaging-room.vue b/packages/frontend/src/pages/messaging/messaging-room.vue
index 1ffd6ef4a5..b6eeb9260e 100644
--- a/packages/frontend/src/pages/messaging/messaging-room.vue
+++ b/packages/frontend/src/pages/messaging/messaging-room.vue
@@ -305,17 +305,6 @@ definePageMetadata(computed(() => !fetching ? user ? {
 </script>
 
 <style lang="scss" scoped>
-.fade-enter-active, .fade-leave-active {
-	transition: opacity 0.1s;
-}
-
-.fade-enter-from, .fade-leave-to {
-	transition: opacity 0.5s;
-	opacity: 0;
-}
-</style>
-
-<style lang="scss">
 .mk-messaging-room {
 	position: relative;
 	overflow: auto;
@@ -410,4 +399,13 @@ definePageMetadata(computed(() => !fetching ? user ? {
 		}
 	}
 }
+
+.fade-enter-active, .fade-leave-active {
+	transition: opacity 0.1s;
+}
+
+.fade-enter-from, .fade-leave-to {
+	transition: opacity 0.5s;
+	opacity: 0;
+}
 </style>
diff --git a/packages/frontend/src/pages/mfm-cheat-sheet.vue b/packages/frontend/src/pages/mfm-cheat-sheet.vue
index cf34697f9b..7c85dfb7ad 100644
--- a/packages/frontend/src/pages/mfm-cheat-sheet.vue
+++ b/packages/frontend/src/pages/mfm-cheat-sheet.vue
@@ -355,7 +355,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mwysmxbg {
 	background: var(--bg);
 
diff --git a/packages/frontend/src/pages/miauth.vue b/packages/frontend/src/pages/miauth.vue
index e1a5676ad2..5de072cbfa 100644
--- a/packages/frontend/src/pages/miauth.vue
+++ b/packages/frontend/src/pages/miauth.vue
@@ -85,6 +85,6 @@ function onLogin(res): void {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/pages/my-antennas/create.vue b/packages/frontend/src/pages/my-antennas/create.vue
index 5680ded96a..005b036696 100644
--- a/packages/frontend/src/pages/my-antennas/create.vue
+++ b/packages/frontend/src/pages/my-antennas/create.vue
@@ -41,6 +41,6 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/pages/my-antennas/edit.vue b/packages/frontend/src/pages/my-antennas/edit.vue
index 182d14ace9..cb583faaeb 100644
--- a/packages/frontend/src/pages/my-antennas/edit.vue
+++ b/packages/frontend/src/pages/my-antennas/edit.vue
@@ -38,6 +38,6 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/pages/my-antennas/editor.vue b/packages/frontend/src/pages/my-antennas/editor.vue
index 245706ab88..a409a734b5 100644
--- a/packages/frontend/src/pages/my-antennas/editor.vue
+++ b/packages/frontend/src/pages/my-antennas/editor.vue
@@ -141,7 +141,7 @@ function addUser() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .shaynizk {
 	> .form {
 		padding: 32px;
diff --git a/packages/frontend/src/pages/my-antennas/index.vue b/packages/frontend/src/pages/my-antennas/index.vue
index e3512a3a20..9daf23f9b5 100644
--- a/packages/frontend/src/pages/my-antennas/index.vue
+++ b/packages/frontend/src/pages/my-antennas/index.vue
@@ -1,20 +1,18 @@
-<template>
-<MkStickyContainer>
+<template><MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
-	<MkSpacer :content-max="700">
-		<div class="ieepwinx">
-			<MkButton :link="true" to="/my/antennas/create" primary class="add"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton>
+		<MkSpacer :content-max="700">
+	<div class="ieepwinx">
+		<MkButton :link="true" to="/my/antennas/create" primary class="add"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton>
 
-			<div class="">
-				<MkPagination v-slot="{items}" ref="list" :pagination="pagination">
-					<MkA v-for="antenna in items" :key="antenna.id" class="ljoevbzj" :to="`/my/antennas/${antenna.id}`">
-						<div class="name">{{ antenna.name }}</div>
-					</MkA>
-				</MkPagination>
-			</div>
+		<div class="">
+			<MkPagination v-slot="{items}" ref="list" :pagination="pagination">
+				<MkA v-for="antenna in items" :key="antenna.id" class="ljoevbzj" :to="`/my/antennas/${antenna.id}`">
+					<div class="name">{{ antenna.name }}</div>
+				</MkA>
+			</MkPagination>
 		</div>
-	</MkSpacer>
-</MkStickyContainer>
+	</div>
+</MkSpacer></MkStickyContainer>
 </template>
 
 <script lang="ts" setup>
@@ -39,7 +37,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ieepwinx {
 
 	> .add {
diff --git a/packages/frontend/src/pages/my-clips/index.vue b/packages/frontend/src/pages/my-clips/index.vue
index 4bf1bde030..dd6b5b3a37 100644
--- a/packages/frontend/src/pages/my-clips/index.vue
+++ b/packages/frontend/src/pages/my-clips/index.vue
@@ -78,7 +78,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .qtcaoidl {
 	> .add {
 		margin: 0 auto 16px auto;
diff --git a/packages/frontend/src/pages/my-lists/index.vue b/packages/frontend/src/pages/my-lists/index.vue
index 24f9de1d90..3476436b27 100644
--- a/packages/frontend/src/pages/my-lists/index.vue
+++ b/packages/frontend/src/pages/my-lists/index.vue
@@ -55,7 +55,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .qkcjvfiv {
 	> .add {
 		margin: 0 auto var(--margin) auto;
diff --git a/packages/frontend/src/pages/my-lists/list.vue b/packages/frontend/src/pages/my-lists/list.vue
index e20fd5d241..f6234ffe44 100644
--- a/packages/frontend/src/pages/my-lists/list.vue
+++ b/packages/frontend/src/pages/my-lists/list.vue
@@ -126,7 +126,7 @@ definePageMetadata(computed(() => list ? {
 } : null));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mk-list-page {
 	> .members {
 		> ._content {
diff --git a/packages/frontend/src/pages/note.vue b/packages/frontend/src/pages/note.vue
index 468a5c6d77..ba2bb91239 100644
--- a/packages/frontend/src/pages/note.vue
+++ b/packages/frontend/src/pages/note.vue
@@ -146,9 +146,7 @@ definePageMetadata(computed(() => note ? {
 .fade-leave-to {
 	opacity: 0;
 }
-</style>
 
-<style lang="scss">
 .fcuexfpr {
 	background: var(--bg);
 
diff --git a/packages/frontend/src/pages/page-editor/els/page-editor.el.image.vue b/packages/frontend/src/pages/page-editor/els/page-editor.el.image.vue
index 2fd0c7ccb8..a84cb1e80e 100644
--- a/packages/frontend/src/pages/page-editor/els/page-editor.el.image.vue
+++ b/packages/frontend/src/pages/page-editor/els/page-editor.el.image.vue
@@ -54,7 +54,7 @@ onMounted(async () => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .oyyftmcf {
 	> .preview {
 		height: 150px;
diff --git a/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue b/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue
index 14e369ba62..27324bdaef 100644
--- a/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue
+++ b/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue
@@ -80,7 +80,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ilrvjyvi {
 	> .children {
 		margin: 16px;
diff --git a/packages/frontend/src/pages/page-editor/els/page-editor.el.text.vue b/packages/frontend/src/pages/page-editor/els/page-editor.el.text.vue
index 97d037a9df..6f11e2a08b 100644
--- a/packages/frontend/src/pages/page-editor/els/page-editor.el.text.vue
+++ b/packages/frontend/src/pages/page-editor/els/page-editor.el.text.vue
@@ -32,7 +32,7 @@ watch($$(text), () => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .vckmsadr {
 	> textarea {
 		display: block;
diff --git a/packages/frontend/src/pages/page-editor/page-editor.container.vue b/packages/frontend/src/pages/page-editor/page-editor.container.vue
index abbbd503ff..15cdda5efb 100644
--- a/packages/frontend/src/pages/page-editor/page-editor.container.vue
+++ b/packages/frontend/src/pages/page-editor/page-editor.container.vue
@@ -68,7 +68,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .cpjygsrt {
 	position: relative;
 	overflow: hidden;
diff --git a/packages/frontend/src/pages/page-editor/page-editor.vue b/packages/frontend/src/pages/page-editor/page-editor.vue
index d1ce948822..968aa12de2 100644
--- a/packages/frontend/src/pages/page-editor/page-editor.vue
+++ b/packages/frontend/src/pages/page-editor/page-editor.vue
@@ -303,7 +303,7 @@ definePageMetadata(computed(() => {
 }
 </style>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .jqqmcavi {
 	margin-bottom: 16px;
 
diff --git a/packages/frontend/src/pages/page.vue b/packages/frontend/src/pages/page.vue
index c2717a52f4..a95bfe485c 100644
--- a/packages/frontend/src/pages/page.vue
+++ b/packages/frontend/src/pages/page.vue
@@ -172,9 +172,7 @@ definePageMetadata(computed(() => page ? {
 .fade-leave-to {
 	opacity: 0;
 }
-</style>
 
-<style lang="scss">
 .xcukqgmh {
 	> .main {
 		padding: 32px;
diff --git a/packages/frontend/src/pages/pages.vue b/packages/frontend/src/pages/pages.vue
index 99b084ff68..b077180df8 100644
--- a/packages/frontend/src/pages/pages.vue
+++ b/packages/frontend/src/pages/pages.vue
@@ -80,7 +80,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .rknalgpo {
 	&.my .ckltabjg:first-child {
 		margin-top: 16px;
diff --git a/packages/frontend/src/pages/preview.vue b/packages/frontend/src/pages/preview.vue
index 7d7e15c699..354f686e46 100644
--- a/packages/frontend/src/pages/preview.vue
+++ b/packages/frontend/src/pages/preview.vue
@@ -20,7 +20,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .graojtoi {
 	padding: var(--margin);
 }
diff --git a/packages/frontend/src/pages/registry.keys.vue b/packages/frontend/src/pages/registry.keys.vue
index 1dff2c9eb8..f179fbe957 100644
--- a/packages/frontend/src/pages/registry.keys.vue
+++ b/packages/frontend/src/pages/registry.keys.vue
@@ -92,5 +92,5 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 </style>
diff --git a/packages/frontend/src/pages/registry.value.vue b/packages/frontend/src/pages/registry.value.vue
index 2dfc0d1acd..378420b1ba 100644
--- a/packages/frontend/src/pages/registry.value.vue
+++ b/packages/frontend/src/pages/registry.value.vue
@@ -119,5 +119,5 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 </style>
diff --git a/packages/frontend/src/pages/registry.vue b/packages/frontend/src/pages/registry.vue
index 3a149a4f32..a2c65294fc 100644
--- a/packages/frontend/src/pages/registry.vue
+++ b/packages/frontend/src/pages/registry.vue
@@ -70,5 +70,5 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 </style>
diff --git a/packages/frontend/src/pages/reset-password.vue b/packages/frontend/src/pages/reset-password.vue
index 6fa0a84483..8ec15f6425 100644
--- a/packages/frontend/src/pages/reset-password.vue
+++ b/packages/frontend/src/pages/reset-password.vue
@@ -54,6 +54,6 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/pages/scratchpad.vue b/packages/frontend/src/pages/scratchpad.vue
index 80c40cec5d..edb2d8e18c 100644
--- a/packages/frontend/src/pages/scratchpad.vue
+++ b/packages/frontend/src/pages/scratchpad.vue
@@ -116,7 +116,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .iltifgqe {
 	padding: 16px;
 
diff --git a/packages/frontend/src/pages/settings/accounts.vue b/packages/frontend/src/pages/settings/accounts.vue
index d4ddf1936f..493d3b2618 100644
--- a/packages/frontend/src/pages/settings/accounts.vue
+++ b/packages/frontend/src/pages/settings/accounts.vue
@@ -112,7 +112,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .lcjjdxlm {
 	display: flex;
 	padding: 16px;
diff --git a/packages/frontend/src/pages/settings/apps.vue b/packages/frontend/src/pages/settings/apps.vue
index cd2ab6ce35..05abadff23 100644
--- a/packages/frontend/src/pages/settings/apps.vue
+++ b/packages/frontend/src/pages/settings/apps.vue
@@ -70,7 +70,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .bfomjevm {
 	display: flex;
 	padding: 16px;
diff --git a/packages/frontend/src/pages/settings/drive.vue b/packages/frontend/src/pages/settings/drive.vue
index 52ad79669b..2d45b1add8 100644
--- a/packages/frontend/src/pages/settings/drive.vue
+++ b/packages/frontend/src/pages/settings/drive.vue
@@ -124,7 +124,8 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
+
 @use "sass:math";
 
 .uawsfosz {
diff --git a/packages/frontend/src/pages/settings/index.vue b/packages/frontend/src/pages/settings/index.vue
index 2ba0ddb195..01436cd554 100644
--- a/packages/frontend/src/pages/settings/index.vue
+++ b/packages/frontend/src/pages/settings/index.vue
@@ -244,7 +244,7 @@ definePageMetadata(INFO);
 // h 700
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .vvcocwet {
 	> .body {
 		> .nav {
diff --git a/packages/frontend/src/pages/settings/plugin.vue b/packages/frontend/src/pages/settings/plugin.vue
index be7a5e20fa..905efd833d 100644
--- a/packages/frontend/src/pages/settings/plugin.vue
+++ b/packages/frontend/src/pages/settings/plugin.vue
@@ -93,6 +93,6 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/pages/settings/profile.vue b/packages/frontend/src/pages/settings/profile.vue
index 716b6ef297..14eeeaaa11 100644
--- a/packages/frontend/src/pages/settings/profile.vue
+++ b/packages/frontend/src/pages/settings/profile.vue
@@ -189,7 +189,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .llvierxe {
 	position: relative;
 	background-size: cover;
diff --git a/packages/frontend/src/pages/settings/reaction.vue b/packages/frontend/src/pages/settings/reaction.vue
index b0afd06f6c..2748cd7d4e 100644
--- a/packages/frontend/src/pages/settings/reaction.vue
+++ b/packages/frontend/src/pages/settings/reaction.vue
@@ -135,7 +135,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .zoaiodol {
 	padding: 12px;
 	font-size: 1.1em;
diff --git a/packages/frontend/src/pages/settings/security.vue b/packages/frontend/src/pages/settings/security.vue
index dbf83f9971..33f49eb3ef 100644
--- a/packages/frontend/src/pages/settings/security.vue
+++ b/packages/frontend/src/pages/settings/security.vue
@@ -107,7 +107,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .timnmucd {
 	padding: 16px;
 
diff --git a/packages/frontend/src/pages/settings/theme.vue b/packages/frontend/src/pages/settings/theme.vue
index 106e03e1ab..f37c213b06 100644
--- a/packages/frontend/src/pages/settings/theme.vue
+++ b/packages/frontend/src/pages/settings/theme.vue
@@ -164,7 +164,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .rfqxtzch {
 	border-radius: 6px;
 
diff --git a/packages/frontend/src/pages/share.vue b/packages/frontend/src/pages/share.vue
index 38ae6146af..a7e797eeab 100644
--- a/packages/frontend/src/pages/share.vue
+++ b/packages/frontend/src/pages/share.vue
@@ -16,7 +16,7 @@
 			class="_panel"
 			@posted="state = 'posted'"
 		/>
-		<MkButton v-else-if="state === 'posted'" primary :class="$style.close" @click="close()">{{ i18n.ts.close }}</MkButton>
+		<MkButton v-else-if="state === 'posted'" primary class="close" @click="close()">{{ i18n.ts.close }}</MkButton>
 	</MkSpacer>
 </MkStickyContainer>
 </template>
@@ -69,14 +69,14 @@ async function init() {
 				...(visibleAccts ? visibleAccts.split(',').map(Acct.parse) : []),
 			]
 			// TypeScriptの指示通りに変換する
-				.map(q => 'username' in q ? { username: q.username, host: q.host === null ? undefined : q.host } : q)
-				.map(q => os.api('users/show', q)
-					.then(user => {
-						visibleUsers.push(user);
-					}, () => {
-						console.error(`Invalid user query: ${JSON.stringify(q)}`);
-					}),
-				),
+			.map(q => 'username' in q ? { username: q.username, host: q.host === null ? undefined : q.host } : q)
+			.map(q => os.api('users/show', q)
+				.then(user => {
+					visibleUsers.push(user);
+				}, () => {
+					console.error(`Invalid user query: ${JSON.stringify(q)}`);
+				}),
+			),
 		);
 	}
 
@@ -120,13 +120,13 @@ async function init() {
 		if (fileIds) {
 			await Promise.all(
 				fileIds.split(',')
-					.map(fileId => os.api('drive/files/show', { fileId })
-						.then(file => {
-							files.push(file);
-						}, () => {
-							console.error(`Failed to fetch a file ${fileId}`);
-						}),
-					),
+				.map(fileId => os.api('drive/files/show', { fileId })
+					.then(file => {
+						files.push(file);
+					}, () => {
+						console.error(`Failed to fetch a file ${fileId}`);
+					}),
+				),
 			);
 		}
 		//#endregion
@@ -162,7 +162,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss" module>
+<style lang="scss" scoped>
 .close {
 	margin: 16px auto;
 }
diff --git a/packages/frontend/src/pages/signup-complete.vue b/packages/frontend/src/pages/signup-complete.vue
index 7ca842a668..5459532310 100644
--- a/packages/frontend/src/pages/signup-complete.vue
+++ b/packages/frontend/src/pages/signup-complete.vue
@@ -36,6 +36,6 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/pages/theme-editor.vue b/packages/frontend/src/pages/theme-editor.vue
index 09a59c7ffc..d8ff170ca2 100644
--- a/packages/frontend/src/pages/theme-editor.vue
+++ b/packages/frontend/src/pages/theme-editor.vue
@@ -228,7 +228,7 @@ definePageMetadata({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .cwepdizn {
 	::v-deep(.cwepdizn-colors) {
 		text-align: center;
diff --git a/packages/frontend/src/pages/timeline.vue b/packages/frontend/src/pages/timeline.vue
index eeccb7c1bc..1c9e389367 100644
--- a/packages/frontend/src/pages/timeline.vue
+++ b/packages/frontend/src/pages/timeline.vue
@@ -154,7 +154,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .cmuxhskf {
 	> .new {
 		position: sticky;
diff --git a/packages/frontend/src/pages/user-info.vue b/packages/frontend/src/pages/user-info.vue
index cf2de8eb53..addc8db9e6 100644
--- a/packages/frontend/src/pages/user-info.vue
+++ b/packages/frontend/src/pages/user-info.vue
@@ -385,7 +385,7 @@ definePageMetadata(computed(() => ({
 })));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .aeakzknw {
 	display: flex;
 	align-items: center;
diff --git a/packages/frontend/src/pages/user-list-timeline.vue b/packages/frontend/src/pages/user-list-timeline.vue
index f968d36d1d..fdb3167375 100644
--- a/packages/frontend/src/pages/user-list-timeline.vue
+++ b/packages/frontend/src/pages/user-list-timeline.vue
@@ -82,7 +82,7 @@ definePageMetadata(computed(() => list ? {
 } : null));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .eqqrhokj {
 	padding: var(--margin);
 
diff --git a/packages/frontend/src/pages/user/clips.vue b/packages/frontend/src/pages/user/clips.vue
index 4df48db023..8c71aacb0c 100644
--- a/packages/frontend/src/pages/user/clips.vue
+++ b/packages/frontend/src/pages/user/clips.vue
@@ -29,7 +29,7 @@ const pagination = {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .pages-user-clips {
 	> .list {
 		> .item {
diff --git a/packages/frontend/src/pages/user/follow-list.vue b/packages/frontend/src/pages/user/follow-list.vue
index c8ae1a2327..d42acd838f 100644
--- a/packages/frontend/src/pages/user/follow-list.vue
+++ b/packages/frontend/src/pages/user/follow-list.vue
@@ -36,7 +36,7 @@ const followersPagination = {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mk-following-or-followers {
 	> .users {
 		display: grid;
diff --git a/packages/frontend/src/pages/user/followers.vue b/packages/frontend/src/pages/user/followers.vue
index 3803f80c7a..17c2843381 100644
--- a/packages/frontend/src/pages/user/followers.vue
+++ b/packages/frontend/src/pages/user/followers.vue
@@ -57,5 +57,5 @@ definePageMetadata(computed(() => user ? {
 } : null));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 </style>
diff --git a/packages/frontend/src/pages/user/following.vue b/packages/frontend/src/pages/user/following.vue
index 31c3de9920..03892ec03d 100644
--- a/packages/frontend/src/pages/user/following.vue
+++ b/packages/frontend/src/pages/user/following.vue
@@ -57,5 +57,5 @@ definePageMetadata(computed(() => user ? {
 } : null));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 </style>
diff --git a/packages/frontend/src/pages/user/gallery.vue b/packages/frontend/src/pages/user/gallery.vue
index 7db7d14e3a..b80e83fb11 100644
--- a/packages/frontend/src/pages/user/gallery.vue
+++ b/packages/frontend/src/pages/user/gallery.vue
@@ -28,7 +28,7 @@ const pagination = {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .jrnovfpt {
 	display: grid;
 	grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue
index fa5167c149..43c1b37e1d 100644
--- a/packages/frontend/src/pages/user/home.vue
+++ b/packages/frontend/src/pages/user/home.vue
@@ -188,7 +188,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ftskorzw {
 
 	> .main {
diff --git a/packages/frontend/src/pages/user/index.photos.vue b/packages/frontend/src/pages/user/index.photos.vue
index 472e82735f..b33979a79d 100644
--- a/packages/frontend/src/pages/user/index.photos.vue
+++ b/packages/frontend/src/pages/user/index.photos.vue
@@ -73,7 +73,7 @@ onMounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ujigsodd {
 	padding: 8px;
 
diff --git a/packages/frontend/src/pages/user/pages.vue b/packages/frontend/src/pages/user/pages.vue
index 1a7cb0fcd8..7833d6c42c 100644
--- a/packages/frontend/src/pages/user/pages.vue
+++ b/packages/frontend/src/pages/user/pages.vue
@@ -25,6 +25,6 @@ const pagination = {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/pages/user/reactions.vue b/packages/frontend/src/pages/user/reactions.vue
index fc165f7113..ab3df34301 100644
--- a/packages/frontend/src/pages/user/reactions.vue
+++ b/packages/frontend/src/pages/user/reactions.vue
@@ -33,7 +33,7 @@ const pagination = {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .afdcfbfb {
 	> .header {
 		display: flex;
diff --git a/packages/frontend/src/pages/welcome.entrance.a.vue b/packages/frontend/src/pages/welcome.entrance.a.vue
index c4ab5174b6..bfa54d39f2 100644
--- a/packages/frontend/src/pages/welcome.entrance.a.vue
+++ b/packages/frontend/src/pages/welcome.entrance.a.vue
@@ -127,7 +127,7 @@ function showMenu(ev) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .rsqzvsbo {
 	> .top {
 		display: flex;
diff --git a/packages/frontend/src/pages/welcome.entrance.b.vue b/packages/frontend/src/pages/welcome.entrance.b.vue
index 8cdf3cfc6b..8230adaf1f 100644
--- a/packages/frontend/src/pages/welcome.entrance.b.vue
+++ b/packages/frontend/src/pages/welcome.entrance.b.vue
@@ -38,12 +38,12 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { toUnicode } from 'punycode/';
-import XTimeline from './welcome.timeline.vue';
 import XSigninDialog from '@/components/MkSigninDialog.vue';
 import XSignupDialog from '@/components/MkSignupDialog.vue';
 import MkButton from '@/components/MkButton.vue';
 import XNote from '@/components/MkNote.vue';
 import MkFeaturedPhotos from '@/components/MkFeaturedPhotos.vue';
+import XTimeline from './welcome.timeline.vue';
 import { host, instanceName } from '@/config';
 import * as os from '@/os';
 import number from '@/filters/number';
@@ -118,7 +118,7 @@ export default defineComponent({
 				text: this.$ts.help,
 				icon: 'ti ti-question-circle',
 				action: () => {
-					window.open('https://misskey-hub.net/help.md', '_blank');
+					window.open(`https://misskey-hub.net/help.md`, '_blank');
 				},
 			}], ev.currentTarget ?? ev.target);
 		},
@@ -128,7 +128,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .rsqzvsbo {
 	> .top {
 		min-height: 100vh;
diff --git a/packages/frontend/src/pages/welcome.entrance.c.vue b/packages/frontend/src/pages/welcome.entrance.c.vue
index c05ba908e0..d2d07bb1f0 100644
--- a/packages/frontend/src/pages/welcome.entrance.c.vue
+++ b/packages/frontend/src/pages/welcome.entrance.c.vue
@@ -58,12 +58,12 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { toUnicode } from 'punycode/';
-import XTimeline from './welcome.timeline.vue';
 import XSigninDialog from '@/components/MkSigninDialog.vue';
 import XSignupDialog from '@/components/MkSignupDialog.vue';
 import MkButton from '@/components/MkButton.vue';
 import XNote from '@/components/MkNote.vue';
 import MkFeaturedPhotos from '@/components/MkFeaturedPhotos.vue';
+import XTimeline from './welcome.timeline.vue';
 import { host, instanceName } from '@/config';
 import * as os from '@/os';
 import number from '@/filters/number';
@@ -138,7 +138,7 @@ export default defineComponent({
 				text: this.$ts.help,
 				icon: 'ti ti-question-circle',
 				action: () => {
-					window.open('https://misskey-hub.net/help.md', '_blank');
+					window.open(`https://misskey-hub.net/help.md`, '_blank');
 				},
 			}], ev.currentTarget ?? ev.target);
 		},
@@ -148,7 +148,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .rsqzvsbo {
 	> .top {
 		display: flex;
diff --git a/packages/frontend/src/pages/welcome.setup.vue b/packages/frontend/src/pages/welcome.setup.vue
index be91acb238..2729d30d4b 100644
--- a/packages/frontend/src/pages/welcome.setup.vue
+++ b/packages/frontend/src/pages/welcome.setup.vue
@@ -54,7 +54,7 @@ function submit() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mk-setup {
 	border-radius: var(--radius);
 	box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
diff --git a/packages/frontend/src/pages/welcome.timeline.vue b/packages/frontend/src/pages/welcome.timeline.vue
index d8c93053db..d6a88540d1 100644
--- a/packages/frontend/src/pages/welcome.timeline.vue
+++ b/packages/frontend/src/pages/welcome.timeline.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="civpbkhh">
-	<div ref="scroll" class="scrollbox" :class="{ scroll: isScrolling }">
+	<div ref="scroll" class="scrollbox" v-bind:class="{ scroll: isScrolling }">
 		<div v-for="note in notes" class="note">
 			<div class="content _panel">
 				<div class="body">
@@ -12,7 +12,7 @@
 					<XMediaList :media-list="note.files"/>
 				</div>
 				<div v-if="note.poll">
-					<XPoll :note="note" :read-only="true"/>
+					<XPoll :note="note" :readOnly="true"/>
 				</div>
 			</div>
 			<XReactionsViewer ref="reactionsViewer" :note="note"/>
@@ -71,9 +71,7 @@ export default defineComponent({
 		transform: translate3d(0, calc(-100% + 90vh), 0);
 	}
 }
-</style>
 
-<style lang="scss">
 .civpbkhh {
 	text-align: right;
 
diff --git a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
index b4831ece87..50b28de063 100644
--- a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
+++ b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
@@ -128,7 +128,7 @@ function more() {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .kmwsukvl {
 	> .body {
 		display: flex;
diff --git a/packages/frontend/src/ui/_common_/navbar.vue b/packages/frontend/src/ui/_common_/navbar.vue
index ae1f5896e8..b82da15f13 100644
--- a/packages/frontend/src/ui/_common_/navbar.vue
+++ b/packages/frontend/src/ui/_common_/navbar.vue
@@ -153,7 +153,7 @@ function more(ev: MouseEvent) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mvcprjjd {
 	$nav-width: 250px;
 	$nav-icon-only-width: 80px;
diff --git a/packages/frontend/src/ui/_common_/statusbar-federation.vue b/packages/frontend/src/ui/_common_/statusbar-federation.vue
index 84a2aa727e..24fc4f6f6d 100644
--- a/packages/frontend/src/ui/_common_/statusbar-federation.vue
+++ b/packages/frontend/src/ui/_common_/statusbar-federation.vue
@@ -77,9 +77,7 @@ function getInstanceIcon(instance): string {
   opacity: 0;
 	transform: translateY(100%);
 }
-</style>
 
-<style lang="scss">
 .nmidsaqw {
 	display: inline-block;
 	position: relative;
diff --git a/packages/frontend/src/ui/_common_/statusbar-rss.vue b/packages/frontend/src/ui/_common_/statusbar-rss.vue
index e6f383244d..e7f88e4984 100644
--- a/packages/frontend/src/ui/_common_/statusbar-rss.vue
+++ b/packages/frontend/src/ui/_common_/statusbar-rss.vue
@@ -69,9 +69,7 @@ useInterval(tick, Math.max(5000, props.refreshIntervalSec * 1000), {
   opacity: 0;
 	transform: translateY(100%);
 }
-</style>
 
-<style lang="scss">
 .xbhtxfms {
 	display: inline-block;
 	position: relative;
diff --git a/packages/frontend/src/ui/_common_/statusbar-user-list.vue b/packages/frontend/src/ui/_common_/statusbar-user-list.vue
index 28fe646fcb..f4d989c387 100644
--- a/packages/frontend/src/ui/_common_/statusbar-user-list.vue
+++ b/packages/frontend/src/ui/_common_/statusbar-user-list.vue
@@ -74,9 +74,7 @@ useInterval(tick, Math.max(5000, props.refreshIntervalSec * 1000), {
   opacity: 0;
 	transform: translateY(100%);
 }
-</style>
 
-<style lang="scss">
 .osdsvwzy {
 	display: inline-block;
 	position: relative;
diff --git a/packages/frontend/src/ui/_common_/statusbars.vue b/packages/frontend/src/ui/_common_/statusbars.vue
index c51bad0b4d..114ca5be8c 100644
--- a/packages/frontend/src/ui/_common_/statusbars.vue
+++ b/packages/frontend/src/ui/_common_/statusbars.vue
@@ -26,7 +26,7 @@ const XFederation = defineAsyncComponent(() => import('./statusbar-federation.vu
 const XUserList = defineAsyncComponent(() => import('./statusbar-user-list.vue'));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .dlrsnxqu {
 	font-size: 15px;
 	background: var(--panel);
diff --git a/packages/frontend/src/ui/_common_/stream-indicator.vue b/packages/frontend/src/ui/_common_/stream-indicator.vue
index 931ef122ad..a855de8ab9 100644
--- a/packages/frontend/src/ui/_common_/stream-indicator.vue
+++ b/packages/frontend/src/ui/_common_/stream-indicator.vue
@@ -34,7 +34,7 @@ onUnmounted(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .nsbbhtug {
 	position: fixed;
 	z-index: 16385;
diff --git a/packages/frontend/src/ui/_common_/upload.vue b/packages/frontend/src/ui/_common_/upload.vue
index d05a6c7a2f..70882bd251 100644
--- a/packages/frontend/src/ui/_common_/upload.vue
+++ b/packages/frontend/src/ui/_common_/upload.vue
@@ -26,7 +26,7 @@ import { i18n } from '@/i18n';
 const zIndex = os.claimZIndex('high');
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mk-uploader {
 	position: fixed;
 	right: 16px;
diff --git a/packages/frontend/src/ui/classic.header.vue b/packages/frontend/src/ui/classic.header.vue
index e32a95337b..46d79e6355 100644
--- a/packages/frontend/src/ui/classic.header.vue
+++ b/packages/frontend/src/ui/classic.header.vue
@@ -117,7 +117,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .azykntjl {
 	$height: 60px;
 	$avatar-size: 32px;
diff --git a/packages/frontend/src/ui/classic.sidebar.vue b/packages/frontend/src/ui/classic.sidebar.vue
index 3b02d51041..dac09ea703 100644
--- a/packages/frontend/src/ui/classic.sidebar.vue
+++ b/packages/frontend/src/ui/classic.sidebar.vue
@@ -135,7 +135,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .npcljfve {
 	$ui-font-size: 1em; // TODO: どこかに集約したい
 	$nav-icon-only-width: 78px; // TODO: どこかに集約したい
diff --git a/packages/frontend/src/ui/classic.vue b/packages/frontend/src/ui/classic.vue
index 85a35b9118..44b017ea96 100644
--- a/packages/frontend/src/ui/classic.vue
+++ b/packages/frontend/src/ui/classic.vue
@@ -193,9 +193,7 @@ onMounted(() => {
 .tray-back-leave-active {
 	opacity: 0;
 }
-</style>
 
-<style lang="scss">
 .gbhvwtnk {
 	$ui-font-size: 1em;
 	$widgets-hide-threshold: 1200px;
diff --git a/packages/frontend/src/ui/deck.vue b/packages/frontend/src/ui/deck.vue
index ddb2170e6d..f3415cfd09 100644
--- a/packages/frontend/src/ui/deck.vue
+++ b/packages/frontend/src/ui/deck.vue
@@ -245,9 +245,7 @@ async function deleteProfile() {
 .menu-back-leave-active {
 	opacity: 0;
 }
-</style>
 
-<style lang="scss">
 .mk-deck {
 	$nav-hide-threshold: 650px; // TODO: どこかに集約したい
 
diff --git a/packages/frontend/src/ui/deck/antenna-column.vue b/packages/frontend/src/ui/deck/antenna-column.vue
index 3dc6e33690..ba14530662 100644
--- a/packages/frontend/src/ui/deck/antenna-column.vue
+++ b/packages/frontend/src/ui/deck/antenna-column.vue
@@ -66,5 +66,5 @@ defineExpose({
 */
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 </style>
diff --git a/packages/frontend/src/ui/deck/column.vue b/packages/frontend/src/ui/deck/column.vue
index 40fae0831a..2a99b621e6 100644
--- a/packages/frontend/src/ui/deck/column.vue
+++ b/packages/frontend/src/ui/deck/column.vue
@@ -245,7 +245,7 @@ function onDrop(ev) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .dnpfarvg {
 	--root-margin: 10px;
 	--deckColumnHeaderHeight: 40px;
diff --git a/packages/frontend/src/ui/deck/list-column.vue b/packages/frontend/src/ui/deck/list-column.vue
index 571804b33c..d9f3f7b4e7 100644
--- a/packages/frontend/src/ui/deck/list-column.vue
+++ b/packages/frontend/src/ui/deck/list-column.vue
@@ -54,5 +54,5 @@ const menu = [{
 }];
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 </style>
diff --git a/packages/frontend/src/ui/deck/tl-column.vue b/packages/frontend/src/ui/deck/tl-column.vue
index 25cb4839fa..49b29145ff 100644
--- a/packages/frontend/src/ui/deck/tl-column.vue
+++ b/packages/frontend/src/ui/deck/tl-column.vue
@@ -104,7 +104,7 @@ const menu = [{
 }];
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .iwaalbte {
 	text-align: center;
 
diff --git a/packages/frontend/src/ui/deck/widgets-column.vue b/packages/frontend/src/ui/deck/widgets-column.vue
index ea2bb22a5f..edc54c1c2b 100644
--- a/packages/frontend/src/ui/deck/widgets-column.vue
+++ b/packages/frontend/src/ui/deck/widgets-column.vue
@@ -54,7 +54,7 @@ const menu = [{
 }];
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .wtdtxvec {
 	--margin: 8px;
 	--panelBorder: none;
diff --git a/packages/frontend/src/ui/universal.vue b/packages/frontend/src/ui/universal.vue
index 4340124a96..2cb8a9d6a6 100644
--- a/packages/frontend/src/ui/universal.vue
+++ b/packages/frontend/src/ui/universal.vue
@@ -215,9 +215,7 @@ const wallpaper = localStorage.getItem('wallpaper') != null;
 .menuDrawer-back-leave-active {
 	opacity: 0;
 }
-</style>
 
-<style lang="scss">
 .dkgtipfy {
 	$ui-font-size: 1em; // TODO: どこかに集約したい
 	$widgets-hide-threshold: 1090px;
diff --git a/packages/frontend/src/ui/universal.widgets.vue b/packages/frontend/src/ui/universal.widgets.vue
index 9a7b833fe0..002aab1090 100644
--- a/packages/frontend/src/ui/universal.widgets.vue
+++ b/packages/frontend/src/ui/universal.widgets.vue
@@ -81,7 +81,7 @@ function updateWidgets(thisWidgets) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .efzpzdvf {
 	position: sticky;
 	height: min-content;
diff --git a/packages/frontend/src/ui/visitor/kanban.vue b/packages/frontend/src/ui/visitor/kanban.vue
index efb929ad95..51e47f277d 100644
--- a/packages/frontend/src/ui/visitor/kanban.vue
+++ b/packages/frontend/src/ui/visitor/kanban.vue
@@ -106,7 +106,7 @@ export default defineComponent({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .rwqkcmrc {
 	position: relative;
 	text-align: center;
diff --git a/packages/frontend/src/ui/zen.vue b/packages/frontend/src/ui/zen.vue
index 9aa79e9453..84c96a1dae 100644
--- a/packages/frontend/src/ui/zen.vue
+++ b/packages/frontend/src/ui/zen.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="mk-zen">
+<div class="mk-app">
 	<RouterView/>
 
 	<XCommon/>
@@ -26,8 +26,8 @@ provideMetadataReceiver((info) => {
 document.documentElement.style.overflowY = 'scroll';
 </script>
 
-<style lang="scss">
-.mk-zen {
+<style lang="scss" scoped>
+.mk-app {
 	min-height: 100dvh;
 	box-sizing: border-box;
 }
diff --git a/packages/frontend/src/widgets/aichan.vue b/packages/frontend/src/widgets/aichan.vue
index ec3a52c814..828490fd9c 100644
--- a/packages/frontend/src/widgets/aichan.vue
+++ b/packages/frontend/src/widgets/aichan.vue
@@ -64,7 +64,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .dedjhjmo {
 	width: 100%;
 	height: 350px;
diff --git a/packages/frontend/src/widgets/aiscript.vue b/packages/frontend/src/widgets/aiscript.vue
index a0d1b755f6..4009edb8b8 100644
--- a/packages/frontend/src/widgets/aiscript.vue
+++ b/packages/frontend/src/widgets/aiscript.vue
@@ -119,7 +119,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .uylguesu {
 	text-align: right;
 
diff --git a/packages/frontend/src/widgets/button.vue b/packages/frontend/src/widgets/button.vue
index 48890a6225..f0148d7f4e 100644
--- a/packages/frontend/src/widgets/button.vue
+++ b/packages/frontend/src/widgets/button.vue
@@ -97,7 +97,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mkw-button {
 }
 </style>
diff --git a/packages/frontend/src/widgets/calendar.vue b/packages/frontend/src/widgets/calendar.vue
index 106cd5f24d..99bd36e2fc 100644
--- a/packages/frontend/src/widgets/calendar.vue
+++ b/packages/frontend/src/widgets/calendar.vue
@@ -115,7 +115,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mkw-calendar {
 	padding: 16px 0;
 
diff --git a/packages/frontend/src/widgets/clock.vue b/packages/frontend/src/widgets/clock.vue
index 63b58ab6ec..dc99b6631e 100644
--- a/packages/frontend/src/widgets/clock.vue
+++ b/packages/frontend/src/widgets/clock.vue
@@ -143,7 +143,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .vubelbmv {
 	position: relative;
 
diff --git a/packages/frontend/src/widgets/digital-clock.vue b/packages/frontend/src/widgets/digital-clock.vue
index 142c1950a8..d2bfd523f3 100644
--- a/packages/frontend/src/widgets/digital-clock.vue
+++ b/packages/frontend/src/widgets/digital-clock.vue
@@ -79,7 +79,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mkw-digitalClock {
 	padding: 16px 0;
 	text-align: center;
diff --git a/packages/frontend/src/widgets/federation.vue b/packages/frontend/src/widgets/federation.vue
index 7bb61f5997..3374783b0c 100644
--- a/packages/frontend/src/widgets/federation.vue
+++ b/packages/frontend/src/widgets/federation.vue
@@ -83,7 +83,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .wbrkwalb {
 	$bodyTitleHieght: 18px;
 	$bodyInfoHieght: 16px;
diff --git a/packages/frontend/src/widgets/instance-cloud.vue b/packages/frontend/src/widgets/instance-cloud.vue
index 26bc3ec638..4965616995 100644
--- a/packages/frontend/src/widgets/instance-cloud.vue
+++ b/packages/frontend/src/widgets/instance-cloud.vue
@@ -76,6 +76,6 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 
 </style>
diff --git a/packages/frontend/src/widgets/memo.vue b/packages/frontend/src/widgets/memo.vue
index e28d8a6c3d..1cc0e10bba 100644
--- a/packages/frontend/src/widgets/memo.vue
+++ b/packages/frontend/src/widgets/memo.vue
@@ -67,7 +67,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .otgbylcu {
 	padding-bottom: 28px + 16px;
 
diff --git a/packages/frontend/src/widgets/online-users.vue b/packages/frontend/src/widgets/online-users.vue
index f2a9f93b0d..e9ab79b111 100644
--- a/packages/frontend/src/widgets/online-users.vue
+++ b/packages/frontend/src/widgets/online-users.vue
@@ -57,7 +57,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mkw-onlineUsers {
 	text-align: center;
 
diff --git a/packages/frontend/src/widgets/rss.vue b/packages/frontend/src/widgets/rss.vue
index 6080680ad1..c0338c8e47 100644
--- a/packages/frontend/src/widgets/rss.vue
+++ b/packages/frontend/src/widgets/rss.vue
@@ -73,7 +73,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .ekmkgxbj {
 	> .feed {
 		padding: 0;
diff --git a/packages/frontend/src/widgets/server-metric/cpu-mem.vue b/packages/frontend/src/widgets/server-metric/cpu-mem.vue
index 59ecfc7e6a..80a8e427e1 100644
--- a/packages/frontend/src/widgets/server-metric/cpu-mem.vue
+++ b/packages/frontend/src/widgets/server-metric/cpu-mem.vue
@@ -137,7 +137,7 @@ function onStatsLog(statsLog) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .lcfyofjk {
 	display: flex;
 
diff --git a/packages/frontend/src/widgets/server-metric/cpu.vue b/packages/frontend/src/widgets/server-metric/cpu.vue
index 91c4e00fb3..e7b2226d1f 100644
--- a/packages/frontend/src/widgets/server-metric/cpu.vue
+++ b/packages/frontend/src/widgets/server-metric/cpu.vue
@@ -33,7 +33,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .vrvdvrys {
 	display: flex;
 	padding: 16px;
diff --git a/packages/frontend/src/widgets/server-metric/disk.vue b/packages/frontend/src/widgets/server-metric/disk.vue
index d2cabd0442..3d22d05383 100644
--- a/packages/frontend/src/widgets/server-metric/disk.vue
+++ b/packages/frontend/src/widgets/server-metric/disk.vue
@@ -25,7 +25,7 @@ const used = $computed(() => props.meta.fs.used);
 const available = $computed(() => props.meta.fs.total - props.meta.fs.used);
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .zbwaqsat {
 	display: flex;
 	padding: 16px;
diff --git a/packages/frontend/src/widgets/server-metric/mem.vue b/packages/frontend/src/widgets/server-metric/mem.vue
index 96bc5f49d5..6018eb4265 100644
--- a/packages/frontend/src/widgets/server-metric/mem.vue
+++ b/packages/frontend/src/widgets/server-metric/mem.vue
@@ -41,7 +41,7 @@ onBeforeUnmount(() => {
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .zlxnikvl {
 	display: flex;
 	padding: 16px;
diff --git a/packages/frontend/src/widgets/server-metric/net.vue b/packages/frontend/src/widgets/server-metric/net.vue
index dd2a990e02..ab8b0fe471 100644
--- a/packages/frontend/src/widgets/server-metric/net.vue
+++ b/packages/frontend/src/widgets/server-metric/net.vue
@@ -110,7 +110,7 @@ function onStatsLog(statsLog) {
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .oxxrhrto {
 	display: flex;
 
diff --git a/packages/frontend/src/widgets/server-metric/pie.vue b/packages/frontend/src/widgets/server-metric/pie.vue
index 14b34d266f..868dbc0484 100644
--- a/packages/frontend/src/widgets/server-metric/pie.vue
+++ b/packages/frontend/src/widgets/server-metric/pie.vue
@@ -33,7 +33,7 @@ const color = $computed(() => `hsl(${180 - (props.value * 180)}, 80%, 70%)`);
 const strokeDashoffset = $computed(() => (1 - props.value) * (Math.PI * (r * 2)));
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .hsalcinq {
 	display: block;
 	height: 100%;
diff --git a/packages/frontend/src/widgets/slideshow.vue b/packages/frontend/src/widgets/slideshow.vue
index 2a8d049b4a..e317b8ab94 100644
--- a/packages/frontend/src/widgets/slideshow.vue
+++ b/packages/frontend/src/widgets/slideshow.vue
@@ -116,7 +116,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .kvausudm {
 	position: relative;
 
diff --git a/packages/frontend/src/widgets/trends.vue b/packages/frontend/src/widgets/trends.vue
index f4be22f6d2..02eec0431e 100644
--- a/packages/frontend/src/widgets/trends.vue
+++ b/packages/frontend/src/widgets/trends.vue
@@ -72,7 +72,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .wbrkwala {
 	height: (62px + 1px) + (62px + 1px) + (62px + 1px) + (62px + 1px) + 62px;
 	overflow: hidden;
diff --git a/packages/frontend/src/widgets/unix-clock.vue b/packages/frontend/src/widgets/unix-clock.vue
index d97de34ad2..cf85ac782c 100644
--- a/packages/frontend/src/widgets/unix-clock.vue
+++ b/packages/frontend/src/widgets/unix-clock.vue
@@ -91,7 +91,7 @@ defineExpose<WidgetComponentExpose>({
 });
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mkw-unixClock {
 	padding: 16px 0;
 	text-align: center;
-- 
cgit v1.2.3-freya


From c3a36698e5e57418d791c2a77f7fdda284b76e5d Mon Sep 17 00:00:00 2001
From: tamaina <tamaina@hotmail.co.jp>
Date: Sun, 1 Jan 2023 17:11:33 +0900
Subject: use Intl.DateTimeFormat and Intl.NumberFormat instead of
 toLocaleString (#9444)

---
 packages/frontend/src/components/MkAbuseReport.vue      |  3 ++-
 packages/frontend/src/components/MkChart.vue            |  3 ++-
 packages/frontend/src/components/MkFileListForAdmin.vue |  3 ++-
 packages/frontend/src/components/MkUrlPreview.vue       |  7 +++----
 packages/frontend/src/components/MkYoutubePlayer.vue    |  6 ++----
 packages/frontend/src/components/global/MkTime.vue      |  3 ++-
 packages/frontend/src/filters/date.ts                   |  4 ++++
 packages/frontend/src/filters/number.ts                 |  4 +++-
 packages/frontend/src/pages/about.federation.vue        |  3 ++-
 packages/frontend/src/pages/admin/users.vue             |  3 ++-
 packages/frontend/src/pages/instance-info.vue           |  3 ++-
 packages/frontend/src/pages/note.vue                    |  3 ++-
 packages/frontend/src/pages/user/home.vue               |  3 ++-
 packages/frontend/src/scripts/intl-const.ts             | 12 ++++++++++++
 14 files changed, 42 insertions(+), 18 deletions(-)
 create mode 100644 packages/frontend/src/filters/date.ts
 create mode 100644 packages/frontend/src/scripts/intl-const.ts

(limited to 'packages/frontend/src/components/MkFileListForAdmin.vue')

diff --git a/packages/frontend/src/components/MkAbuseReport.vue b/packages/frontend/src/components/MkAbuseReport.vue
index 9a3464b640..c065792882 100644
--- a/packages/frontend/src/components/MkAbuseReport.vue
+++ b/packages/frontend/src/components/MkAbuseReport.vue
@@ -10,7 +10,7 @@
 		</MkA>
 		<MkKeyValue class="_formBlock">
 			<template #key>{{ i18n.ts.registeredDate }}</template>
-			<template #value>{{ new Date(report.targetUser.createdAt).toLocaleString() }} (<MkTime :time="report.targetUser.createdAt"/>)</template>
+			<template #value>{{ dateString(report.targetUser.createdAt) }} (<MkTime :time="report.targetUser.createdAt"/>)</template>
 		</MkKeyValue>
 	</div>
 	<div class="detail">
@@ -42,6 +42,7 @@ import MkKeyValue from '@/components/MkKeyValue.vue';
 import { acct, userPage } from '@/filters/user';
 import * as os from '@/os';
 import { i18n } from '@/i18n';
+import { dateString } from '@/filters/date';
 
 const props = defineProps<{
 	report: any;
diff --git a/packages/frontend/src/components/MkChart.vue b/packages/frontend/src/components/MkChart.vue
index 94cffa12cd..d99a5478e9 100644
--- a/packages/frontend/src/components/MkChart.vue
+++ b/packages/frontend/src/components/MkChart.vue
@@ -40,6 +40,7 @@ import { defaultStore } from '@/store';
 import { useChartTooltip } from '@/scripts/use-chart-tooltip';
 import { chartVLine } from '@/scripts/chart-vline';
 import { alpha } from '@/scripts/color';
+import date from '@/filters/date';
 
 const props = defineProps({
 	src: {
@@ -171,7 +172,7 @@ const render = () => {
 	chartInstance = new Chart(chartEl.value, {
 		type: props.bar ? 'bar' : 'line',
 		data: {
-			labels: new Array(props.limit).fill(0).map((_, i) => getDate(i).toLocaleString()).slice().reverse(),
+			labels: new Array(props.limit).fill(0).map((_, i) => date(getDate(i))).slice().reverse(),
 			datasets: chartData.series.map((x, i) => ({
 				parsing: false,
 				label: x.name,
diff --git a/packages/frontend/src/components/MkFileListForAdmin.vue b/packages/frontend/src/components/MkFileListForAdmin.vue
index 4910506a95..1335f88a7c 100644
--- a/packages/frontend/src/components/MkFileListForAdmin.vue
+++ b/packages/frontend/src/components/MkFileListForAdmin.vue
@@ -4,7 +4,7 @@
 		<MkA
 			v-for="file in items"
 			:key="file.id"
-			v-tooltip.mfm="`${file.type}\n${bytes(file.size)}\n${new Date(file.createdAt).toLocaleString()}\nby ${file.user ? '@' + Acct.toString(file.user) : 'system'}`"
+			v-tooltip.mfm="`${file.type}\n${bytes(file.size)}\n${dateString(file.createdAt)}\nby ${file.user ? '@' + Acct.toString(file.user) : 'system'}`"
 			:to="`/admin/file/${file.id}`"
 			class="file _button"
 		>
@@ -39,6 +39,7 @@ import MkDriveFileThumbnail from '@/components/MkDriveFileThumbnail.vue';
 import bytes from '@/filters/bytes';
 import * as os from '@/os';
 import { i18n } from '@/i18n';
+import { dateString } from '@/filters/date';
 
 const props = defineProps<{
 	pagination: any;
diff --git a/packages/frontend/src/components/MkUrlPreview.vue b/packages/frontend/src/components/MkUrlPreview.vue
index f8484e38a5..6b38080f92 100644
--- a/packages/frontend/src/components/MkUrlPreview.vue
+++ b/packages/frontend/src/components/MkUrlPreview.vue
@@ -45,11 +45,12 @@
 
 <script lang="ts" setup>
 import { defineAsyncComponent, onMounted, onUnmounted } from 'vue';
-import { url as local, lang } from '@/config';
+import { url as local } from '@/config';
 import { i18n } from '@/i18n';
 import * as os from '@/os';
 import { deviceKind } from '@/scripts/device-kind';
 import MkButton from '@/components/MkButton.vue';
+import { versatileLang } from '@/scripts/intl-const';
 
 const props = withDefaults(defineProps<{
 	url: string;
@@ -95,11 +96,9 @@ if (requestUrl.hostname === 'music.youtube.com' && requestUrl.pathname.match('^/
 	requestUrl.hostname = 'www.youtube.com';
 }
 
-const requestLang = (lang ?? 'ja-JP').replace('ja-KS', 'ja-JP');
-
 requestUrl.hash = '';
 
-window.fetch(`/url?url=${encodeURIComponent(requestUrl.href)}&lang=${requestLang}`).then(res => {
+window.fetch(`/url?url=${encodeURIComponent(requestUrl.href)}&lang=${versatileLang}`).then(res => {
 	res.json().then(info => {
 		if (info.url == null) {
 			unknownUrl = true;
diff --git a/packages/frontend/src/components/MkYoutubePlayer.vue b/packages/frontend/src/components/MkYoutubePlayer.vue
index 5c675fe987..c12b03572d 100644
--- a/packages/frontend/src/components/MkYoutubePlayer.vue
+++ b/packages/frontend/src/components/MkYoutubePlayer.vue
@@ -19,7 +19,7 @@
 
 <script lang="ts" setup>
 import XWindow from '@/components/MkWindow.vue';
-import { lang } from '@/config';
+import { versatileLang } from '@/scripts/intl-const';
 
 const props = defineProps<{
 	url: string;
@@ -35,11 +35,9 @@ let player = $ref({
 	height: null,
 });
 
-const requestLang = (lang ?? 'ja-JP').replace('ja-KS', 'ja-JP');
-
 const ytFetch = (): void => {
 	fetching = true;
-	window.fetch(`/url?url=${encodeURIComponent(requestUrl.href)}&lang=${requestLang}`).then(res => {
+	window.fetch(`/url?url=${encodeURIComponent(requestUrl.href)}&lang=${versatileLang}`).then(res => {
 		res.json().then(info => {
 			if (info.url == null) return;
 			title = info.title;
diff --git a/packages/frontend/src/components/global/MkTime.vue b/packages/frontend/src/components/global/MkTime.vue
index f72b153f56..0bbb0f5399 100644
--- a/packages/frontend/src/components/global/MkTime.vue
+++ b/packages/frontend/src/components/global/MkTime.vue
@@ -9,6 +9,7 @@
 <script lang="ts" setup>
 import { onUnmounted } from 'vue';
 import { i18n } from '@/i18n';
+import { dateTimeFormat } from '@/scripts/intl-const';
 
 const props = withDefaults(defineProps<{
 	time: Date | string;
@@ -18,7 +19,7 @@ const props = withDefaults(defineProps<{
 });
 
 const _time = typeof props.time === 'string' ? new Date(props.time) : props.time;
-const absolute = _time.toLocaleString();
+const absolute = dateTimeFormat.format(_time);
 
 let now = $shallowRef(new Date());
 const relative = $computed(() => {
diff --git a/packages/frontend/src/filters/date.ts b/packages/frontend/src/filters/date.ts
new file mode 100644
index 0000000000..706b7d60cc
--- /dev/null
+++ b/packages/frontend/src/filters/date.ts
@@ -0,0 +1,4 @@
+import { dateTimeFormat } from '@/scripts/intl-const';
+
+export default (d: Date | number | undefined) => dateTimeFormat.format(d); 
+export const dateString = (d: string) => dateTimeFormat.format(new Date(d));
diff --git a/packages/frontend/src/filters/number.ts b/packages/frontend/src/filters/number.ts
index 880a848ca4..6361ba5314 100644
--- a/packages/frontend/src/filters/number.ts
+++ b/packages/frontend/src/filters/number.ts
@@ -1 +1,3 @@
-export default n => n == null ? 'N/A' : n.toLocaleString();
+import { numberFormat } from '@/scripts/intl-const';
+
+export default n => n == null ? 'N/A' : numberFormat.format(n);
diff --git a/packages/frontend/src/pages/about.federation.vue b/packages/frontend/src/pages/about.federation.vue
index 6c92ab1264..2b20f383d1 100644
--- a/packages/frontend/src/pages/about.federation.vue
+++ b/packages/frontend/src/pages/about.federation.vue
@@ -38,7 +38,7 @@
 
 	<MkPagination v-slot="{items}" ref="instances" :key="host + state" :pagination="pagination">
 		<div class="dqokceoi">
-			<MkA v-for="instance in items" :key="instance.id" v-tooltip.mfm="`Last communicated: ${new Date(instance.lastCommunicatedAt).toLocaleString()}\nStatus: ${getStatus(instance)}`" class="instance" :to="`/instance-info/${instance.host}`">
+			<MkA v-for="instance in items" :key="instance.id" v-tooltip.mfm="`Last communicated: ${dateString(instance.lastCommunicatedAt)}\nStatus: ${getStatus(instance)}`" class="instance" :to="`/instance-info/${instance.host}`">
 				<MkInstanceCardMini :instance="instance"/>
 			</MkA>
 		</div>
@@ -56,6 +56,7 @@ import MkInstanceCardMini from '@/components/MkInstanceCardMini.vue';
 import FormSplit from '@/components/form/split.vue';
 import * as os from '@/os';
 import { i18n } from '@/i18n';
+import { dateString } from '@/filters/date';
 
 let host = $ref('');
 let state = $ref('federating');
diff --git a/packages/frontend/src/pages/admin/users.vue b/packages/frontend/src/pages/admin/users.vue
index d466e21907..24ce98a02f 100644
--- a/packages/frontend/src/pages/admin/users.vue
+++ b/packages/frontend/src/pages/admin/users.vue
@@ -41,7 +41,7 @@
 					</div>
 
 					<MkPagination v-slot="{items}" ref="paginationComponent" :pagination="pagination" class="users">
-						<MkA v-for="user in items" :key="user.id" v-tooltip.mfm="`Last posted: ${new Date(user.updatedAt).toLocaleString()}`" class="user" :to="`/user-info/${user.id}`">
+						<MkA v-for="user in items" :key="user.id" v-tooltip.mfm="`Last posted: ${dateString(user.updatedAt)}`" class="user" :to="`/user-info/${user.id}`">
 							<MkUserCardMini :user="user"/>
 						</MkA>
 					</MkPagination>
@@ -63,6 +63,7 @@ import { lookupUser } from '@/scripts/lookup-user';
 import { i18n } from '@/i18n';
 import { definePageMetadata } from '@/scripts/page-metadata';
 import MkUserCardMini from '@/components/MkUserCardMini.vue';
+import { dateString } from '@/filters/date';
 
 let paginationComponent = $ref<InstanceType<typeof MkPagination>>();
 
diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue
index a2a1254360..f750fdcee2 100644
--- a/packages/frontend/src/pages/instance-info.vue
+++ b/packages/frontend/src/pages/instance-info.vue
@@ -101,7 +101,7 @@
 		</div>
 		<div v-else-if="tab === 'users'" class="_formRoot">
 			<MkPagination v-slot="{items}" :pagination="usersPagination" style="display: grid; grid-template-columns: repeat(auto-fill,minmax(270px,1fr)); grid-gap: 12px;">
-				<MkA v-for="user in items" :key="user.id" v-tooltip.mfm="`Last posted: ${new Date(user.updatedAt).toLocaleString()}`" class="user" :to="`/user-info/${user.id}`">
+				<MkA v-for="user in items" :key="user.id" v-tooltip.mfm="`Last posted: ${dateString(user.updatedAt)}`" class="user" :to="`/user-info/${user.id}`">
 					<MkUserCardMini :user="user"/>
 				</MkA>
 			</MkPagination>
@@ -135,6 +135,7 @@ import { i18n } from '@/i18n';
 import MkUserCardMini from '@/components/MkUserCardMini.vue';
 import MkPagination from '@/components/MkPagination.vue';
 import { getProxiedImageUrlNullable } from '@/scripts/media-proxy';
+import { dateString } from '@/filters/date';
 
 const props = defineProps<{
 	host: string;
diff --git a/packages/frontend/src/pages/note.vue b/packages/frontend/src/pages/note.vue
index 90fe417a78..3019b6eb4f 100644
--- a/packages/frontend/src/pages/note.vue
+++ b/packages/frontend/src/pages/note.vue
@@ -51,6 +51,7 @@ import MkButton from '@/components/MkButton.vue';
 import * as os from '@/os';
 import { definePageMetadata } from '@/scripts/page-metadata';
 import { i18n } from '@/i18n';
+import { dateString } from '@/filters/date';
 
 const props = defineProps<{
 	noteId: string;
@@ -127,7 +128,7 @@ const headerTabs = $computed(() => []);
 
 definePageMetadata(computed(() => note ? {
 	title: i18n.ts.note,
-	subtitle: new Date(note.createdAt).toLocaleString(),
+	subtitle: dateString(note.createdAt),
 	avatar: note.user,
 	path: `/notes/${note.id}`,
 	share: {
diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue
index 55420ebb24..45334a998b 100644
--- a/packages/frontend/src/pages/user/home.vue
+++ b/packages/frontend/src/pages/user/home.vue
@@ -55,7 +55,7 @@
 						</dl>
 						<dl class="field">
 							<dt class="name"><i class="ti ti-calendar ti-fw"></i> {{ i18n.ts.registeredDate }}</dt>
-							<dd class="value">{{ new Date(user.createdAt).toLocaleString() }} (<MkTime :time="user.createdAt"/>)</dd>
+							<dd class="value">{{ dateString(user.createdAt) }} (<MkTime :time="user.createdAt"/>)</dd>
 						</dl>
 					</div>
 					<div v-if="user.fields.length > 0" class="fields">
@@ -127,6 +127,7 @@ import * as os from '@/os';
 import { useRouter } from '@/router';
 import { i18n } from '@/i18n';
 import { $i } from '@/account';
+import { dateString } from '@/filters/date';
 
 const XPhotos = defineAsyncComponent(() => import('./index.photos.vue'));
 const XActivity = defineAsyncComponent(() => import('./index.activity.vue'));
diff --git a/packages/frontend/src/scripts/intl-const.ts b/packages/frontend/src/scripts/intl-const.ts
new file mode 100644
index 0000000000..081ff6248c
--- /dev/null
+++ b/packages/frontend/src/scripts/intl-const.ts
@@ -0,0 +1,12 @@
+import { lang } from '@/config';
+
+export const versatileLang = (lang ?? 'ja-JP').replace('ja-KS', 'ja-JP');
+export const dateTimeFormat = new Intl.DateTimeFormat(versatileLang, {
+    year: 'numeric',
+    month: 'numeric',
+    day: 'numeric',
+    hour: 'numeric',
+    minute: 'numeric',
+    second: 'numeric',
+});
+export const numberFormat = new Intl.NumberFormat(versatileLang);
-- 
cgit v1.2.3-freya


From 047262ab20c83232c01b102961dfdc299073ea1a Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Thu, 5 Jan 2023 21:04:56 +0900
Subject: refactor

---
 packages/frontend/src/components/MkAbuseReport.vue |   4 +-
 .../frontend/src/components/MkFileListForAdmin.vue |   3 -
 .../frontend/src/components/MkForgotPassword.vue   |  11 +-
 packages/frontend/src/components/MkFormDialog.vue  |  18 +--
 .../src/components/MkNotificationSettingWindow.vue |   8 +-
 packages/frontend/src/components/MkPagination.vue  |   4 +-
 packages/frontend/src/components/MkSignin.vue      |  16 +-
 packages/frontend/src/components/MkSignup.vue      |  22 +--
 .../src/components/MkTokenGenerateWindow.vue       |  10 +-
 packages/frontend/src/components/form/section.vue  |  34 ++--
 packages/frontend/src/components/form/split.vue    |   2 +-
 packages/frontend/src/pages/about-misskey.vue      |   9 +-
 packages/frontend/src/pages/about.vue              |  48 +++---
 packages/frontend/src/pages/admin-file.vue         |  18 +--
 packages/frontend/src/pages/admin/ads.vue          |  12 +-
 .../frontend/src/pages/admin/announcements.vue     |   2 +-
 .../frontend/src/pages/admin/bot-protection.vue    |  22 +--
 .../frontend/src/pages/admin/email-settings.vue    |  51 +++---
 .../frontend/src/pages/admin/emoji-edit-dialog.vue |  12 +-
 .../frontend/src/pages/admin/instance-block.vue    |   4 +-
 .../src/pages/admin/integrations.discord.vue       |  12 +-
 .../src/pages/admin/integrations.github.vue        |  12 +-
 .../src/pages/admin/integrations.twitter.vue       |  12 +-
 packages/frontend/src/pages/admin/integrations.vue |  50 +++---
 .../frontend/src/pages/admin/object-storage.vue    |  26 +--
 .../frontend/src/pages/admin/proxy-account.vue     |  26 +--
 packages/frontend/src/pages/admin/security.vue     |  44 ++---
 packages/frontend/src/pages/admin/settings.vue     | 178 +++++++++++----------
 packages/frontend/src/pages/api-console.vue        |  14 +-
 packages/frontend/src/pages/channel-editor.vue     |   8 +-
 packages/frontend/src/pages/channel.vue            |   6 +-
 packages/frontend/src/pages/channels.vue           |   6 +-
 packages/frontend/src/pages/explore.users.vue      |  18 +--
 packages/frontend/src/pages/explore.vue            |   6 +-
 packages/frontend/src/pages/flash/flash-edit.vue   |  26 +--
 packages/frontend/src/pages/flash/flash.vue        |   2 +-
 packages/frontend/src/pages/gallery/index.vue      |   4 +-
 packages/frontend/src/pages/instance-info.vue      |  42 ++---
 packages/frontend/src/pages/my-antennas/editor.vue |  93 ++++++-----
 packages/frontend/src/pages/my-clips/index.vue     |   2 +-
 packages/frontend/src/pages/my-lists/list.vue      |   2 +-
 packages/frontend/src/pages/note.vue               |  12 +-
 .../frontend/src/pages/page-editor/page-editor.vue |  14 +-
 packages/frontend/src/pages/page.vue               |   2 +-
 packages/frontend/src/pages/registry.keys.vue      |  38 ++---
 packages/frontend/src/pages/registry.value.vue     |  60 +++----
 packages/frontend/src/pages/reset-password.vue     |   6 +-
 .../frontend/src/pages/settings/account-info.vue   |   2 +-
 packages/frontend/src/pages/settings/accounts.vue  |   2 +-
 packages/frontend/src/pages/settings/api.vue       |   8 +-
 packages/frontend/src/pages/settings/apps.vue      |  10 +-
 .../frontend/src/pages/settings/custom-css.vue     |   6 +-
 packages/frontend/src/pages/settings/deck.vue      |   6 +-
 .../frontend/src/pages/settings/delete-account.vue |   8 +-
 packages/frontend/src/pages/settings/drive.vue     |  65 ++++----
 packages/frontend/src/pages/settings/email.vue     |  41 ++---
 packages/frontend/src/pages/settings/general.vue   |  98 ++++++------
 .../frontend/src/pages/settings/import-export.vue  |  22 +--
 .../frontend/src/pages/settings/instance-mute.vue  |   6 +-
 .../frontend/src/pages/settings/integration.vue    |   2 +-
 .../frontend/src/pages/settings/mute-block.vue     |   2 +-
 packages/frontend/src/pages/settings/navbar.vue    |   8 +-
 .../frontend/src/pages/settings/notifications.vue  |  33 ++--
 packages/frontend/src/pages/settings/other.vue     |  12 +-
 .../frontend/src/pages/settings/plugin.install.vue |   8 +-
 packages/frontend/src/pages/settings/plugin.vue    |  12 +-
 .../src/pages/settings/preferences-backups.vue     |  26 +--
 packages/frontend/src/pages/settings/privacy.vue   |  52 +++---
 packages/frontend/src/pages/settings/profile.vue   |  32 ++--
 packages/frontend/src/pages/settings/reaction.vue  |  12 +-
 packages/frontend/src/pages/settings/security.vue  |   2 +-
 .../frontend/src/pages/settings/sounds.sound.vue   |   4 +-
 packages/frontend/src/pages/settings/sounds.vue    |  18 ++-
 .../src/pages/settings/statusbar.statusbar.vue     |  36 ++---
 packages/frontend/src/pages/settings/statusbar.vue |   4 +-
 .../frontend/src/pages/settings/theme.install.vue  |   6 +-
 .../frontend/src/pages/settings/theme.manage.vue   |  12 +-
 packages/frontend/src/pages/settings/theme.vue     |  10 +-
 .../frontend/src/pages/settings/webhook.edit.vue   |  28 ++--
 .../frontend/src/pages/settings/webhook.new.vue    |  26 +--
 packages/frontend/src/pages/settings/webhook.vue   |  14 +-
 packages/frontend/src/pages/settings/word-mute.vue |  20 +--
 packages/frontend/src/pages/theme-editor.vue       |  20 +--
 packages/frontend/src/pages/user-info.vue          |  94 +++++------
 packages/frontend/src/pages/user/clips.vue         |   2 +-
 packages/frontend/src/pages/user/home.vue          |   2 +-
 packages/frontend/src/pages/user/pages.vue         |   2 +-
 packages/frontend/src/pages/user/reactions.vue     |   2 +-
 packages/frontend/src/pages/welcome.setup.vue      |   8 +-
 packages/frontend/src/style.scss                   |  31 ++--
 90 files changed, 955 insertions(+), 890 deletions(-)

(limited to 'packages/frontend/src/components/MkFileListForAdmin.vue')

diff --git a/packages/frontend/src/components/MkAbuseReport.vue b/packages/frontend/src/components/MkAbuseReport.vue
index c065792882..cdfe323d50 100644
--- a/packages/frontend/src/components/MkAbuseReport.vue
+++ b/packages/frontend/src/components/MkAbuseReport.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="bcekxzvu _gap _panel">
+<div class="bcekxzvu _margin _panel">
 	<div class="target">
 		<MkA v-user-preview="report.targetUserId" class="info" :to="`/user-info/${report.targetUserId}`">
 			<MkAvatar class="avatar" :user="report.targetUser" :show-indicator="true" :disable-link="true"/>
@@ -8,7 +8,7 @@
 				<MkAcct class="acct" :user="report.targetUser" style="display: block;"/>
 			</div>
 		</MkA>
-		<MkKeyValue class="_formBlock">
+		<MkKeyValue>
 			<template #key>{{ i18n.ts.registeredDate }}</template>
 			<template #value>{{ dateString(report.targetUser.createdAt) }} (<MkTime :time="report.targetUser.createdAt"/>)</template>
 		</MkKeyValue>
diff --git a/packages/frontend/src/components/MkFileListForAdmin.vue b/packages/frontend/src/components/MkFileListForAdmin.vue
index 1335f88a7c..f340acaf2d 100644
--- a/packages/frontend/src/components/MkFileListForAdmin.vue
+++ b/packages/frontend/src/components/MkFileListForAdmin.vue
@@ -54,8 +54,6 @@ const props = defineProps<{
 }
 
 .urempief {
-	margin-top: var(--margin);
-
 	&.list {
 		> .file {
 			display: flex;
@@ -89,7 +87,6 @@ const props = defineProps<{
 		display: grid;
 		grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
 		grid-gap: 12px;
-		margin: var(--margin) 0;
 
 		> .file {
 			position: relative;
diff --git a/packages/frontend/src/components/MkForgotPassword.vue b/packages/frontend/src/components/MkForgotPassword.vue
index 1b55451c94..29bf355cc1 100644
--- a/packages/frontend/src/components/MkForgotPassword.vue
+++ b/packages/frontend/src/components/MkForgotPassword.vue
@@ -1,5 +1,6 @@
 <template>
-<XModalWindow ref="dialog"
+<XModalWindow
+	ref="dialog"
 	:width="370"
 	:height="400"
 	@close="dialog.close()"
@@ -8,18 +9,18 @@
 	<template #header>{{ i18n.ts.forgotPassword }}</template>
 
 	<form v-if="instance.enableEmail" class="bafeceda" @submit.prevent="onSubmit">
-		<div class="main _formRoot">
-			<MkInput v-model="username" class="_formBlock" type="text" pattern="^[a-zA-Z0-9_]+$" :spellcheck="false" autofocus required>
+		<div class="main _autoGap">
+			<MkInput v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" :spellcheck="false" autofocus required>
 				<template #label>{{ i18n.ts.username }}</template>
 				<template #prefix>@</template>
 			</MkInput>
 
-			<MkInput v-model="email" class="_formBlock" type="email" :spellcheck="false" required>
+			<MkInput v-model="email" type="email" :spellcheck="false" required>
 				<template #label>{{ i18n.ts.emailAddress }}</template>
 				<template #caption>{{ i18n.ts._forgotPassword.enterEmail }}</template>
 			</MkInput>
 
-			<MkButton class="_formBlock" type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ i18n.ts.send }}</MkButton>
+			<MkButton type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ i18n.ts.send }}</MkButton>
 		</div>
 		<div class="sub">
 			<MkA to="/about" class="_link">{{ i18n.ts._forgotPassword.ifNoEmail }}</MkA>
diff --git a/packages/frontend/src/components/MkFormDialog.vue b/packages/frontend/src/components/MkFormDialog.vue
index b2bf76a8c7..29fc040092 100644
--- a/packages/frontend/src/components/MkFormDialog.vue
+++ b/packages/frontend/src/components/MkFormDialog.vue
@@ -15,37 +15,37 @@
 	</template>
 
 	<MkSpacer :margin-min="20" :margin-max="32">
-		<div class="xkpnjxcv _formRoot">
+		<div class="xkpnjxcv _autoGap">
 			<template v-for="item in Object.keys(form).filter(item => !form[item].hidden)">
-				<FormInput v-if="form[item].type === 'number'" v-model="values[item]" type="number" :step="form[item].step || 1" class="_formBlock">
+				<FormInput v-if="form[item].type === 'number'" v-model="values[item]" type="number" :step="form[item].step || 1">
 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template>
 				</FormInput>
-				<FormInput v-else-if="form[item].type === 'string' && !form[item].multiline" v-model="values[item]" type="text" class="_formBlock">
+				<FormInput v-else-if="form[item].type === 'string' && !form[item].multiline" v-model="values[item]" type="text">
 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template>
 				</FormInput>
-				<FormTextarea v-else-if="form[item].type === 'string' && form[item].multiline" v-model="values[item]" class="_formBlock">
+				<FormTextarea v-else-if="form[item].type === 'string' && form[item].multiline" v-model="values[item]">
 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template>
 				</FormTextarea>
-				<FormSwitch v-else-if="form[item].type === 'boolean'" v-model="values[item]" class="_formBlock">
+				<FormSwitch v-else-if="form[item].type === 'boolean'" v-model="values[item]">
 					<span v-text="form[item].label || item"></span>
 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template>
 				</FormSwitch>
-				<FormSelect v-else-if="form[item].type === 'enum'" v-model="values[item]" class="_formBlock">
+				<FormSelect v-else-if="form[item].type === 'enum'" v-model="values[item]">
 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
 					<option v-for="item in form[item].enum" :key="item.value" :value="item.value">{{ item.label }}</option>
 				</FormSelect>
-				<FormRadios v-else-if="form[item].type === 'radio'" v-model="values[item]" class="_formBlock">
+				<FormRadios v-else-if="form[item].type === 'radio'" v-model="values[item]">
 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
 					<option v-for="item in form[item].options" :key="item.value" :value="item.value">{{ item.label }}</option>
 				</FormRadios>
-				<FormRange v-else-if="form[item].type === 'range'" v-model="values[item]" :min="form[item].min" :max="form[item].max" :step="form[item].step" :text-converter="form[item].textConverter" class="_formBlock">
+				<FormRange v-else-if="form[item].type === 'range'" v-model="values[item]" :min="form[item].min" :max="form[item].max" :step="form[item].step" :text-converter="form[item].textConverter">
 					<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
 					<template v-if="form[item].description" #caption>{{ form[item].description }}</template>
 				</FormRange>
-				<MkButton v-else-if="form[item].type === 'button'" class="_formBlock" @click="form[item].action($event, values)">
+				<MkButton v-else-if="form[item].type === 'button'" @click="form[item].action($event, values)">
 					<span v-text="form[item].content || item"></span>
 				</MkButton>
 			</template>
diff --git a/packages/frontend/src/components/MkNotificationSettingWindow.vue b/packages/frontend/src/components/MkNotificationSettingWindow.vue
index 754d8d687b..e58a11bf5c 100644
--- a/packages/frontend/src/components/MkNotificationSettingWindow.vue
+++ b/packages/frontend/src/components/MkNotificationSettingWindow.vue
@@ -12,20 +12,20 @@
 	<template #header>{{ i18n.ts.notificationSetting }}</template>
 
 	<MkSpacer :margin-min="20" :margin-max="28">
-		<div class="_formRoot">
+		<div class="_autoGap">
 			<template v-if="showGlobalToggle">
-				<MkSwitch v-model="useGlobalSetting" class="_formBlock">
+				<MkSwitch v-model="useGlobalSetting">
 					{{ i18n.ts.useGlobalSetting }}
 					<template #caption>{{ i18n.ts.useGlobalSettingDesc }}</template>
 				</MkSwitch>
 			</template>
 			<template v-if="!useGlobalSetting">
-				<MkInfo class="_formBlock">{{ i18n.ts.notificationSettingDesc }}</MkInfo>
+				<MkInfo>{{ i18n.ts.notificationSettingDesc }}</MkInfo>
 				<div style="display: flex; gap: var(--margin); flex-wrap: wrap;">
 					<MkButton inline @click="disableAll">{{ i18n.ts.disableAll }}</MkButton>
 					<MkButton inline @click="enableAll">{{ i18n.ts.enableAll }}</MkButton>
 				</div>
-				<MkSwitch v-for="ntype in notificationTypes" class="_formBlock" :key="ntype" v-model="typesMap[ntype]">{{ i18n.t(`_notification._types.${ntype}`) }}</MkSwitch>
+				<MkSwitch v-for="ntype in notificationTypes" :key="ntype" v-model="typesMap[ntype]">{{ i18n.t(`_notification._types.${ntype}`) }}</MkSwitch>
 			</template>
 		</div>
 	</MkSpacer>
diff --git a/packages/frontend/src/components/MkPagination.vue b/packages/frontend/src/components/MkPagination.vue
index 2c0a30a888..b92e6d2360 100644
--- a/packages/frontend/src/components/MkPagination.vue
+++ b/packages/frontend/src/components/MkPagination.vue
@@ -14,14 +14,14 @@
 	</div>
 
 	<div v-else ref="rootEl">
-		<div v-show="pagination.reversed && more" key="_more_" class="cxiknjgy _gap">
+		<div v-show="pagination.reversed && more" key="_more_" class="cxiknjgy _margin">
 			<MkButton v-if="!moreFetching" class="button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" primary @click="fetchMoreAhead">
 				{{ i18n.ts.loadMore }}
 			</MkButton>
 			<MkLoading v-else class="loading"/>
 		</div>
 		<slot :items="items"></slot>
-		<div v-show="!pagination.reversed && more" key="_more_" class="cxiknjgy _gap">
+		<div v-show="!pagination.reversed && more" key="_more_" class="cxiknjgy _margin">
 			<MkButton v-if="!moreFetching" v-appear="($store.state.enableInfiniteScroll && !disableAutoLoad) ? fetchMore : null" class="button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" primary @click="fetchMore">
 				{{ i18n.ts.loadMore }}
 			</MkButton>
diff --git a/packages/frontend/src/components/MkSignin.vue b/packages/frontend/src/components/MkSignin.vue
index 96f18f8d61..281c935eb6 100644
--- a/packages/frontend/src/components/MkSignin.vue
+++ b/packages/frontend/src/components/MkSignin.vue
@@ -1,20 +1,20 @@
 <template>
 <form class="eppvobhk _monolithic_" :class="{ signing, totpLogin }" @submit.prevent="onSubmit">
-	<div class="auth _section _formRoot">
+	<div class="auth _section _autoGap">
 		<div v-show="withAvatar" class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null, marginBottom: message ? '1.5em' : null }"></div>
 		<MkInfo v-if="message">
 			{{ message }}
 		</MkInfo>
-		<div v-if="!totpLogin" class="normal-signin">
-			<MkInput v-model="username" class="_formBlock" :placeholder="i18n.ts.username" type="text" pattern="^[a-zA-Z0-9_]+$" :spellcheck="false" autofocus required data-cy-signin-username @update:model-value="onUsernameChange">
+		<div v-if="!totpLogin" class="normal-signin _autoGap">
+			<MkInput v-model="username" :placeholder="i18n.ts.username" type="text" pattern="^[a-zA-Z0-9_]+$" :spellcheck="false" autofocus required data-cy-signin-username @update:model-value="onUsernameChange">
 				<template #prefix>@</template>
 				<template #suffix>@{{ host }}</template>
 			</MkInput>
-			<MkInput v-if="!user || user && !user.usePasswordLessLogin" v-model="password" class="_formBlock" :placeholder="i18n.ts.password" type="password" :with-password-toggle="true" required data-cy-signin-password>
+			<MkInput v-if="!user || user && !user.usePasswordLessLogin" v-model="password" :placeholder="i18n.ts.password" type="password" :with-password-toggle="true" required data-cy-signin-password>
 				<template #prefix><i class="ti ti-lock"></i></template>
 				<template #caption><button class="_textButton" type="button" @click="resetPassword">{{ i18n.ts.forgotPassword }}</button></template>
 			</MkInput>
-			<MkButton class="_formBlock" type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? i18n.ts.loggingIn : i18n.ts.login }}</MkButton>
+			<MkButton type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? i18n.ts.loggingIn : i18n.ts.login }}</MkButton>
 		</div>
 		<div v-if="totpLogin" class="2fa-signin" :class="{ securityKeys: user && user.securityKeys }">
 			<div v-if="user && user.securityKeys" class="twofa-group tap-group">
@@ -41,9 +41,9 @@
 		</div>
 	</div>
 	<div class="social _section">
-		<a v-if="meta && meta.enableTwitterIntegration" class="_borderButton _gap" :href="`${apiUrl}/signin/twitter`"><i class="ti ti-brand-twitter" style="margin-right: 4px;"></i>{{ $t('signinWith', { x: 'Twitter' }) }}</a>
-		<a v-if="meta && meta.enableGithubIntegration" class="_borderButton _gap" :href="`${apiUrl}/signin/github`"><i class="ti ti-brand-github" style="margin-right: 4px;"></i>{{ $t('signinWith', { x: 'GitHub' }) }}</a>
-		<a v-if="meta && meta.enableDiscordIntegration" class="_borderButton _gap" :href="`${apiUrl}/signin/discord`"><i class="ti ti-brand-discord" style="margin-right: 4px;"></i>{{ $t('signinWith', { x: 'Discord' }) }}</a>
+		<a v-if="meta && meta.enableTwitterIntegration" class="_borderButton _margin" :href="`${apiUrl}/signin/twitter`"><i class="ti ti-brand-twitter" style="margin-right: 4px;"></i>{{ $t('signinWith', { x: 'Twitter' }) }}</a>
+		<a v-if="meta && meta.enableGithubIntegration" class="_borderButton _margin" :href="`${apiUrl}/signin/github`"><i class="ti ti-brand-github" style="margin-right: 4px;"></i>{{ $t('signinWith', { x: 'GitHub' }) }}</a>
+		<a v-if="meta && meta.enableDiscordIntegration" class="_borderButton _margin" :href="`${apiUrl}/signin/discord`"><i class="ti ti-brand-discord" style="margin-right: 4px;"></i>{{ $t('signinWith', { x: 'Discord' }) }}</a>
 	</div>
 </form>
 </template>
diff --git a/packages/frontend/src/components/MkSignup.vue b/packages/frontend/src/components/MkSignup.vue
index d987425ca3..66a14e5608 100644
--- a/packages/frontend/src/components/MkSignup.vue
+++ b/packages/frontend/src/components/MkSignup.vue
@@ -1,10 +1,10 @@
 <template>
-<form class="qlvuhzng _formRoot" autocomplete="new-password" @submit.prevent="onSubmit">
-	<MkInput v-if="instance.disableRegistration" v-model="invitationCode" class="_formBlock" type="text" :spellcheck="false" required>
+<form class="qlvuhzng _autoGap" autocomplete="new-password" @submit.prevent="onSubmit">
+	<MkInput v-if="instance.disableRegistration" v-model="invitationCode" type="text" :spellcheck="false" required>
 		<template #label>{{ i18n.ts.invitationCode }}</template>
 		<template #prefix><i class="ti ti-key"></i></template>
 	</MkInput>
-	<MkInput v-model="username" class="_formBlock" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :spellcheck="false" required data-cy-signup-username @update:model-value="onChangeUsername">
+	<MkInput v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :spellcheck="false" required data-cy-signup-username @update:model-value="onChangeUsername">
 		<template #label>{{ i18n.ts.username }} <div v-tooltip:dialog="i18n.ts.usernameInfo" class="_button _help"><i class="ti ti-question-circle"></i></div></template>
 		<template #prefix>@</template>
 		<template #suffix>@{{ host }}</template>
@@ -18,7 +18,7 @@
 			<span v-else-if="usernameState === 'max-range'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts.tooLong }}</span>
 		</template>
 	</MkInput>
-	<MkInput v-if="instance.emailRequiredForSignup" v-model="email" class="_formBlock" :debounce="true" type="email" :spellcheck="false" required data-cy-signup-email @update:model-value="onChangeEmail">
+	<MkInput v-if="instance.emailRequiredForSignup" v-model="email" :debounce="true" type="email" :spellcheck="false" required data-cy-signup-email @update:model-value="onChangeEmail">
 		<template #label>{{ i18n.ts.emailAddress }} <div v-tooltip:dialog="i18n.ts._signup.emailAddressInfo" class="_button _help"><i class="ti ti-question-circle"></i></div></template>
 		<template #prefix><i class="ti ti-mail"></i></template>
 		<template #caption>
@@ -33,7 +33,7 @@
 			<span v-else-if="emailState === 'error'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts.error }}</span>
 		</template>
 	</MkInput>
-	<MkInput v-model="password" class="_formBlock" type="password" autocomplete="new-password" required data-cy-signup-password @update:model-value="onChangePassword">
+	<MkInput v-model="password" type="password" autocomplete="new-password" required data-cy-signup-password @update:model-value="onChangePassword">
 		<template #label>{{ i18n.ts.password }}</template>
 		<template #prefix><i class="ti ti-lock"></i></template>
 		<template #caption>
@@ -42,7 +42,7 @@
 			<span v-if="passwordStrength == 'high'" style="color: var(--success)"><i class="ti ti-check ti-fw"></i> {{ i18n.ts.strongPassword }}</span>
 		</template>
 	</MkInput>
-	<MkInput v-model="retypedPassword" class="_formBlock" type="password" autocomplete="new-password" required data-cy-signup-password-retype @update:model-value="onChangePasswordRetype">
+	<MkInput v-model="retypedPassword" type="password" autocomplete="new-password" required data-cy-signup-password-retype @update:model-value="onChangePasswordRetype">
 		<template #label>{{ i18n.ts.password }} ({{ i18n.ts.retype }})</template>
 		<template #prefix><i class="ti ti-lock"></i></template>
 		<template #caption>
@@ -50,17 +50,17 @@
 			<span v-if="passwordRetypeState == 'not-match'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts.passwordNotMatched }}</span>
 		</template>
 	</MkInput>
-	<MkSwitch v-if="instance.tosUrl" v-model="ToSAgreement" class="_formBlock tou">
+	<MkSwitch v-if="instance.tosUrl" v-model="ToSAgreement" class="tou">
 		<I18n :src="i18n.ts.agreeTo">
 			<template #0>
 				<a :href="instance.tosUrl" class="_link" target="_blank">{{ i18n.ts.tos }}</a>
 			</template>
 		</I18n>
 	</MkSwitch>
-	<MkCaptcha v-if="instance.enableHcaptcha" ref="hcaptcha" v-model="hCaptchaResponse" class="_formBlock captcha" provider="hcaptcha" :sitekey="instance.hcaptchaSiteKey"/>
-	<MkCaptcha v-if="instance.enableRecaptcha" ref="recaptcha" v-model="reCaptchaResponse" class="_formBlock captcha" provider="recaptcha" :sitekey="instance.recaptchaSiteKey"/>
-	<MkCaptcha v-if="instance.enableTurnstile" ref="turnstile" v-model="turnstileResponse" class="_formBlock captcha" provider="turnstile" :sitekey="instance.turnstileSiteKey"/>
-	<MkButton class="_formBlock" type="submit" :disabled="shouldDisableSubmitting" gradate data-cy-signup-submit>{{ i18n.ts.start }}</MkButton>
+	<MkCaptcha v-if="instance.enableHcaptcha" ref="hcaptcha" v-model="hCaptchaResponse" class="captcha" provider="hcaptcha" :sitekey="instance.hcaptchaSiteKey"/>
+	<MkCaptcha v-if="instance.enableRecaptcha" ref="recaptcha" v-model="reCaptchaResponse" class="captcha" provider="recaptcha" :sitekey="instance.recaptchaSiteKey"/>
+	<MkCaptcha v-if="instance.enableTurnstile" ref="turnstile" v-model="turnstileResponse" class="captcha" provider="turnstile" :sitekey="instance.turnstileSiteKey"/>
+	<MkButton type="submit" :disabled="shouldDisableSubmitting" gradate data-cy-signup-submit>{{ i18n.ts.start }}</MkButton>
 </form>
 </template>
 
diff --git a/packages/frontend/src/components/MkTokenGenerateWindow.vue b/packages/frontend/src/components/MkTokenGenerateWindow.vue
index 894336136c..1762a0d33e 100644
--- a/packages/frontend/src/components/MkTokenGenerateWindow.vue
+++ b/packages/frontend/src/components/MkTokenGenerateWindow.vue
@@ -13,21 +13,21 @@
 	<template #header>{{ title || $ts.generateAccessToken }}</template>
 
 	<MkSpacer :margin-min="20" :margin-max="28">
-		<div class="_formRoot">
-			<div v-if="information" class="_formBlock">
+		<div class="_autoGap">
+			<div v-if="information">
 				<MkInfo warn>{{ information }}</MkInfo>
 			</div>
-			<div class="_formBlock">
+			<div>
 				<MkInput v-model="name">
 					<template #label>{{ $ts.name }}</template>
 				</MkInput>
 			</div>
-			<div class="_formBlock"><b>{{ $ts.permission }}</b></div>
+			<div><b>{{ $ts.permission }}</b></div>
 			<div style="display: flex; gap: var(--margin); flex-wrap: wrap;">
 				<MkButton inline @click="disableAll">{{ i18n.ts.disableAll }}</MkButton>
 				<MkButton inline @click="enableAll">{{ i18n.ts.enableAll }}</MkButton>
 			</div>
-			<MkSwitch v-for="kind in (initialPermissions || kinds)" :key="kind" v-model="permissions[kind]" class="_formBlock">{{ $t(`_permissions.${kind}`) }}</MkSwitch>
+			<MkSwitch v-for="kind in (initialPermissions || kinds)" :key="kind" v-model="permissions[kind]">{{ $t(`_permissions.${kind}`) }}</MkSwitch>
 		</div>
 	</MkSpacer>
 </XModalWindow>
diff --git a/packages/frontend/src/components/form/section.vue b/packages/frontend/src/components/form/section.vue
index c6e34ef1cc..a838164978 100644
--- a/packages/frontend/src/components/form/section.vue
+++ b/packages/frontend/src/components/form/section.vue
@@ -1,35 +1,27 @@
 <template>
-<div class="vrtktovh _formBlock">
+<div class="vrtktovh" :class="{ first }">
 	<div class="label"><slot name="label"></slot></div>
-	<div class="main _formRoot">
+	<div class="main">
 		<slot></slot>
 	</div>
 </div>
 </template>
 
 <script lang="ts" setup>
+defineProps<{
+	first?: boolean;
+}>();
 </script>
 
 <style lang="scss" scoped>
 .vrtktovh {
 	border-top: solid 0.5px var(--divider);
-	border-bottom: solid 0.5px var(--divider);
-
-	& + .vrtktovh {
-		border-top: none;
-	}
-
-	&:first-child {
-		border-top: none;
-	}
-
-	&:last-child {
-		border-bottom: none;
-	}
+	//border-bottom: solid 0.5px var(--divider);
 
 	> .label {
 		font-weight: bold;
-		margin: 1.5em 0 16px 0;
+		padding: 1.5em 0 0 0;
+		margin: 0 0 16px 0;
 
 		&:empty {
 			display: none;
@@ -37,7 +29,15 @@
 	}
 
 	> .main {
-		margin: 1.5em 0;
+		margin: 1.5em 0 0 0;
+	}
+
+	&.first {
+		border-top: none;
+
+		> .label {
+			padding-top: 0;
+		}
 	}
 }
 </style>
diff --git a/packages/frontend/src/components/form/split.vue b/packages/frontend/src/components/form/split.vue
index 301a8a84e5..3cee41e3d6 100644
--- a/packages/frontend/src/components/form/split.vue
+++ b/packages/frontend/src/components/form/split.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="terlnhxf _formBlock">
+<div class="terlnhxf">
 	<slot></slot>
 </div>
 </template>
diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue
index 5085b12527..2f88dae738 100644
--- a/packages/frontend/src/pages/about-misskey.vue
+++ b/packages/frontend/src/pages/about-misskey.vue
@@ -3,18 +3,17 @@
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<div style="overflow: clip;">
 		<MkSpacer :content-max="600" :margin-min="20">
-			<div class="_formRoot znqjceqz">
-				<div id="debug"></div>
-				<div ref="containerEl" v-panel class="_formBlock about" :class="{ playing: easterEggEngine != null }">
+			<div class="_autoGap znqjceqz">
+				<div ref="containerEl" v-panel class="about" :class="{ playing: easterEggEngine != null }">
 					<img src="/client-assets/about-icon.png" alt="" class="icon" draggable="false" @load="iconLoaded" @click="gravity"/>
 					<div class="misskey">Misskey</div>
 					<div class="version">v{{ version }}</div>
 					<span v-for="emoji in easterEggEmojis" :key="emoji.id" class="emoji" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :is-reaction="false" :normal="true" :no-style="true"/></span>
 				</div>
-				<div class="_formBlock" style="text-align: center;">
+				<div style="text-align: center;">
 					{{ i18n.ts._aboutMisskey.about }}<br><a href="https://misskey-hub.net/docs/misskey.html" target="_blank" class="_link">{{ i18n.ts.learnMore }}</a>
 				</div>
-				<div class="_formBlock" style="text-align: center;">
+				<div style="text-align: center;">
 					<MkButton primary rounded inline @click="iLoveMisskey">I <Mfm text="$[jelly ❤]"/> #Misskey</MkButton>
 				</div>
 				<FormSection>
diff --git a/packages/frontend/src/pages/about.vue b/packages/frontend/src/pages/about.vue
index 1d6a844fbd..27470d1a8e 100644
--- a/packages/frontend/src/pages/about.vue
+++ b/packages/frontend/src/pages/about.vue
@@ -2,8 +2,8 @@
 <MkStickyContainer>
 	<template #header><MkPageHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer v-if="tab === 'overview'" :content-max="600" :margin-min="20">
-		<div class="_formRoot">
-			<div class="_formBlock fwhjspax" :style="{ backgroundImage: `url(${ $instance.bannerUrl })` }">
+		<div class="_autoGap">
+			<div class="fwhjspax" :style="{ backgroundImage: `url(${ $instance.bannerUrl })` }">
 				<div class="content">
 					<img :src="$instance.iconUrl ?? $instance.faviconUrl ?? '/favicon.ico'" alt="" class="icon"/>
 					<div class="name">
@@ -12,44 +12,48 @@
 				</div>
 			</div>
 
-			<MkKeyValue class="_formBlock">
+			<MkKeyValue>
 				<template #key>{{ i18n.ts.description }}</template>
 				<template #value><div v-html="$instance.description"></div></template>
 			</MkKeyValue>
 
 			<FormSection>
-				<MkKeyValue class="_formBlock" :copy="version">
-					<template #key>Misskey</template>
-					<template #value>{{ version }}</template>
-				</MkKeyValue>
-				<div class="_formBlock" v-html="i18n.t('poweredByMisskeyDescription', { name: $instance.name ?? host })">
+				<div class="_autoGap">
+					<MkKeyValue :copy="version">
+						<template #key>Misskey</template>
+						<template #value>{{ version }}</template>
+					</MkKeyValue>
+					<div v-html="i18n.t('poweredByMisskeyDescription', { name: $instance.name ?? host })">
+					</div>
+					<FormLink to="/about-misskey">{{ i18n.ts.aboutMisskey }}</FormLink>
 				</div>
-				<FormLink to="/about-misskey">{{ i18n.ts.aboutMisskey }}</FormLink>
 			</FormSection>
 
 			<FormSection>
-				<FormSplit>
-					<MkKeyValue class="_formBlock">
-						<template #key>{{ i18n.ts.administrator }}</template>
-						<template #value>{{ $instance.maintainerName }}</template>
-					</MkKeyValue>
-					<MkKeyValue class="_formBlock">
-						<template #key>{{ i18n.ts.contact }}</template>
-						<template #value>{{ $instance.maintainerEmail }}</template>
-					</MkKeyValue>
-				</FormSplit>
-				<FormLink v-if="$instance.tosUrl" :to="$instance.tosUrl" class="_formBlock" external>{{ i18n.ts.tos }}</FormLink>
+				<div class="_autoGap">
+					<FormSplit>
+						<MkKeyValue>
+							<template #key>{{ i18n.ts.administrator }}</template>
+							<template #value>{{ $instance.maintainerName }}</template>
+						</MkKeyValue>
+						<MkKeyValue>
+							<template #key>{{ i18n.ts.contact }}</template>
+							<template #value>{{ $instance.maintainerEmail }}</template>
+						</MkKeyValue>
+					</FormSplit>
+					<FormLink v-if="$instance.tosUrl" :to="$instance.tosUrl" external>{{ i18n.ts.tos }}</FormLink>
+				</div>
 			</FormSection>
 
 			<FormSuspense :p="initStats">
 				<FormSection>
 					<template #label>{{ i18n.ts.statistics }}</template>
 					<FormSplit>
-						<MkKeyValue class="_formBlock">
+						<MkKeyValue>
 							<template #key>{{ i18n.ts.users }}</template>
 							<template #value>{{ number(stats.originalUsersCount) }}</template>
 						</MkKeyValue>
-						<MkKeyValue class="_formBlock">
+						<MkKeyValue>
 							<template #key>{{ i18n.ts.notes }}</template>
 							<template #value>{{ number(stats.originalNotesCount) }}</template>
 						</MkKeyValue>
diff --git a/packages/frontend/src/pages/admin-file.vue b/packages/frontend/src/pages/admin-file.vue
index a11249e75d..92972c1168 100644
--- a/packages/frontend/src/pages/admin-file.vue
+++ b/packages/frontend/src/pages/admin-file.vue
@@ -2,11 +2,11 @@
 <MkStickyContainer>
 	<template #header><MkPageHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer v-if="file" :content-max="600" :margin-min="16" :margin-max="32">
-		<div v-if="tab === 'overview'" class="cxqhhsmd _formRoot">
-			<a class="_formBlock thumbnail" :href="file.url" target="_blank">
+		<div v-if="tab === 'overview'" class="cxqhhsmd _autoGap">
+			<a class="thumbnail" :href="file.url" target="_blank">
 				<MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/>
 			</a>
-			<div class="_formBlock">
+			<div>
 				<MkKeyValue :copy="file.type" oneline style="margin: 1em 0;">
 					<template #key>MIME Type</template>
 					<template #value><span class="_monospace">{{ file.type }}</span></template>
@@ -31,29 +31,29 @@
 			<MkA v-if="file.user" class="user" :to="`/user-info/${file.user.id}`">
 				<MkUserCardMini :user="file.user"/>
 			</MkA>
-			<div class="_formBlock">
+			<div>
 				<MkSwitch v-model="isSensitive" @update:model-value="toggleIsSensitive">NSFW</MkSwitch>
 			</div>
 
-			<div class="_formBlock">
+			<div>
 				<MkButton danger @click="del"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton>
 			</div>
 		</div>
-		<div v-else-if="tab === 'ip' && info" class="_formRoot">
+		<div v-else-if="tab === 'ip' && info" class="_autoGap">
 			<MkInfo v-if="!iAmAdmin" warn>{{ i18n.ts.requireAdminForView }}</MkInfo>
-			<MkKeyValue v-if="info.requestIp" class="_formBlock _monospace" :copy="info.requestIp" oneline>
+			<MkKeyValue v-if="info.requestIp" class="_monospace" :copy="info.requestIp" oneline>
 				<template #key>IP</template>
 				<template #value>{{ info.requestIp }}</template>
 			</MkKeyValue>
 			<FormSection v-if="info.requestHeaders">
 				<template #label>Headers</template>
-				<MkKeyValue v-for="(v, k) in info.requestHeaders" :key="k" class="_formBlock _monospace">
+				<MkKeyValue v-for="(v, k) in info.requestHeaders" :key="k" class="_monospace">
 					<template #key>{{ k }}</template>
 					<template #value>{{ v }}</template>
 				</MkKeyValue>
 			</FormSection>
 		</div>
-		<div v-else-if="tab === 'raw'" class="_formRoot">
+		<div v-else-if="tab === 'raw'" class="_autoGap">
 			<MkObjectView v-if="info" tall :value="info">
 			</MkObjectView>
 		</div>
diff --git a/packages/frontend/src/pages/admin/ads.vue b/packages/frontend/src/pages/admin/ads.vue
index 2ec926c65c..e7ab1c8556 100644
--- a/packages/frontend/src/pages/admin/ads.vue
+++ b/packages/frontend/src/pages/admin/ads.vue
@@ -3,15 +3,15 @@
 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="900">
 		<div class="uqshojas">
-			<div v-for="ad in ads" class="_panel _formRoot ad">
+			<div v-for="ad in ads" class="_panel _autoGap ad">
 				<MkAd v-if="ad.url" :specify="ad"/>
-				<MkInput v-model="ad.url" type="url" class="_formBlock">
+				<MkInput v-model="ad.url" type="url">
 					<template #label>URL</template>
 				</MkInput>
-				<MkInput v-model="ad.imageUrl" class="_formBlock">
+				<MkInput v-model="ad.imageUrl">
 					<template #label>{{ i18n.ts.imageUrl }}</template>
 				</MkInput>
-				<FormRadios v-model="ad.place" class="_formBlock">
+				<FormRadios v-model="ad.place">
 					<template #label>Form</template>
 					<option value="square">square</option>
 					<option value="horizontal">horizontal</option>
@@ -33,10 +33,10 @@
 						<template #label>{{ i18n.ts.expiration }}</template>
 					</MkInput>
 				</FormSplit>
-				<MkTextarea v-model="ad.memo" class="_formBlock">
+				<MkTextarea v-model="ad.memo">
 					<template #label>{{ i18n.ts.memo }}</template>
 				</MkTextarea>
-				<div class="buttons _formBlock">
+				<div class="buttons">
 					<MkButton class="button" inline primary style="margin-right: 12px;" @click="save(ad)"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton>
 					<MkButton class="button" inline danger @click="remove(ad)"><i class="ti ti-trash"></i> {{ i18n.ts.remove }}</MkButton>
 				</div>
diff --git a/packages/frontend/src/pages/admin/announcements.vue b/packages/frontend/src/pages/admin/announcements.vue
index 607ad8aa02..f5c2f11957 100644
--- a/packages/frontend/src/pages/admin/announcements.vue
+++ b/packages/frontend/src/pages/admin/announcements.vue
@@ -3,7 +3,7 @@
 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="900">
 		<div class="ztgjmzrw">
-			<section v-for="announcement in announcements" class="_card _gap announcements">
+			<section v-for="announcement in announcements" class="_card _margin announcements">
 				<div class="_content announcement">
 					<MkInput v-model="announcement.title">
 						<template #label>{{ i18n.ts.title }}</template>
diff --git a/packages/frontend/src/pages/admin/bot-protection.vue b/packages/frontend/src/pages/admin/bot-protection.vue
index d03961cf95..c213e9805b 100644
--- a/packages/frontend/src/pages/admin/bot-protection.vue
+++ b/packages/frontend/src/pages/admin/bot-protection.vue
@@ -1,8 +1,8 @@
 <template>
 <div>
 	<FormSuspense :p="init">
-		<div class="_formRoot">
-			<FormRadios v-model="provider" class="_formBlock">
+		<div class="_autoGap">
+			<FormRadios v-model="provider">
 				<option :value="null">{{ i18n.ts.none }} ({{ i18n.ts.notRecommended }})</option>
 				<option value="hcaptcha">hCaptcha</option>
 				<option value="recaptcha">reCAPTCHA</option>
@@ -10,43 +10,43 @@
 			</FormRadios>
 
 			<template v-if="provider === 'hcaptcha'">
-				<FormInput v-model="hcaptchaSiteKey" class="_formBlock">
+				<FormInput v-model="hcaptchaSiteKey">
 					<template #prefix><i class="ti ti-key"></i></template>
 					<template #label>{{ i18n.ts.hcaptchaSiteKey }}</template>
 				</FormInput>
-				<FormInput v-model="hcaptchaSecretKey" class="_formBlock">
+				<FormInput v-model="hcaptchaSecretKey">
 					<template #prefix><i class="ti ti-key"></i></template>
 					<template #label>{{ i18n.ts.hcaptchaSecretKey }}</template>
 				</FormInput>
-				<FormSlot class="_formBlock">
+				<FormSlot>
 					<template #label>{{ i18n.ts.preview }}</template>
 					<MkCaptcha provider="hcaptcha" :sitekey="hcaptchaSiteKey || '10000000-ffff-ffff-ffff-000000000001'"/>
 				</FormSlot>
 			</template>
 			<template v-else-if="provider === 'recaptcha'">
-				<FormInput v-model="recaptchaSiteKey" class="_formBlock">
+				<FormInput v-model="recaptchaSiteKey">
 					<template #prefix><i class="ti ti-key"></i></template>
 					<template #label>{{ i18n.ts.recaptchaSiteKey }}</template>
 				</FormInput>
-				<FormInput v-model="recaptchaSecretKey" class="_formBlock">
+				<FormInput v-model="recaptchaSecretKey">
 					<template #prefix><i class="ti ti-key"></i></template>
 					<template #label>{{ i18n.ts.recaptchaSecretKey }}</template>
 				</FormInput>
-				<FormSlot v-if="recaptchaSiteKey" class="_formBlock">
+				<FormSlot v-if="recaptchaSiteKey">
 					<template #label>{{ i18n.ts.preview }}</template>
 					<MkCaptcha provider="recaptcha" :sitekey="recaptchaSiteKey"/>
 				</FormSlot>
 			</template>
 			<template v-else-if="provider === 'turnstile'">
-				<FormInput v-model="turnstileSiteKey" class="_formBlock">
+				<FormInput v-model="turnstileSiteKey">
 					<template #prefix><i class="ti ti-key"></i></template>
 					<template #label>{{ i18n.ts.turnstileSiteKey }}</template>
 				</FormInput>
-				<FormInput v-model="turnstileSecretKey" class="_formBlock">
+				<FormInput v-model="turnstileSecretKey">
 					<template #prefix><i class="ti ti-key"></i></template>
 					<template #label>{{ i18n.ts.turnstileSecretKey }}</template>
 				</FormInput>
-				<FormSlot class="_formBlock">
+				<FormSlot>
 					<template #label>{{ i18n.ts.preview }}</template>
 					<MkCaptcha provider="turnstile" :sitekey="turnstileSiteKey || '1x00000000000000000000AA'"/>
 				</FormSlot>
diff --git a/packages/frontend/src/pages/admin/email-settings.vue b/packages/frontend/src/pages/admin/email-settings.vue
index 6c9dee1704..0bf6c79192 100644
--- a/packages/frontend/src/pages/admin/email-settings.vue
+++ b/packages/frontend/src/pages/admin/email-settings.vue
@@ -3,40 +3,43 @@
 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32">
 		<FormSuspense :p="init">
-			<div class="_formRoot">
-				<FormSwitch v-model="enableEmail" class="_formBlock">
+			<div class="_autoGap">
+				<FormSwitch v-model="enableEmail">
 					<template #label>{{ i18n.ts.enableEmail }} ({{ i18n.ts.recommended }})</template>
 					<template #caption>{{ i18n.ts.emailConfigInfo }}</template>
 				</FormSwitch>
 
 				<template v-if="enableEmail">
-					<FormInput v-model="email" type="email" class="_formBlock">
+					<FormInput v-model="email" type="email">
 						<template #label>{{ i18n.ts.emailAddress }}</template>
 					</FormInput>
 
 					<FormSection>
 						<template #label>{{ i18n.ts.smtpConfig }}</template>
-						<FormSplit :min-width="280">
-							<FormInput v-model="smtpHost" class="_formBlock">
-								<template #label>{{ i18n.ts.smtpHost }}</template>
-							</FormInput>
-							<FormInput v-model="smtpPort" type="number" class="_formBlock">
-								<template #label>{{ i18n.ts.smtpPort }}</template>
-							</FormInput>
-						</FormSplit>
-						<FormSplit :min-width="280">
-							<FormInput v-model="smtpUser" class="_formBlock">
-								<template #label>{{ i18n.ts.smtpUser }}</template>
-							</FormInput>
-							<FormInput v-model="smtpPass" type="password" class="_formBlock">
-								<template #label>{{ i18n.ts.smtpPass }}</template>
-							</FormInput>
-						</FormSplit>
-						<FormInfo class="_formBlock">{{ i18n.ts.emptyToDisableSmtpAuth }}</FormInfo>
-						<FormSwitch v-model="smtpSecure" class="_formBlock">
-							<template #label>{{ i18n.ts.smtpSecure }}</template>
-							<template #caption>{{ i18n.ts.smtpSecureInfo }}</template>
-						</FormSwitch>
+
+						<div class="_autoGap">
+							<FormSplit :min-width="280">
+								<FormInput v-model="smtpHost">
+									<template #label>{{ i18n.ts.smtpHost }}</template>
+								</FormInput>
+								<FormInput v-model="smtpPort" type="number">
+									<template #label>{{ i18n.ts.smtpPort }}</template>
+								</FormInput>
+							</FormSplit>
+							<FormSplit :min-width="280">
+								<FormInput v-model="smtpUser">
+									<template #label>{{ i18n.ts.smtpUser }}</template>
+								</FormInput>
+								<FormInput v-model="smtpPass" type="password">
+									<template #label>{{ i18n.ts.smtpPass }}</template>
+								</FormInput>
+							</FormSplit>
+							<FormInfo>{{ i18n.ts.emptyToDisableSmtpAuth }}</FormInfo>
+							<FormSwitch v-model="smtpSecure">
+								<template #label>{{ i18n.ts.smtpSecure }}</template>
+								<template #caption>{{ i18n.ts.smtpSecureInfo }}</template>
+							</FormSwitch>
+						</div>
 					</FormSection>
 				</template>
 			</div>
diff --git a/packages/frontend/src/pages/admin/emoji-edit-dialog.vue b/packages/frontend/src/pages/admin/emoji-edit-dialog.vue
index 610958e95e..115125bd4c 100644
--- a/packages/frontend/src/pages/admin/emoji-edit-dialog.vue
+++ b/packages/frontend/src/pages/admin/emoji-edit-dialog.vue
@@ -9,22 +9,22 @@
 >
 	<template #header>:{{ emoji.name }}:</template>
 
-	<div class="_monolithic_">
-		<div class="yigymqpb _section">
+	<MkSpacer :margin-min="20" :margin-max="28">
+		<div class="yigymqpb _autoGap">
 			<img :src="`/emoji/${emoji.name}.webp`" class="img"/>
-			<MkInput v-model="name" class="_formBlock">
+			<MkInput v-model="name">
 				<template #label>{{ i18n.ts.name }}</template>
 			</MkInput>
-			<MkInput v-model="category" class="_formBlock" :datalist="categories">
+			<MkInput v-model="category" :datalist="categories">
 				<template #label>{{ i18n.ts.category }}</template>
 			</MkInput>
-			<MkInput v-model="aliases" class="_formBlock">
+			<MkInput v-model="aliases">
 				<template #label>{{ i18n.ts.tags }}</template>
 				<template #caption>{{ i18n.ts.setMultipleBySeparatingWithSpace }}</template>
 			</MkInput>
 			<MkButton danger @click="del()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton>
 		</div>
-	</div>
+	</MkSpacer>
 </XModalWindow>
 </template>
 
diff --git a/packages/frontend/src/pages/admin/instance-block.vue b/packages/frontend/src/pages/admin/instance-block.vue
index 1bdd174de4..6c6941daec 100644
--- a/packages/frontend/src/pages/admin/instance-block.vue
+++ b/packages/frontend/src/pages/admin/instance-block.vue
@@ -3,12 +3,12 @@
 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32">
 		<FormSuspense :p="init">
-			<FormTextarea v-model="blockedHosts" class="_formBlock">
+			<FormTextarea v-model="blockedHosts">
 				<span>{{ i18n.ts.blockedInstances }}</span>
 				<template #caption>{{ i18n.ts.blockedInstancesDescription }}</template>
 			</FormTextarea>
 
-			<FormButton primary class="_formBlock" @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton>
+			<FormButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton>
 		</FormSuspense>
 	</MkSpacer>
 </MkStickyContainer>
diff --git a/packages/frontend/src/pages/admin/integrations.discord.vue b/packages/frontend/src/pages/admin/integrations.discord.vue
index 0a69c44c93..e5069b9f85 100644
--- a/packages/frontend/src/pages/admin/integrations.discord.vue
+++ b/packages/frontend/src/pages/admin/integrations.discord.vue
@@ -1,25 +1,25 @@
 <template>
 <FormSuspense :p="init">
-	<div class="_formRoot">
-		<FormSwitch v-model="enableDiscordIntegration" class="_formBlock">
+	<div class="_autoGap">
+		<FormSwitch v-model="enableDiscordIntegration">
 			<template #label>{{ i18n.ts.enable }}</template>
 		</FormSwitch>
 
 		<template v-if="enableDiscordIntegration">
-			<FormInfo class="_formBlock">Callback URL: {{ `${uri}/api/dc/cb` }}</FormInfo>
+			<FormInfo>Callback URL: {{ `${uri}/api/dc/cb` }}</FormInfo>
 		
-			<FormInput v-model="discordClientId" class="_formBlock">
+			<FormInput v-model="discordClientId">
 				<template #prefix><i class="ti ti-key"></i></template>
 				<template #label>Client ID</template>
 			</FormInput>
 
-			<FormInput v-model="discordClientSecret" class="_formBlock">
+			<FormInput v-model="discordClientSecret">
 				<template #prefix><i class="ti ti-key"></i></template>
 				<template #label>Client Secret</template>
 			</FormInput>
 		</template>
 
-		<FormButton primary class="_formBlock" @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton>
+		<FormButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton>
 	</div>
 </FormSuspense>
 </template>
diff --git a/packages/frontend/src/pages/admin/integrations.github.vue b/packages/frontend/src/pages/admin/integrations.github.vue
index 66419d5891..8418e202ab 100644
--- a/packages/frontend/src/pages/admin/integrations.github.vue
+++ b/packages/frontend/src/pages/admin/integrations.github.vue
@@ -1,25 +1,25 @@
 <template>
 <FormSuspense :p="init">
-	<div class="_formRoot">
-		<FormSwitch v-model="enableGithubIntegration" class="_formBlock">
+	<div class="_autoGap">
+		<FormSwitch v-model="enableGithubIntegration">
 			<template #label>{{ i18n.ts.enable }}</template>
 		</FormSwitch>
 
 		<template v-if="enableGithubIntegration">
-			<FormInfo class="_formBlock">Callback URL: {{ `${uri}/api/gh/cb` }}</FormInfo>
+			<FormInfo>Callback URL: {{ `${uri}/api/gh/cb` }}</FormInfo>
 		
-			<FormInput v-model="githubClientId" class="_formBlock">
+			<FormInput v-model="githubClientId">
 				<template #prefix><i class="ti ti-key"></i></template>
 				<template #label>Client ID</template>
 			</FormInput>
 
-			<FormInput v-model="githubClientSecret" class="_formBlock">
+			<FormInput v-model="githubClientSecret">
 				<template #prefix><i class="ti ti-key"></i></template>
 				<template #label>Client Secret</template>
 			</FormInput>
 		</template>
 
-		<FormButton primary class="_formBlock" @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton>
+		<FormButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton>
 	</div>
 </FormSuspense>
 </template>
diff --git a/packages/frontend/src/pages/admin/integrations.twitter.vue b/packages/frontend/src/pages/admin/integrations.twitter.vue
index 1e8d882b9c..8bd3c7c16d 100644
--- a/packages/frontend/src/pages/admin/integrations.twitter.vue
+++ b/packages/frontend/src/pages/admin/integrations.twitter.vue
@@ -1,25 +1,25 @@
 <template>
 <FormSuspense :p="init">
-	<div class="_formRoot">
-		<FormSwitch v-model="enableTwitterIntegration" class="_formBlock">
+	<div class="_autoGap">
+		<FormSwitch v-model="enableTwitterIntegration">
 			<template #label>{{ i18n.ts.enable }}</template>
 		</FormSwitch>
 
 		<template v-if="enableTwitterIntegration">
-			<FormInfo class="_formBlock">Callback URL: {{ `${uri}/api/tw/cb` }}</FormInfo>
+			<FormInfo>Callback URL: {{ `${uri}/api/tw/cb` }}</FormInfo>
 		
-			<FormInput v-model="twitterConsumerKey" class="_formBlock">
+			<FormInput v-model="twitterConsumerKey">
 				<template #prefix><i class="ti ti-key"></i></template>
 				<template #label>Consumer Key</template>
 			</FormInput>
 
-			<FormInput v-model="twitterConsumerSecret" class="_formBlock">
+			<FormInput v-model="twitterConsumerSecret">
 				<template #prefix><i class="ti ti-key"></i></template>
 				<template #label>Consumer Secret</template>
 			</FormInput>
 		</template>
 
-		<FormButton primary class="_formBlock" @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton>
+		<FormButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton>
 	</div>
 </FormSuspense>
 </template>
diff --git a/packages/frontend/src/pages/admin/integrations.vue b/packages/frontend/src/pages/admin/integrations.vue
index 9cc35baefd..4ce0a29ae7 100644
--- a/packages/frontend/src/pages/admin/integrations.vue
+++ b/packages/frontend/src/pages/admin/integrations.vue
@@ -1,27 +1,31 @@
-<template><MkStickyContainer>
+<template>
+<MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
-		<MkSpacer :content-max="700" :margin-min="16" :margin-max="32">
-	<FormSuspense :p="init">
-		<FormFolder class="_formBlock">
-			<template #icon><i class="ti ti-brand-twitter"></i></template>
-			<template #label>Twitter</template>
-			<template #suffix>{{ enableTwitterIntegration ? i18n.ts.enabled : i18n.ts.disabled }}</template>
-			<XTwitter/>
-		</FormFolder>
-		<FormFolder class="_formBlock">
-			<template #icon><i class="ti ti-brand-github"></i></template>
-			<template #label>GitHub</template>
-			<template #suffix>{{ enableGithubIntegration ? i18n.ts.enabled : i18n.ts.disabled }}</template>
-			<XGithub/>
-		</FormFolder>
-		<FormFolder class="_formBlock">
-			<template #icon><i class="ti ti-brand-discord"></i></template>
-			<template #label>Discord</template>
-			<template #suffix>{{ enableDiscordIntegration ? i18n.ts.enabled : i18n.ts.disabled }}</template>
-			<XDiscord/>
-		</FormFolder>
-	</FormSuspense>
-</MkSpacer></MkStickyContainer>
+	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32">
+		<FormSuspense :p="init">
+			<div class="_autoGap">
+				<FormFolder>
+					<template #icon><i class="ti ti-brand-twitter"></i></template>
+					<template #label>Twitter</template>
+					<template #suffix>{{ enableTwitterIntegration ? i18n.ts.enabled : i18n.ts.disabled }}</template>
+					<XTwitter/>
+				</FormFolder>
+				<FormFolder>
+					<template #icon><i class="ti ti-brand-github"></i></template>
+					<template #label>GitHub</template>
+					<template #suffix>{{ enableGithubIntegration ? i18n.ts.enabled : i18n.ts.disabled }}</template>
+					<XGithub/>
+				</FormFolder>
+				<FormFolder>
+					<template #icon><i class="ti ti-brand-discord"></i></template>
+					<template #label>Discord</template>
+					<template #suffix>{{ enableDiscordIntegration ? i18n.ts.enabled : i18n.ts.disabled }}</template>
+					<XDiscord/>
+				</FormFolder>
+			</div>
+		</FormSuspense>
+	</MkSpacer>
+</MkStickyContainer>
 </template>
 
 <script lang="ts" setup>
diff --git a/packages/frontend/src/pages/admin/object-storage.vue b/packages/frontend/src/pages/admin/object-storage.vue
index f2ab30eaa5..7effa16542 100644
--- a/packages/frontend/src/pages/admin/object-storage.vue
+++ b/packages/frontend/src/pages/admin/object-storage.vue
@@ -3,62 +3,62 @@
 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32">
 		<FormSuspense :p="init">
-			<div class="_formRoot">
-				<FormSwitch v-model="useObjectStorage" class="_formBlock">{{ i18n.ts.useObjectStorage }}</FormSwitch>
+			<div class="_autoGap">
+				<FormSwitch v-model="useObjectStorage">{{ i18n.ts.useObjectStorage }}</FormSwitch>
 
 				<template v-if="useObjectStorage">
-					<FormInput v-model="objectStorageBaseUrl" class="_formBlock">
+					<FormInput v-model="objectStorageBaseUrl">
 						<template #label>{{ i18n.ts.objectStorageBaseUrl }}</template>
 						<template #caption>{{ i18n.ts.objectStorageBaseUrlDesc }}</template>
 					</FormInput>
 
-					<FormInput v-model="objectStorageBucket" class="_formBlock">
+					<FormInput v-model="objectStorageBucket">
 						<template #label>{{ i18n.ts.objectStorageBucket }}</template>
 						<template #caption>{{ i18n.ts.objectStorageBucketDesc }}</template>
 					</FormInput>
 
-					<FormInput v-model="objectStoragePrefix" class="_formBlock">
+					<FormInput v-model="objectStoragePrefix">
 						<template #label>{{ i18n.ts.objectStoragePrefix }}</template>
 						<template #caption>{{ i18n.ts.objectStoragePrefixDesc }}</template>
 					</FormInput>
 
-					<FormInput v-model="objectStorageEndpoint" class="_formBlock">
+					<FormInput v-model="objectStorageEndpoint">
 						<template #label>{{ i18n.ts.objectStorageEndpoint }}</template>
 						<template #caption>{{ i18n.ts.objectStorageEndpointDesc }}</template>
 					</FormInput>
 
-					<FormInput v-model="objectStorageRegion" class="_formBlock">
+					<FormInput v-model="objectStorageRegion">
 						<template #label>{{ i18n.ts.objectStorageRegion }}</template>
 						<template #caption>{{ i18n.ts.objectStorageRegionDesc }}</template>
 					</FormInput>
 
 					<FormSplit :min-width="280">
-						<FormInput v-model="objectStorageAccessKey" class="_formBlock">
+						<FormInput v-model="objectStorageAccessKey">
 							<template #prefix><i class="ti ti-key"></i></template>
 							<template #label>Access key</template>
 						</FormInput>
 
-						<FormInput v-model="objectStorageSecretKey" class="_formBlock">
+						<FormInput v-model="objectStorageSecretKey">
 							<template #prefix><i class="ti ti-key"></i></template>
 							<template #label>Secret key</template>
 						</FormInput>
 					</FormSplit>
 
-					<FormSwitch v-model="objectStorageUseSSL" class="_formBlock">
+					<FormSwitch v-model="objectStorageUseSSL">
 						<template #label>{{ i18n.ts.objectStorageUseSSL }}</template>
 						<template #caption>{{ i18n.ts.objectStorageUseSSLDesc }}</template>
 					</FormSwitch>
 
-					<FormSwitch v-model="objectStorageUseProxy" class="_formBlock">
+					<FormSwitch v-model="objectStorageUseProxy">
 						<template #label>{{ i18n.ts.objectStorageUseProxy }}</template>
 						<template #caption>{{ i18n.ts.objectStorageUseProxyDesc }}</template>
 					</FormSwitch>
 
-					<FormSwitch v-model="objectStorageSetPublicRead" class="_formBlock">
+					<FormSwitch v-model="objectStorageSetPublicRead">
 						<template #label>{{ i18n.ts.objectStorageSetPublicRead }}</template>
 					</FormSwitch>
 
-					<FormSwitch v-model="objectStorageS3ForcePathStyle" class="_formBlock">
+					<FormSwitch v-model="objectStorageS3ForcePathStyle">
 						<template #label>s3ForcePathStyle</template>
 					</FormSwitch>
 				</template>
diff --git a/packages/frontend/src/pages/admin/proxy-account.vue b/packages/frontend/src/pages/admin/proxy-account.vue
index 5d0d67980e..36a2718081 100644
--- a/packages/frontend/src/pages/admin/proxy-account.vue
+++ b/packages/frontend/src/pages/admin/proxy-account.vue
@@ -1,16 +1,18 @@
-<template><MkStickyContainer>
+<template>
+<MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
-		<MkSpacer :content-max="700" :margin-min="16" :margin-max="32">
-	<FormSuspense :p="init">
-		<MkInfo class="_formBlock">{{ i18n.ts.proxyAccountDescription }}</MkInfo>
-		<MkKeyValue class="_formBlock">
-			<template #key>{{ i18n.ts.proxyAccount }}</template>
-			<template #value>{{ proxyAccount ? `@${proxyAccount.username}` : i18n.ts.none }}</template>
-		</MkKeyValue>
-
-		<FormButton primary class="_formBlock" @click="chooseProxyAccount">{{ i18n.ts.selectAccount }}</FormButton>
-	</FormSuspense>
-</MkSpacer></MkStickyContainer>
+	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32">
+		<FormSuspense :p="init">
+			<MkInfo>{{ i18n.ts.proxyAccountDescription }}</MkInfo>
+			<MkKeyValue>
+				<template #key>{{ i18n.ts.proxyAccount }}</template>
+				<template #value>{{ proxyAccount ? `@${proxyAccount.username}` : i18n.ts.none }}</template>
+			</MkKeyValue>
+
+			<FormButton primary @click="chooseProxyAccount">{{ i18n.ts.selectAccount }}</FormButton>
+		</FormSuspense>
+	</MkSpacer>
+</MkStickyContainer>
 </template>
 
 <script lang="ts" setup>
diff --git a/packages/frontend/src/pages/admin/security.vue b/packages/frontend/src/pages/admin/security.vue
index 2682bda337..6bd26e8325 100644
--- a/packages/frontend/src/pages/admin/security.vue
+++ b/packages/frontend/src/pages/admin/security.vue
@@ -3,8 +3,8 @@
 	<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="700" :margin-min="16" :margin-max="32">
 		<FormSuspense :p="init">
-			<div class="_formRoot">
-				<FormFolder class="_formBlock">
+			<div class="_autoGap">
+				<FormFolder>
 					<template #icon><i class="ti ti-shield"></i></template>
 					<template #label>{{ i18n.ts.botProtection }}</template>
 					<template v-if="enableHcaptcha" #suffix>hCaptcha</template>
@@ -15,7 +15,7 @@
 					<XBotProtection/>
 				</FormFolder>
 
-				<FormFolder class="_formBlock">
+				<FormFolder>
 					<template #icon><i class="ti ti-eye-off"></i></template>
 					<template #label>{{ i18n.ts.sensitiveMediaDetection }}</template>
 					<template v-if="sensitiveMediaDetection === 'all'" #suffix>{{ i18n.ts.all }}</template>
@@ -23,76 +23,76 @@
 					<template v-else-if="sensitiveMediaDetection === 'remote'" #suffix>{{ i18n.ts.remoteOnly }}</template>
 					<template v-else #suffix>{{ i18n.ts.none }}</template>
 
-					<div class="_formRoot">
-						<span class="_formBlock">{{ i18n.ts._sensitiveMediaDetection.description }}</span>
+					<div class="_autoGap">
+						<span>{{ i18n.ts._sensitiveMediaDetection.description }}</span>
 
-						<FormRadios v-model="sensitiveMediaDetection" class="_formBlock">
+						<FormRadios v-model="sensitiveMediaDetection">
 							<option value="none">{{ i18n.ts.none }}</option>
 							<option value="all">{{ i18n.ts.all }}</option>
 							<option value="local">{{ i18n.ts.localOnly }}</option>
 							<option value="remote">{{ i18n.ts.remoteOnly }}</option>
 						</FormRadios>
 
-						<FormRange v-model="sensitiveMediaDetectionSensitivity" :min="0" :max="4" :step="1" :text-converter="(v) => `${v + 1}`" class="_formBlock">
+						<FormRange v-model="sensitiveMediaDetectionSensitivity" :min="0" :max="4" :step="1" :text-converter="(v) => `${v + 1}`">
 							<template #label>{{ i18n.ts._sensitiveMediaDetection.sensitivity }}</template>
 							<template #caption>{{ i18n.ts._sensitiveMediaDetection.sensitivityDescription }}</template>
 						</FormRange>
 
-						<FormSwitch v-model="enableSensitiveMediaDetectionForVideos" class="_formBlock">
+						<FormSwitch v-model="enableSensitiveMediaDetectionForVideos">
 							<template #label>{{ i18n.ts._sensitiveMediaDetection.analyzeVideos }}<span class="_beta">{{ i18n.ts.beta }}</span></template>
 							<template #caption>{{ i18n.ts._sensitiveMediaDetection.analyzeVideosDescription }}</template>
 						</FormSwitch>
 
-						<FormSwitch v-model="setSensitiveFlagAutomatically" class="_formBlock">
+						<FormSwitch v-model="setSensitiveFlagAutomatically">
 							<template #label>{{ i18n.ts._sensitiveMediaDetection.setSensitiveFlagAutomatically }} ({{ i18n.ts.notRecommended }})</template>
 							<template #caption>{{ i18n.ts._sensitiveMediaDetection.setSensitiveFlagAutomaticallyDescription }}</template>
 						</FormSwitch>
 
 						<!-- 現状 false positive が多すぎて実用に耐えない
-						<FormSwitch v-model="disallowUploadWhenPredictedAsPorn" class="_formBlock">
+						<FormSwitch v-model="disallowUploadWhenPredictedAsPorn">
 							<template #label>{{ i18n.ts._sensitiveMediaDetection.disallowUploadWhenPredictedAsPorn }}</template>
 						</FormSwitch>
 						-->
 
-						<FormButton primary class="_formBlock" @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton>
+						<FormButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton>
 					</div>
 				</FormFolder>
 
-				<FormFolder class="_formBlock">
+				<FormFolder>
 					<template #label>Active Email Validation</template>
 					<template v-if="enableActiveEmailValidation" #suffix>Enabled</template>
 					<template v-else #suffix>Disabled</template>
 
-					<div class="_formRoot">
-						<span class="_formBlock">{{ i18n.ts.activeEmailValidationDescription }}</span>
-						<FormSwitch v-model="enableActiveEmailValidation" class="_formBlock" @update:model-value="save">
+					<div class="_autoGap">
+						<span>{{ i18n.ts.activeEmailValidationDescription }}</span>
+						<FormSwitch v-model="enableActiveEmailValidation" @update:model-value="save">
 							<template #label>Enable</template>
 						</FormSwitch>
 					</div>
 				</FormFolder>
 
-				<FormFolder class="_formBlock">
+				<FormFolder>
 					<template #label>Log IP address</template>
 					<template v-if="enableIpLogging" #suffix>Enabled</template>
 					<template v-else #suffix>Disabled</template>
 
-					<div class="_formRoot">
-						<FormSwitch v-model="enableIpLogging" class="_formBlock" @update:model-value="save">
+					<div class="_autoGap">
+						<FormSwitch v-model="enableIpLogging" @update:model-value="save">
 							<template #label>Enable</template>
 						</FormSwitch>
 					</div>
 				</FormFolder>
 
-				<FormFolder class="_formBlock">
+				<FormFolder>
 					<template #label>Summaly Proxy</template>
 
-					<div class="_formRoot">
-						<FormInput v-model="summalyProxy" class="_formBlock">
+					<div class="_autoGap">
+						<FormInput v-model="summalyProxy">
 							<template #prefix><i class="ti ti-link"></i></template>
 							<template #label>Summaly Proxy URL</template>
 						</FormInput>
 
-						<FormButton primary class="_formBlock" @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton>
+						<FormButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</FormButton>
 					</div>
 				</FormFolder>
 			</div>
diff --git a/packages/frontend/src/pages/admin/settings.vue b/packages/frontend/src/pages/admin/settings.vue
index 460eb92694..01c7b51e39 100644
--- a/packages/frontend/src/pages/admin/settings.vue
+++ b/packages/frontend/src/pages/admin/settings.vue
@@ -4,141 +4,153 @@
 		<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template>
 		<MkSpacer :content-max="700" :margin-min="16" :margin-max="32">
 			<FormSuspense :p="init">
-				<div class="_formRoot">
-					<FormInput v-model="name" class="_formBlock">
+				<div class="_autoGap">
+					<FormInput v-model="name">
 						<template #label>{{ i18n.ts.instanceName }}</template>
 					</FormInput>
 
-					<FormTextarea v-model="description" class="_formBlock">
+					<FormTextarea v-model="description">
 						<template #label>{{ i18n.ts.instanceDescription }}</template>
 					</FormTextarea>
 
-					<FormInput v-model="tosUrl" class="_formBlock">
+					<FormInput v-model="tosUrl">
 						<template #prefix><i class="ti ti-link"></i></template>
 						<template #label>{{ i18n.ts.tosUrl }}</template>
 					</FormInput>
 
 					<FormSplit :min-width="300">
-						<FormInput v-model="maintainerName" class="_formBlock">
+						<FormInput v-model="maintainerName">
 							<template #label>{{ i18n.ts.maintainerName }}</template>
 						</FormInput>
 
-						<FormInput v-model="maintainerEmail" type="email" class="_formBlock">
+						<FormInput v-model="maintainerEmail" type="email">
 							<template #prefix><i class="ti ti-mail"></i></template>
 							<template #label>{{ i18n.ts.maintainerEmail }}</template>
 						</FormInput>
 					</FormSplit>
 
-					<FormTextarea v-model="pinnedUsers" class="_formBlock">
+					<FormTextarea v-model="pinnedUsers">
 						<template #label>{{ i18n.ts.pinnedUsers }}</template>
 						<template #caption>{{ i18n.ts.pinnedUsersDescription }}</template>
 					</FormTextarea>
 
 					<FormSection>
-						<FormSwitch v-model="enableRegistration" class="_formBlock">
-							<template #label>{{ i18n.ts.enableRegistration }}</template>
-						</FormSwitch>
-
-						<FormSwitch v-model="emailRequiredForSignup" class="_formBlock">
-							<template #label>{{ i18n.ts.emailRequiredForSignup }}</template>
-						</FormSwitch>
+						<div class="_autoGap_half">
+							<FormSwitch v-model="enableRegistration">
+								<template #label>{{ i18n.ts.enableRegistration }}</template>
+							</FormSwitch>
+
+							<FormSwitch v-model="emailRequiredForSignup">
+								<template #label>{{ i18n.ts.emailRequiredForSignup }}</template>
+							</FormSwitch>
+						</div>
 					</FormSection>
 
 					<FormSection>
-						<FormSwitch v-model="enableLocalTimeline" class="_formBlock">{{ i18n.ts.enableLocalTimeline }}</FormSwitch>
-						<FormSwitch v-model="enableGlobalTimeline" class="_formBlock">{{ i18n.ts.enableGlobalTimeline }}</FormSwitch>
-						<FormInfo class="_formBlock">{{ i18n.ts.disablingTimelinesInfo }}</FormInfo>
+						<div class="_autoGap_half">
+							<FormSwitch v-model="enableLocalTimeline">{{ i18n.ts.enableLocalTimeline }}</FormSwitch>
+							<FormSwitch v-model="enableGlobalTimeline">{{ i18n.ts.enableGlobalTimeline }}</FormSwitch>
+							<FormInfo>{{ i18n.ts.disablingTimelinesInfo }}</FormInfo>
+						</div>
 					</FormSection>
 
 					<FormSection>
 						<template #label>{{ i18n.ts.theme }}</template>
 
-						<FormInput v-model="iconUrl" class="_formBlock">
-							<template #prefix><i class="ti ti-link"></i></template>
-							<template #label>{{ i18n.ts.iconUrl }}</template>
-						</FormInput>
+						<div class="_autoGap">
+							<FormInput v-model="iconUrl">
+								<template #prefix><i class="ti ti-link"></i></template>
+								<template #label>{{ i18n.ts.iconUrl }}</template>
+							</FormInput>
 
-						<FormInput v-model="bannerUrl" class="_formBlock">
-							<template #prefix><i class="ti ti-link"></i></template>
-							<template #label>{{ i18n.ts.bannerUrl }}</template>
-						</FormInput>
+							<FormInput v-model="bannerUrl">
+								<template #prefix><i class="ti ti-link"></i></template>
+								<template #label>{{ i18n.ts.bannerUrl }}</template>
+							</FormInput>
 
-						<FormInput v-model="backgroundImageUrl" class="_formBlock">
-							<template #prefix><i class="ti ti-link"></i></template>
-							<template #label>{{ i18n.ts.backgroundImageUrl }}</template>
-						</FormInput>
+							<FormInput v-model="backgroundImageUrl">
+								<template #prefix><i class="ti ti-link"></i></template>
+								<template #label>{{ i18n.ts.backgroundImageUrl }}</template>
+							</FormInput>
 
-						<FormInput v-model="themeColor" class="_formBlock">
-							<template #prefix><i class="ti ti-palette"></i></template>
-							<template #label>{{ i18n.ts.themeColor }}</template>
-							<template #caption>#RRGGBB</template>
-						</FormInput>
+							<FormInput v-model="themeColor">
+								<template #prefix><i class="ti ti-palette"></i></template>
+								<template #label>{{ i18n.ts.themeColor }}</template>
+								<template #caption>#RRGGBB</template>
+							</FormInput>
 
-						<FormTextarea v-model="defaultLightTheme" class="_formBlock">
-							<template #label>{{ i18n.ts.instanceDefaultLightTheme }}</template>
-							<template #caption>{{ i18n.ts.instanceDefaultThemeDescription }}</template>
-						</FormTextarea>
+							<FormTextarea v-model="defaultLightTheme">
+								<template #label>{{ i18n.ts.instanceDefaultLightTheme }}</template>
+								<template #caption>{{ i18n.ts.instanceDefaultThemeDescription }}</template>
+							</FormTextarea>
 
-						<FormTextarea v-model="defaultDarkTheme" class="_formBlock">
-							<template #label>{{ i18n.ts.instanceDefaultDarkTheme }}</template>
-							<template #caption>{{ i18n.ts.instanceDefaultThemeDescription }}</template>
-						</FormTextarea>
+							<FormTextarea v-model="defaultDarkTheme">
+								<template #label>{{ i18n.ts.instanceDefaultDarkTheme }}</template>
+								<template #caption>{{ i18n.ts.instanceDefaultThemeDescription }}</template>
+							</FormTextarea>
+						</div>
 					</FormSection>
 
 					<FormSection>
 						<template #label>{{ i18n.ts.files }}</template>
 
-						<FormSwitch v-model="cacheRemoteFiles" class="_formBlock">
-							<template #label>{{ i18n.ts.cacheRemoteFiles }}</template>
-							<template #caption>{{ i18n.ts.cacheRemoteFilesDescription }}</template>
-						</FormSwitch>
-
-						<FormSplit :min-width="280">
-							<FormInput v-model="localDriveCapacityMb" type="number" class="_formBlock">
-								<template #label>{{ i18n.ts.driveCapacityPerLocalAccount }}</template>
-								<template #suffix>MB</template>
-								<template #caption>{{ i18n.ts.inMb }}</template>
-							</FormInput>
-
-							<FormInput v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles" class="_formBlock">
-								<template #label>{{ i18n.ts.driveCapacityPerRemoteAccount }}</template>
-								<template #suffix>MB</template>
-								<template #caption>{{ i18n.ts.inMb }}</template>
-							</FormInput>
-						</FormSplit>
+						<div class="_autoGap">
+							<FormSwitch v-model="cacheRemoteFiles">
+								<template #label>{{ i18n.ts.cacheRemoteFiles }}</template>
+								<template #caption>{{ i18n.ts.cacheRemoteFilesDescription }}</template>
+							</FormSwitch>
+
+							<FormSplit :min-width="280">
+								<FormInput v-model="localDriveCapacityMb" type="number">
+									<template #label>{{ i18n.ts.driveCapacityPerLocalAccount }}</template>
+									<template #suffix>MB</template>
+									<template #caption>{{ i18n.ts.inMb }}</template>
+								</FormInput>
+
+								<FormInput v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles">
+									<template #label>{{ i18n.ts.driveCapacityPerRemoteAccount }}</template>
+									<template #suffix>MB</template>
+									<template #caption>{{ i18n.ts.inMb }}</template>
+								</FormInput>
+							</FormSplit>
+						</div>
 					</FormSection>
 
 					<FormSection>
 						<template #label>ServiceWorker</template>
 
-						<FormSwitch v-model="enableServiceWorker" class="_formBlock">
-							<template #label>{{ i18n.ts.enableServiceworker }}</template>
-							<template #caption>{{ i18n.ts.serviceworkerInfo }}</template>
-						</FormSwitch>
-
-						<template v-if="enableServiceWorker">
-							<FormInput v-model="swPublicKey" class="_formBlock">
-								<template #prefix><i class="ti ti-key"></i></template>
-								<template #label>Public key</template>
-							</FormInput>
-
-							<FormInput v-model="swPrivateKey" class="_formBlock">
-								<template #prefix><i class="ti ti-key"></i></template>
-								<template #label>Private key</template>
-							</FormInput>
-						</template>
+						<div class="_autoGap">
+							<FormSwitch v-model="enableServiceWorker">
+								<template #label>{{ i18n.ts.enableServiceworker }}</template>
+								<template #caption>{{ i18n.ts.serviceworkerInfo }}</template>
+							</FormSwitch>
+
+							<template v-if="enableServiceWorker">
+								<FormInput v-model="swPublicKey">
+									<template #prefix><i class="ti ti-key"></i></template>
+									<template #label>Public key</template>
+								</FormInput>
+
+								<FormInput v-model="swPrivateKey">
+									<template #prefix><i class="ti ti-key"></i></template>
+									<template #label>Private key</template>
+								</FormInput>
+							</template>
+						</div>
 					</FormSection>
 
 					<FormSection>
 						<template #label>DeepL Translation</template>
 
-						<FormInput v-model="deeplAuthKey" class="_formBlock">
-							<template #prefix><i class="ti ti-key"></i></template>
-							<template #label>DeepL Auth Key</template>
-						</FormInput>
-						<FormSwitch v-model="deeplIsPro" class="_formBlock">
-							<template #label>Pro account</template>
-						</FormSwitch>
+						<div class="_autoGap">
+							<FormInput v-model="deeplAuthKey">
+								<template #prefix><i class="ti ti-key"></i></template>
+								<template #label>DeepL Auth Key</template>
+							</FormInput>
+							<FormSwitch v-model="deeplIsPro">
+								<template #label>Pro account</template>
+							</FormSwitch>
+						</div>
 					</FormSection>
 				</div>
 			</FormSuspense>
diff --git a/packages/frontend/src/pages/api-console.vue b/packages/frontend/src/pages/api-console.vue
index 1d5339b44c..d62e6aabd1 100644
--- a/packages/frontend/src/pages/api-console.vue
+++ b/packages/frontend/src/pages/api-console.vue
@@ -2,23 +2,23 @@
 <MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="700">
-		<div class="_formRoot">
-			<div class="_formBlock">
-				<MkInput v-model="endpoint" :datalist="endpoints" class="_formBlock" @update:model-value="onEndpointChange()">
+		<div class="_autoGap">
+			<div class="_autoGap">
+				<MkInput v-model="endpoint" :datalist="endpoints" @update:model-value="onEndpointChange()">
 					<template #label>Endpoint</template>
 				</MkInput>
-				<MkTextarea v-model="body" class="_formBlock" code>
+				<MkTextarea v-model="body" code>
 					<template #label>Params (JSON or JSON5)</template>
 				</MkTextarea>
-				<MkSwitch v-model="withCredential" class="_formBlock">
+				<MkSwitch v-model="withCredential">
 					With credential
 				</MkSwitch>
-				<MkButton class="_formBlock" primary :disabled="sending" @click="send">
+				<MkButton primary :disabled="sending" @click="send">
 					<template v-if="sending"><MkEllipsis/></template>
 					<template v-else><i class="ti ti-send"></i> Send</template>
 				</MkButton>
 			</div>
-			<div v-if="res" class="_formBlock">
+			<div v-if="res">
 				<MkTextarea v-model="res" code readonly tall>
 					<template #label>Response</template>
 				</MkTextarea>
diff --git a/packages/frontend/src/pages/channel-editor.vue b/packages/frontend/src/pages/channel-editor.vue
index 5ae7e63f99..091573b876 100644
--- a/packages/frontend/src/pages/channel-editor.vue
+++ b/packages/frontend/src/pages/channel-editor.vue
@@ -2,12 +2,12 @@
 <MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="700">
-		<div class="_formRoot">
-			<MkInput v-model="name" class="_formBlock">
+		<div class="_autoGap">
+			<MkInput v-model="name">
 				<template #label>{{ i18n.ts.name }}</template>
 			</MkInput>
 
-			<MkTextarea v-model="description" class="_formBlock">
+			<MkTextarea v-model="description">
 				<template #label>{{ i18n.ts.description }}</template>
 			</MkTextarea>
 
@@ -18,7 +18,7 @@
 					<MkButton @click="removeBannerImage()"><i class="ti ti-trash"></i> {{ i18n.ts._channel.removeBanner }}</MkButton>
 				</div>
 			</div>
-			<div class="_formBlock">
+			<div>
 				<MkButton primary @click="save()"><i class="ti ti-device-floppy"></i> {{ channelId ? i18n.ts.save : i18n.ts.create }}</MkButton>
 			</div>
 		</div>
diff --git a/packages/frontend/src/pages/channel.vue b/packages/frontend/src/pages/channel.vue
index f271bb270f..96340a36b9 100644
--- a/packages/frontend/src/pages/channel.vue
+++ b/packages/frontend/src/pages/channel.vue
@@ -3,7 +3,7 @@
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="700">
 		<div v-if="channel">
-			<div class="wpgynlbz _panel _gap" :class="{ hide: !showBanner }">
+			<div class="wpgynlbz _panel _margin" :class="{ hide: !showBanner }">
 				<XChannelFollowButton :channel="channel" :full="true" class="subscribe"/>
 				<button class="_button toggle" @click="() => showBanner = !showBanner">
 					<template v-if="showBanner"><i class="ti ti-chevron-up"></i></template>
@@ -23,9 +23,9 @@
 				</div>
 			</div>
 
-			<XPostForm v-if="$i" :channel="channel" class="post-form _panel _gap" fixed/>
+			<XPostForm v-if="$i" :channel="channel" class="post-form _panel _margin" fixed/>
 
-			<XTimeline :key="channelId" class="_gap" src="channel" :channel="channelId" @before="before" @after="after"/>
+			<XTimeline :key="channelId" class="_margin" src="channel" :channel="channelId" @before="before" @after="after"/>
 		</div>
 	</MkSpacer>
 </MkStickyContainer>
diff --git a/packages/frontend/src/pages/channels.vue b/packages/frontend/src/pages/channels.vue
index 34e9dac196..cc8375f636 100644
--- a/packages/frontend/src/pages/channels.vue
+++ b/packages/frontend/src/pages/channels.vue
@@ -4,18 +4,18 @@
 	<MkSpacer :content-max="700">
 		<div v-if="tab === 'featured'" class="_content grwlizim featured">
 			<MkPagination v-slot="{items}" :pagination="featuredPagination">
-				<MkChannelPreview v-for="channel in items" :key="channel.id" class="_gap" :channel="channel"/>
+				<MkChannelPreview v-for="channel in items" :key="channel.id" class="_margin" :channel="channel"/>
 			</MkPagination>
 		</div>
 		<div v-else-if="tab === 'following'" class="_content grwlizim following">
 			<MkPagination v-slot="{items}" :pagination="followingPagination">
-				<MkChannelPreview v-for="channel in items" :key="channel.id" class="_gap" :channel="channel"/>
+				<MkChannelPreview v-for="channel in items" :key="channel.id" class="_margin" :channel="channel"/>
 			</MkPagination>
 		</div>
 		<div v-else-if="tab === 'owned'" class="_content grwlizim owned">
 			<MkButton class="new" @click="create()"><i class="ti ti-plus"></i></MkButton>
 			<MkPagination v-slot="{items}" :pagination="ownedPagination">
-				<MkChannelPreview v-for="channel in items" :key="channel.id" class="_gap" :channel="channel"/>
+				<MkChannelPreview v-for="channel in items" :key="channel.id" class="_margin" :channel="channel"/>
 			</MkPagination>
 		</div>
 	</MkSpacer>
diff --git a/packages/frontend/src/pages/explore.users.vue b/packages/frontend/src/pages/explore.users.vue
index 611ca0f003..f1bb0cc62e 100644
--- a/packages/frontend/src/pages/explore.users.vue
+++ b/packages/frontend/src/pages/explore.users.vue
@@ -6,26 +6,26 @@
 	</MkTab>
 	<div v-if="origin === 'local'">
 		<template v-if="tag == null">
-			<MkFolder class="_gap" persist-key="explore-pinned-users">
+			<MkFolder class="_margin" persist-key="explore-pinned-users">
 				<template #header><i class="fas fa-bookmark ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.pinnedUsers }}</template>
 				<XUserList :pagination="pinnedUsers"/>
 			</MkFolder>
-			<MkFolder class="_gap" persist-key="explore-popular-users">
+			<MkFolder class="_margin" persist-key="explore-popular-users">
 				<template #header><i class="fas fa-chart-line ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.popularUsers }}</template>
 				<XUserList :pagination="popularUsers"/>
 			</MkFolder>
-			<MkFolder class="_gap" persist-key="explore-recently-updated-users">
+			<MkFolder class="_margin" persist-key="explore-recently-updated-users">
 				<template #header><i class="fas fa-comment-alt ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.recentlyUpdatedUsers }}</template>
 				<XUserList :pagination="recentlyUpdatedUsers"/>
 			</MkFolder>
-			<MkFolder class="_gap" persist-key="explore-recently-registered-users">
+			<MkFolder class="_margin" persist-key="explore-recently-registered-users">
 				<template #header><i class="ti ti-plus ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.recentlyRegisteredUsers }}</template>
 				<XUserList :pagination="recentlyRegisteredUsers"/>
 			</MkFolder>
 		</template>
 	</div>
 	<div v-else>
-		<MkFolder ref="tagsEl" :foldable="true" :expanded="false" class="_gap">
+		<MkFolder ref="tagsEl" :foldable="true" :expanded="false" class="_margin">
 			<template #header><i class="ti ti-hash ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.popularTags }}</template>
 
 			<div class="vxjfqztj">
@@ -34,21 +34,21 @@
 			</div>
 		</MkFolder>
 
-		<MkFolder v-if="tag != null" :key="`${tag}`" class="_gap">
+		<MkFolder v-if="tag != null" :key="`${tag}`" class="_margin">
 			<template #header><i class="ti ti-hash ti-fw" style="margin-right: 0.5em;"></i>{{ tag }}</template>
 			<XUserList :pagination="tagUsers"/>
 		</MkFolder>
 
 		<template v-if="tag == null">
-			<MkFolder class="_gap">
+			<MkFolder class="_margin">
 				<template #header><i class="fas fa-chart-line ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.popularUsers }}</template>
 				<XUserList :pagination="popularUsersF"/>
 			</MkFolder>
-			<MkFolder class="_gap">
+			<MkFolder class="_margin">
 				<template #header><i class="fas fa-comment-alt ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.recentlyUpdatedUsers }}</template>
 				<XUserList :pagination="recentlyUpdatedUsersF"/>
 			</MkFolder>
-			<MkFolder class="_gap">
+			<MkFolder class="_margin">
 				<template #header><i class="fas fa-rocket ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.recentlyDiscoveredUsers }}</template>
 				<XUserList :pagination="recentlyRegisteredUsersF"/>
 			</MkFolder>
diff --git a/packages/frontend/src/pages/explore.vue b/packages/frontend/src/pages/explore.vue
index 4494f6154d..cb62af469a 100644
--- a/packages/frontend/src/pages/explore.vue
+++ b/packages/frontend/src/pages/explore.vue
@@ -11,18 +11,18 @@
 		<div v-else-if="tab === 'search'">
 			<MkSpacer :content-max="1200">
 				<div>
-					<MkInput v-model="searchQuery" :debounce="true" type="search" class="_formBlock">
+					<MkInput v-model="searchQuery" :debounce="true" type="search">
 						<template #prefix><i class="ti ti-search"></i></template>
 						<template #label>{{ i18n.ts.searchUser }}</template>
 					</MkInput>
-					<MkRadios v-model="searchOrigin" class="_formBlock">
+					<MkRadios v-model="searchOrigin">
 						<option value="combined">{{ i18n.ts.all }}</option>
 						<option value="local">{{ i18n.ts.local }}</option>
 						<option value="remote">{{ i18n.ts.remote }}</option>
 					</MkRadios>
 				</div>
 
-				<XUserList v-if="searchQuery" ref="searchEl" class="_gap" :pagination="searchPagination"/>
+				<XUserList v-if="searchQuery" ref="searchEl" class="_margin" :pagination="searchPagination"/>
 			</MkSpacer>
 		</div>
 	</div>
diff --git a/packages/frontend/src/pages/flash/flash-edit.vue b/packages/frontend/src/pages/flash/flash-edit.vue
index b2eba292f2..f890564884 100644
--- a/packages/frontend/src/pages/flash/flash-edit.vue
+++ b/packages/frontend/src/pages/flash/flash-edit.vue
@@ -2,18 +2,20 @@
 <MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="700">
-		<MkInput v-model="title" class="_formBlock">
-			<template #label>{{ i18n.ts._play.title }}</template>
-		</MkInput>
-		<MkTextarea v-model="summary" class="_formBlock">
-			<template #label>{{ i18n.ts._play.summary }}</template>
-		</MkTextarea>
-		<MkTextarea v-model="script" class="_formBlock _monospace" tall spellcheck="false">
-			<template #label>{{ i18n.ts._play.script }}</template>
-		</MkTextarea>
-		<div style="display: flex; gap: var(--margin); flex-wrap: wrap;">
-			<MkButton primary @click="save"><i class="ti ti-check"></i> {{ i18n.ts.save }}</MkButton>
-			<MkButton @click="show"><i class="ti ti-eye"></i> {{ i18n.ts.show }}</MkButton>
+		<div class="_autoGap">
+			<MkInput v-model="title">
+				<template #label>{{ i18n.ts._play.title }}</template>
+			</MkInput>
+			<MkTextarea v-model="summary">
+				<template #label>{{ i18n.ts._play.summary }}</template>
+			</MkTextarea>
+			<MkTextarea v-model="script" class="_monospace" tall spellcheck="false">
+				<template #label>{{ i18n.ts._play.script }}</template>
+			</MkTextarea>
+			<div style="display: flex; gap: var(--margin); flex-wrap: wrap;">
+				<MkButton primary @click="save"><i class="ti ti-check"></i> {{ i18n.ts.save }}</MkButton>
+				<MkButton @click="show"><i class="ti ti-eye"></i> {{ i18n.ts.show }}</MkButton>
+			</div>
 		</div>
 	</MkSpacer>
 </MkStickyContainer>
diff --git a/packages/frontend/src/pages/flash/flash.vue b/packages/frontend/src/pages/flash/flash.vue
index 9495206c54..caaa192bbe 100644
--- a/packages/frontend/src/pages/flash/flash.vue
+++ b/packages/frontend/src/pages/flash/flash.vue
@@ -27,7 +27,7 @@
 						</div>
 					</div>
 				</Transition>
-				<FormFolder class="_formBlock">
+				<FormFolder class="_margin">
 					<template #icon><i class="ti ti-code"></i></template>
 					<template #label>{{ i18n.ts._play.viewSource }}</template>
 
diff --git a/packages/frontend/src/pages/gallery/index.vue b/packages/frontend/src/pages/gallery/index.vue
index 24a634bab5..b29a6a5310 100644
--- a/packages/frontend/src/pages/gallery/index.vue
+++ b/packages/frontend/src/pages/gallery/index.vue
@@ -4,7 +4,7 @@
 	<MkSpacer :content-max="1400">
 		<div class="_root">
 			<div v-if="tab === 'explore'">
-				<MkFolder class="_gap">
+				<MkFolder class="_margin">
 					<template #header><i class="ti ti-clock"></i>{{ i18n.ts.recentPosts }}</template>
 					<MkPagination v-slot="{items}" :pagination="recentPostsPagination" :disable-auto-load="true">
 						<div class="vfpdbgtk">
@@ -12,7 +12,7 @@
 						</div>
 					</MkPagination>
 				</MkFolder>
-				<MkFolder class="_gap">
+				<MkFolder class="_margin">
 					<template #header><i class="ti ti-comet"></i>{{ i18n.ts.popularPosts }}</template>
 					<MkPagination v-slot="{items}" :pagination="popularPostsPagination" :disable-auto-load="true">
 						<div class="vfpdbgtk">
diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue
index 55771b0e30..5fc341198e 100644
--- a/packages/frontend/src/pages/instance-info.vue
+++ b/packages/frontend/src/pages/instance-info.vue
@@ -2,23 +2,25 @@
 <MkStickyContainer>
 	<template #header><MkPageHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer v-if="instance" :content-max="600" :margin-min="16" :margin-max="32">
-		<div v-if="tab === 'overview'" class="_formRoot">
+		<div v-if="tab === 'overview'" class="_autoGap">
 			<div class="fnfelxur">
 				<img :src="faviconUrl" alt="" class="icon"/>
 				<span class="name">{{ instance.name || `(${i18n.ts.unknown})` }}</span>
 			</div>
-			<MkKeyValue :copy="host" oneline style="margin: 1em 0;">
-				<template #key>Host</template>
-				<template #value><span class="_monospace"><MkLink :url="`https://${host}`">{{ host }}</MkLink></span></template>
-			</MkKeyValue>
-			<MkKeyValue oneline style="margin: 1em 0;">
-				<template #key>{{ i18n.ts.software }}</template>
-				<template #value><span class="_monospace">{{ instance.softwareName || `(${i18n.ts.unknown})` }} / {{ instance.softwareVersion || `(${i18n.ts.unknown})` }}</span></template>
-			</MkKeyValue>
-			<MkKeyValue oneline style="margin: 1em 0;">
-				<template #key>{{ i18n.ts.administrator }}</template>
-				<template #value>{{ instance.maintainerName || `(${i18n.ts.unknown})` }} ({{ instance.maintainerEmail || `(${i18n.ts.unknown})` }})</template>
-			</MkKeyValue>
+			<div style="display: flex; flex-direction: column; gap: 1em;">
+				<MkKeyValue :copy="host" oneline>
+					<template #key>Host</template>
+					<template #value><span class="_monospace"><MkLink :url="`https://${host}`">{{ host }}</MkLink></span></template>
+				</MkKeyValue>
+				<MkKeyValue oneline>
+					<template #key>{{ i18n.ts.software }}</template>
+					<template #value><span class="_monospace">{{ instance.softwareName || `(${i18n.ts.unknown})` }} / {{ instance.softwareVersion || `(${i18n.ts.unknown})` }}</span></template>
+				</MkKeyValue>
+				<MkKeyValue oneline>
+					<template #key>{{ i18n.ts.administrator }}</template>
+					<template #value>{{ instance.maintainerName || `(${i18n.ts.unknown})` }} ({{ instance.maintainerEmail || `(${i18n.ts.unknown})` }})</template>
+				</MkKeyValue>
+			</div>
 			<MkKeyValue>
 				<template #key>{{ i18n.ts.description }}</template>
 				<template #value>{{ instance.description }}</template>
@@ -26,9 +28,11 @@
 
 			<FormSection v-if="iAmModerator">
 				<template #label>Moderation</template>
-				<FormSwitch v-model="suspended" class="_formBlock" @update:model-value="toggleSuspend">{{ i18n.ts.stopActivityDelivery }}</FormSwitch>
-				<FormSwitch v-model="isBlocked" class="_formBlock" @update:model-value="toggleBlock">{{ i18n.ts.blockThisInstance }}</FormSwitch>
-				<MkButton @click="refreshMetadata"><i class="ti ti-refresh"></i> Refresh metadata</MkButton>
+				<div class="_autoGap_half">
+					<FormSwitch v-model="suspended" @update:model-value="toggleSuspend">{{ i18n.ts.stopActivityDelivery }}</FormSwitch>
+					<FormSwitch v-model="isBlocked" @update:model-value="toggleBlock">{{ i18n.ts.blockThisInstance }}</FormSwitch>
+					<MkButton @click="refreshMetadata"><i class="ti ti-refresh"></i> Refresh metadata</MkButton>
+				</div>
 			</FormSection>
 
 			<FormSection>
@@ -66,7 +70,7 @@
 				<FormLink :to="`https://${host}/manifest.json`" external style="margin-bottom: 8px;">manifest.json</FormLink>
 			</FormSection>
 		</div>
-		<div v-else-if="tab === 'chart'" class="_formRoot">
+		<div v-else-if="tab === 'chart'" class="_autoGap">
 			<div class="cmhjzshl">
 				<div class="selects">
 					<MkSelect v-model="chartSrc" style="margin: 0 10px 0 0; flex: 1;">
@@ -91,14 +95,14 @@
 				</div>
 			</div>
 		</div>
-		<div v-else-if="tab === 'users'" class="_formRoot">
+		<div v-else-if="tab === 'users'" class="_autoGap">
 			<MkPagination v-slot="{items}" :pagination="usersPagination" style="display: grid; grid-template-columns: repeat(auto-fill,minmax(270px,1fr)); grid-gap: 12px;">
 				<MkA v-for="user in items" :key="user.id" v-tooltip.mfm="`Last posted: ${dateString(user.updatedAt)}`" class="user" :to="`/user-info/${user.id}`">
 					<MkUserCardMini :user="user"/>
 				</MkA>
 			</MkPagination>
 		</div>
-		<div v-else-if="tab === 'raw'" class="_formRoot">
+		<div v-else-if="tab === 'raw'" class="_autoGap">
 			<MkObjectView tall :value="instance">
 			</MkObjectView>
 		</div>
diff --git a/packages/frontend/src/pages/my-antennas/editor.vue b/packages/frontend/src/pages/my-antennas/editor.vue
index a409a734b5..ccbc6d1551 100644
--- a/packages/frontend/src/pages/my-antennas/editor.vue
+++ b/packages/frontend/src/pages/my-antennas/editor.vue
@@ -1,47 +1,49 @@
 <template>
-<div class="shaynizk">
-	<div class="form">
-		<MkInput v-model="name" class="_formBlock">
-			<template #label>{{ i18n.ts.name }}</template>
-		</MkInput>
-		<MkSelect v-model="src" class="_formBlock">
-			<template #label>{{ i18n.ts.antennaSource }}</template>
-			<option value="all">{{ i18n.ts._antennaSources.all }}</option>
-			<!--<option value="home">{{ i18n.ts._antennaSources.homeTimeline }}</option>-->
-			<option value="users">{{ i18n.ts._antennaSources.users }}</option>
-			<!--<option value="list">{{ i18n.ts._antennaSources.userList }}</option>-->
-			<!--<option value="group">{{ i18n.ts._antennaSources.userGroup }}</option>-->
-		</MkSelect>
-		<MkSelect v-if="src === 'list'" v-model="userListId" class="_formBlock">
-			<template #label>{{ i18n.ts.userList }}</template>
-			<option v-for="list in userLists" :key="list.id" :value="list.id">{{ list.name }}</option>
-		</MkSelect>
-		<MkSelect v-else-if="src === 'group'" v-model="userGroupId" class="_formBlock">
-			<template #label>{{ i18n.ts.userGroup }}</template>
-			<option v-for="group in userGroups" :key="group.id" :value="group.id">{{ group.name }}</option>
-		</MkSelect>
-		<MkTextarea v-else-if="src === 'users'" v-model="users" class="_formBlock">
-			<template #label>{{ i18n.ts.users }}</template>
-			<template #caption>{{ i18n.ts.antennaUsersDescription }} <button class="_textButton" @click="addUser">{{ i18n.ts.addUser }}</button></template>
-		</MkTextarea>
-		<MkSwitch v-model="withReplies" class="_formBlock">{{ i18n.ts.withReplies }}</MkSwitch>
-		<MkTextarea v-model="keywords" class="_formBlock">
-			<template #label>{{ i18n.ts.antennaKeywords }}</template>
-			<template #caption>{{ i18n.ts.antennaKeywordsDescription }}</template>
-		</MkTextarea>
-		<MkTextarea v-model="excludeKeywords" class="_formBlock">
-			<template #label>{{ i18n.ts.antennaExcludeKeywords }}</template>
-			<template #caption>{{ i18n.ts.antennaKeywordsDescription }}</template>
-		</MkTextarea>
-		<MkSwitch v-model="caseSensitive" class="_formBlock">{{ i18n.ts.caseSensitive }}</MkSwitch>
-		<MkSwitch v-model="withFile" class="_formBlock">{{ i18n.ts.withFileAntenna }}</MkSwitch>
-		<MkSwitch v-model="notify" class="_formBlock">{{ i18n.ts.notifyAntenna }}</MkSwitch>
+<MkSpacer :content-max="700">
+	<div class="shaynizk">
+		<div class="_autoGap">
+			<MkInput v-model="name">
+				<template #label>{{ i18n.ts.name }}</template>
+			</MkInput>
+			<MkSelect v-model="src">
+				<template #label>{{ i18n.ts.antennaSource }}</template>
+				<option value="all">{{ i18n.ts._antennaSources.all }}</option>
+				<!--<option value="home">{{ i18n.ts._antennaSources.homeTimeline }}</option>-->
+				<option value="users">{{ i18n.ts._antennaSources.users }}</option>
+				<!--<option value="list">{{ i18n.ts._antennaSources.userList }}</option>-->
+				<!--<option value="group">{{ i18n.ts._antennaSources.userGroup }}</option>-->
+			</MkSelect>
+			<MkSelect v-if="src === 'list'" v-model="userListId">
+				<template #label>{{ i18n.ts.userList }}</template>
+				<option v-for="list in userLists" :key="list.id" :value="list.id">{{ list.name }}</option>
+			</MkSelect>
+			<MkSelect v-else-if="src === 'group'" v-model="userGroupId">
+				<template #label>{{ i18n.ts.userGroup }}</template>
+				<option v-for="group in userGroups" :key="group.id" :value="group.id">{{ group.name }}</option>
+			</MkSelect>
+			<MkTextarea v-else-if="src === 'users'" v-model="users">
+				<template #label>{{ i18n.ts.users }}</template>
+				<template #caption>{{ i18n.ts.antennaUsersDescription }} <button class="_textButton" @click="addUser">{{ i18n.ts.addUser }}</button></template>
+			</MkTextarea>
+			<MkSwitch v-model="withReplies">{{ i18n.ts.withReplies }}</MkSwitch>
+			<MkTextarea v-model="keywords">
+				<template #label>{{ i18n.ts.antennaKeywords }}</template>
+				<template #caption>{{ i18n.ts.antennaKeywordsDescription }}</template>
+			</MkTextarea>
+			<MkTextarea v-model="excludeKeywords">
+				<template #label>{{ i18n.ts.antennaExcludeKeywords }}</template>
+				<template #caption>{{ i18n.ts.antennaKeywordsDescription }}</template>
+			</MkTextarea>
+			<MkSwitch v-model="caseSensitive">{{ i18n.ts.caseSensitive }}</MkSwitch>
+			<MkSwitch v-model="withFile">{{ i18n.ts.withFileAntenna }}</MkSwitch>
+			<MkSwitch v-model="notify">{{ i18n.ts.notifyAntenna }}</MkSwitch>
+		</div>
+		<div class="actions">
+			<MkButton inline primary @click="saveAntenna()"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton>
+			<MkButton v-if="antenna.id != null" inline danger @click="deleteAntenna()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton>
+		</div>
 	</div>
-	<div class="actions">
-		<MkButton inline primary @click="saveAntenna()"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton>
-		<MkButton v-if="antenna.id != null" inline danger @click="deleteAntenna()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton>
-	</div>
-</div>
+</MkSpacer>
 </template>
 
 <script lang="ts" setup>
@@ -143,12 +145,9 @@ function addUser() {
 
 <style lang="scss" scoped>
 .shaynizk {
-	> .form {
-		padding: 32px;
-	}
-
 	> .actions {
-		padding: 24px 32px;
+		margin-top: 16px;
+		padding: 24px 0;
 		border-top: solid 0.5px var(--divider);
 	}
 }
diff --git a/packages/frontend/src/pages/my-clips/index.vue b/packages/frontend/src/pages/my-clips/index.vue
index 6c0508134f..a79601f32f 100644
--- a/packages/frontend/src/pages/my-clips/index.vue
+++ b/packages/frontend/src/pages/my-clips/index.vue
@@ -6,7 +6,7 @@
 			<MkButton primary class="add" @click="create"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton>
 
 			<MkPagination v-slot="{items}" ref="pagingComponent" :pagination="pagination" class="list">
-				<MkA v-for="item in items" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _gap">
+				<MkA v-for="item in items" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _margin">
 					<b>{{ item.name }}</b>
 					<div v-if="item.description" class="description">{{ item.description }}</div>
 				</MkA>
diff --git a/packages/frontend/src/pages/my-lists/list.vue b/packages/frontend/src/pages/my-lists/list.vue
index 714a8d4458..48dde790e9 100644
--- a/packages/frontend/src/pages/my-lists/list.vue
+++ b/packages/frontend/src/pages/my-lists/list.vue
@@ -14,7 +14,7 @@
 			</Transition>
 
 			<Transition :name="$store.state.animation ? '_transition_zoom' : ''" mode="out-in">
-				<div v-if="list" class="_section members _gap">
+				<div v-if="list" class="_section members _margin">
 					<div class="_title">{{ i18n.ts.members }}</div>
 					<div class="_content">
 						<div class="users">
diff --git a/packages/frontend/src/pages/note.vue b/packages/frontend/src/pages/note.vue
index 3019b6eb4f..64032ac7f9 100644
--- a/packages/frontend/src/pages/note.vue
+++ b/packages/frontend/src/pages/note.vue
@@ -5,19 +5,19 @@
 		<div class="fcuexfpr">
 			<Transition :name="$store.state.animation ? 'fade' : ''" mode="out-in">
 				<div v-if="note" class="note">
-					<div v-if="showNext" class="_gap">
+					<div v-if="showNext" class="_margin">
 						<XNotes class="_content" :pagination="nextPagination" :no-gap="true"/>
 					</div>
 
-					<div class="main _gap">
+					<div class="main _margin">
 						<MkButton v-if="!showNext && hasNext" class="load next" @click="showNext = true"><i class="ti ti-chevron-up"></i></MkButton>
-						<div class="note _gap">
+						<div class="note _margin">
 							<MkRemoteCaution v-if="note.user.host != null" :href="note.url ?? note.uri"/>
 							<XNoteDetailed :key="note.id" v-model:note="note" class="note"/>
 						</div>
-						<div v-if="clips && clips.length > 0" class="_content clips _gap">
+						<div v-if="clips && clips.length > 0" class="_content clips _margin">
 							<div class="title">{{ i18n.ts.clip }}</div>
-							<MkA v-for="item in clips" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _gap">
+							<MkA v-for="item in clips" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _margin">
 								<b>{{ item.name }}</b>
 								<div v-if="item.description" class="description">{{ item.description }}</div>
 								<div class="user">
@@ -28,7 +28,7 @@
 						<MkButton v-if="!showPrev && hasPrev" class="load prev" @click="showPrev = true"><i class="ti ti-chevron-down"></i></MkButton>
 					</div>
 
-					<div v-if="showPrev" class="_gap">
+					<div v-if="showPrev" class="_margin">
 						<XNotes class="_content" :pagination="prevPagination" :no-gap="true"/>
 					</div>
 				</div>
diff --git a/packages/frontend/src/pages/page-editor/page-editor.vue b/packages/frontend/src/pages/page-editor/page-editor.vue
index 968aa12de2..ef48a2033d 100644
--- a/packages/frontend/src/pages/page-editor/page-editor.vue
+++ b/packages/frontend/src/pages/page-editor/page-editor.vue
@@ -10,29 +10,29 @@
 		</div>
 
 		<div v-if="tab === 'settings'">
-			<div class="_formRoot">
-				<MkInput v-model="title" class="_formBlock">
+			<div class="_autoGap">
+				<MkInput v-model="title">
 					<template #label>{{ $ts._pages.title }}</template>
 				</MkInput>
 
-				<MkInput v-model="summary" class="_formBlock">
+				<MkInput v-model="summary">
 					<template #label>{{ $ts._pages.summary }}</template>
 				</MkInput>
 
-				<MkInput v-model="name" class="_formBlock">
+				<MkInput v-model="name">
 					<template #prefix>{{ url }}/@{{ author.username }}/pages/</template>
 					<template #label>{{ $ts._pages.url }}</template>
 				</MkInput>
 
-				<MkSwitch v-model="alignCenter" class="_formBlock">{{ $ts._pages.alignCenter }}</MkSwitch>
+				<MkSwitch v-model="alignCenter">{{ $ts._pages.alignCenter }}</MkSwitch>
 
-				<MkSelect v-model="font" class="_formBlock">
+				<MkSelect v-model="font">
 					<template #label>{{ $ts._pages.font }}</template>
 					<option value="serif">{{ $ts._pages.fontSerif }}</option>
 					<option value="sans-serif">{{ $ts._pages.fontSansSerif }}</option>
 				</MkSelect>
 
-				<MkSwitch v-model="hideTitleWhenPinned" class="_formBlock">{{ $ts._pages.hideTitleWhenPinned }}</MkSwitch>
+				<MkSwitch v-model="hideTitleWhenPinned">{{ $ts._pages.hideTitleWhenPinned }}</MkSwitch>
 
 				<div class="eyeCatch">
 					<MkButton v-if="eyeCatchingImageId == null && !readonly" @click="setEyeCatchingImage"><i class="ti ti-plus"></i> {{ $ts._pages.eyeCatchingImageSet }}</MkButton>
diff --git a/packages/frontend/src/pages/page.vue b/packages/frontend/src/pages/page.vue
index 11ed8f9f44..07e297f5d7 100644
--- a/packages/frontend/src/pages/page.vue
+++ b/packages/frontend/src/pages/page.vue
@@ -51,7 +51,7 @@
 				<MkContainer :max-height="300" :foldable="true" class="other">
 					<template #header><i class="ti ti-clock"></i> {{ i18n.ts.recentPosts }}</template>
 					<MkPagination v-slot="{items}" :pagination="otherPostsPagination">
-						<MkPagePreview v-for="page in items" :key="page.id" :page="page" class="_gap"/>
+						<MkPagePreview v-for="page in items" :key="page.id" :page="page" class="_margin"/>
 					</MkPagination>
 				</MkContainer>
 			</div>
diff --git a/packages/frontend/src/pages/registry.keys.vue b/packages/frontend/src/pages/registry.keys.vue
index f179fbe957..1689380650 100644
--- a/packages/frontend/src/pages/registry.keys.vue
+++ b/packages/frontend/src/pages/registry.keys.vue
@@ -2,25 +2,27 @@
 <MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="600" :margin-min="16">
-		<FormSplit>
-			<MkKeyValue class="_formBlock">
-				<template #key>{{ i18n.ts._registry.domain }}</template>
-				<template #value>{{ i18n.ts.system }}</template>
-			</MkKeyValue>
-			<MkKeyValue class="_formBlock">
-				<template #key>{{ i18n.ts._registry.scope }}</template>
-				<template #value>{{ scope.join('/') }}</template>
-			</MkKeyValue>
-		</FormSplit>
-		
-		<MkButton primary @click="createKey">{{ i18n.ts._registry.createKey }}</MkButton>
+		<div class="_autoGap">
+			<FormSplit>
+				<MkKeyValue>
+					<template #key>{{ i18n.ts._registry.domain }}</template>
+					<template #value>{{ i18n.ts.system }}</template>
+				</MkKeyValue>
+				<MkKeyValue>
+					<template #key>{{ i18n.ts._registry.scope }}</template>
+					<template #value>{{ scope.join('/') }}</template>
+				</MkKeyValue>
+			</FormSplit>
+			
+			<MkButton primary @click="createKey">{{ i18n.ts._registry.createKey }}</MkButton>
 
-		<FormSection v-if="keys">
-			<template #label>{{ i18n.ts.keys }}</template>
-			<div class="_formLinks">
-				<FormLink v-for="key in keys" :to="`/registry/value/system/${scope.join('/')}/${key[0]}`" class="_monospace">{{ key[0] }}<template #suffix>{{ key[1].toUpperCase() }}</template></FormLink>
-			</div>
-		</FormSection>
+			<FormSection v-if="keys">
+				<template #label>{{ i18n.ts.keys }}</template>
+				<div class="_formLinks">
+					<FormLink v-for="key in keys" :to="`/registry/value/system/${scope.join('/')}/${key[0]}`" class="_monospace">{{ key[0] }}<template #suffix>{{ key[1].toUpperCase() }}</template></FormLink>
+				</div>
+			</FormSection>
+		</div>
 	</MkSpacer>
 </MkStickyContainer>
 </template>
diff --git a/packages/frontend/src/pages/registry.value.vue b/packages/frontend/src/pages/registry.value.vue
index 378420b1ba..537dd596a8 100644
--- a/packages/frontend/src/pages/registry.value.vue
+++ b/packages/frontend/src/pages/registry.value.vue
@@ -2,37 +2,39 @@
 <MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="600" :margin-min="16">
-		<FormInfo warn>{{ i18n.ts.editTheseSettingsMayBreakAccount }}</FormInfo>
-
-		<template v-if="value">
-			<FormSplit>
-				<MkKeyValue class="_formBlock">
-					<template #key>{{ i18n.ts._registry.domain }}</template>
-					<template #value>{{ i18n.ts.system }}</template>
-				</MkKeyValue>
-				<MkKeyValue class="_formBlock">
-					<template #key>{{ i18n.ts._registry.scope }}</template>
-					<template #value>{{ scope.join('/') }}</template>
-				</MkKeyValue>
-				<MkKeyValue class="_formBlock">
-					<template #key>{{ i18n.ts._registry.key }}</template>
-					<template #value>{{ key }}</template>
+		<div class="_autoGap">
+			<FormInfo warn>{{ i18n.ts.editTheseSettingsMayBreakAccount }}</FormInfo>
+
+			<template v-if="value">
+				<FormSplit>
+					<MkKeyValue>
+						<template #key>{{ i18n.ts._registry.domain }}</template>
+						<template #value>{{ i18n.ts.system }}</template>
+					</MkKeyValue>
+					<MkKeyValue>
+						<template #key>{{ i18n.ts._registry.scope }}</template>
+						<template #value>{{ scope.join('/') }}</template>
+					</MkKeyValue>
+					<MkKeyValue>
+						<template #key>{{ i18n.ts._registry.key }}</template>
+						<template #value>{{ key }}</template>
+					</MkKeyValue>
+				</FormSplit>
+				
+				<FormTextarea v-model="valueForEditor" tall class="_monospace">
+					<template #label>{{ i18n.ts.value }} (JSON)</template>
+				</FormTextarea>
+
+				<MkButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton>
+
+				<MkKeyValue>
+					<template #key>{{ i18n.ts.updatedAt }}</template>
+					<template #value><MkTime :time="value.updatedAt" mode="detail"/></template>
 				</MkKeyValue>
-			</FormSplit>
-			
-			<FormTextarea v-model="valueForEditor" tall class="_formBlock _monospace">
-				<template #label>{{ i18n.ts.value }} (JSON)</template>
-			</FormTextarea>
-
-			<MkButton class="_formBlock" primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton>
-
-			<MkKeyValue class="_formBlock">
-				<template #key>{{ i18n.ts.updatedAt }}</template>
-				<template #value><MkTime :time="value.updatedAt" mode="detail"/></template>
-			</MkKeyValue>
 
-			<MkButton danger @click="del"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton>
-		</template>
+				<MkButton danger @click="del"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton>
+			</template>
+		</div>
 	</MkSpacer>
 </MkStickyContainer>
 </template>
diff --git a/packages/frontend/src/pages/reset-password.vue b/packages/frontend/src/pages/reset-password.vue
index 8ec15f6425..eb79733169 100644
--- a/packages/frontend/src/pages/reset-password.vue
+++ b/packages/frontend/src/pages/reset-password.vue
@@ -2,13 +2,13 @@
 <MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer v-if="token" :content-max="700" :margin-min="16" :margin-max="32">
-		<div class="_formRoot">
-			<FormInput v-model="password" type="password" class="_formBlock">
+		<div class="_autoGap">
+			<FormInput v-model="password" type="password">
 				<template #prefix><i class="ti ti-lock"></i></template>
 				<template #label>{{ i18n.ts.newPassword }}</template>
 			</FormInput>
 		
-			<FormButton primary class="_formBlock" @click="save">{{ i18n.ts.save }}</FormButton>
+			<FormButton primary @click="save">{{ i18n.ts.save }}</FormButton>
 		</div>
 	</MkSpacer>
 </MkStickyContainer>
diff --git a/packages/frontend/src/pages/settings/account-info.vue b/packages/frontend/src/pages/settings/account-info.vue
index ccd99c162a..8f04d0cbe4 100644
--- a/packages/frontend/src/pages/settings/account-info.vue
+++ b/packages/frontend/src/pages/settings/account-info.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<MkKeyValue>
 		<template #key>ID</template>
 		<template #value><span class="_monospace">{{ $i.id }}</span></template>
diff --git a/packages/frontend/src/pages/settings/accounts.vue b/packages/frontend/src/pages/settings/accounts.vue
index 493d3b2618..fc5972660d 100644
--- a/packages/frontend/src/pages/settings/accounts.vue
+++ b/packages/frontend/src/pages/settings/accounts.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<FormSuspense :p="init">
 		<FormButton primary @click="addAccount"><i class="ti ti-plus"></i> {{ i18n.ts.addAccount }}</FormButton>
 
diff --git a/packages/frontend/src/pages/settings/api.vue b/packages/frontend/src/pages/settings/api.vue
index 8d7291cd10..919b45d3e6 100644
--- a/packages/frontend/src/pages/settings/api.vue
+++ b/packages/frontend/src/pages/settings/api.vue
@@ -1,8 +1,8 @@
 <template>
-<div class="_formRoot">
-	<FormButton primary class="_formBlock" @click="generateToken">{{ i18n.ts.generateAccessToken }}</FormButton>
-	<FormLink to="/settings/apps" class="_formBlock">{{ i18n.ts.manageAccessTokens }}</FormLink>
-	<FormLink to="/api-console" :behavior="isDesktop ? 'window' : null" class="_formBlock">API console</FormLink>
+<div class="_autoGap">
+	<FormButton primary @click="generateToken">{{ i18n.ts.generateAccessToken }}</FormButton>
+	<FormLink to="/settings/apps">{{ i18n.ts.manageAccessTokens }}</FormLink>
+	<FormLink to="/api-console" :behavior="isDesktop ? 'window' : null">API console</FormLink>
 </div>
 </template>
 
diff --git a/packages/frontend/src/pages/settings/apps.vue b/packages/frontend/src/pages/settings/apps.vue
index fe237de906..43ccdb1a97 100644
--- a/packages/frontend/src/pages/settings/apps.vue
+++ b/packages/frontend/src/pages/settings/apps.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<FormPagination ref="list" :pagination="pagination">
 		<template #empty>
 			<div class="_fullinfo">
@@ -8,20 +8,20 @@
 			</div>
 		</template>
 		<template #default="{items}">
-			<div v-for="token in items" :key="token.id" class="_panel _formBlock bfomjevm">
+			<div v-for="token in items" :key="token.id" class="_panel bfomjevm">
 				<img v-if="token.iconUrl" class="icon" :src="token.iconUrl" alt=""/>
 				<div class="body">
 					<div class="name">{{ token.name }}</div>
 					<div class="description">{{ token.description }}</div>
-					<MkKeyValue class="_formBlock" oneline>
+					<MkKeyValue oneline>
 						<template #key>{{ i18n.ts.installedDate }}</template>
 						<template #value><MkTime :time="token.createdAt"/></template>
 					</MkKeyValue>
-					<MkKeyValue class="_formBlock" oneline>
+					<MkKeyValue oneline>
 						<template #key>{{ i18n.ts.lastUsedDate }}</template>
 						<template #value><MkTime :time="token.lastUsedAt"/></template>
 					</MkKeyValue>
-					<details class="_formBlock">
+					<details>
 						<summary>{{ i18n.ts.details }}</summary>
 						<ul>
 							<li v-for="p in token.permission" :key="p">{{ $t(`_permissions.${p}`) }}</li>
diff --git a/packages/frontend/src/pages/settings/custom-css.vue b/packages/frontend/src/pages/settings/custom-css.vue
index 2caad22b7b..4d054fd2c7 100644
--- a/packages/frontend/src/pages/settings/custom-css.vue
+++ b/packages/frontend/src/pages/settings/custom-css.vue
@@ -1,8 +1,8 @@
 <template>
-<div class="_formRoot">
-	<FormInfo warn class="_formBlock">{{ i18n.ts.customCssWarn }}</FormInfo>
+<div class="_autoGap">
+	<FormInfo warn>{{ i18n.ts.customCssWarn }}</FormInfo>
 
-	<FormTextarea v-model="localCustomCss" manual-save tall class="_monospace _formBlock" style="tab-size: 2;">
+	<FormTextarea v-model="localCustomCss" manual-save tall class="_monospace" style="tab-size: 2;">
 		<template #label>CSS</template>
 	</FormTextarea>
 </div>
diff --git a/packages/frontend/src/pages/settings/deck.vue b/packages/frontend/src/pages/settings/deck.vue
index 82cefe05d5..5506f61509 100644
--- a/packages/frontend/src/pages/settings/deck.vue
+++ b/packages/frontend/src/pages/settings/deck.vue
@@ -1,10 +1,10 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<FormSwitch v-model="navWindow">{{ i18n.ts.defaultNavigationBehaviour }}: {{ i18n.ts.openInWindow }}</FormSwitch>
 
-	<FormSwitch v-model="alwaysShowMainColumn" class="_formBlock">{{ i18n.ts._deck.alwaysShowMainColumn }}</FormSwitch>
+	<FormSwitch v-model="alwaysShowMainColumn">{{ i18n.ts._deck.alwaysShowMainColumn }}</FormSwitch>
 
-	<FormRadios v-model="columnAlign" class="_formBlock">
+	<FormRadios v-model="columnAlign">
 		<template #label>{{ i18n.ts._deck.columnAlign }}</template>
 		<option value="left">{{ i18n.ts.left }}</option>
 		<option value="center">{{ i18n.ts.center }}</option>
diff --git a/packages/frontend/src/pages/settings/delete-account.vue b/packages/frontend/src/pages/settings/delete-account.vue
index 8a25ff39f0..c74b0f2b18 100644
--- a/packages/frontend/src/pages/settings/delete-account.vue
+++ b/packages/frontend/src/pages/settings/delete-account.vue
@@ -1,8 +1,8 @@
 <template>
-<div class="_formRoot">
-	<FormInfo warn class="_formBlock">{{ i18n.ts._accountDelete.mayTakeTime }}</FormInfo>
-	<FormInfo class="_formBlock">{{ i18n.ts._accountDelete.sendEmail }}</FormInfo>
-	<FormButton v-if="!$i.isDeleted" danger class="_formBlock" @click="deleteAccount">{{ i18n.ts._accountDelete.requestAccountDelete }}</FormButton>
+<div class="_autoGap">
+	<FormInfo warn>{{ i18n.ts._accountDelete.mayTakeTime }}</FormInfo>
+	<FormInfo>{{ i18n.ts._accountDelete.sendEmail }}</FormInfo>
+	<FormButton v-if="!$i.isDeleted" danger @click="deleteAccount">{{ i18n.ts._accountDelete.requestAccountDelete }}</FormButton>
 	<FormButton v-else disabled>{{ i18n.ts._accountDelete.inProgress }}</FormButton>
 </div>
 </template>
diff --git a/packages/frontend/src/pages/settings/drive.vue b/packages/frontend/src/pages/settings/drive.vue
index 2d45b1add8..bbf4da02e2 100644
--- a/packages/frontend/src/pages/settings/drive.vue
+++ b/packages/frontend/src/pages/settings/drive.vue
@@ -1,20 +1,23 @@
 <template>
-<div class="_formRoot">
-	<FormSection v-if="!fetching">
+<div class="_autoGap">
+	<FormSection v-if="!fetching" first>
 		<template #label>{{ i18n.ts.usageAmount }}</template>
-		<div class="_formBlock uawsfosz">
-			<div class="meter"><div :style="meterStyle"></div></div>
+
+		<div class="_autoGap">
+			<div class="uawsfosz">
+				<div class="meter"><div :style="meterStyle"></div></div>
+			</div>
+			<FormSplit>
+				<MkKeyValue>
+					<template #key>{{ i18n.ts.capacity }}</template>
+					<template #value>{{ bytes(capacity, 1) }}</template>
+				</MkKeyValue>
+				<MkKeyValue>
+					<template #key>{{ i18n.ts.inUse }}</template>
+					<template #value>{{ bytes(usage, 1) }}</template>
+				</MkKeyValue>
+			</FormSplit>
 		</div>
-		<FormSplit>
-			<MkKeyValue class="_formBlock">
-				<template #key>{{ i18n.ts.capacity }}</template>
-				<template #value>{{ bytes(capacity, 1) }}</template>
-			</MkKeyValue>
-			<MkKeyValue class="_formBlock">
-				<template #key>{{ i18n.ts.inUse }}</template>
-				<template #value>{{ bytes(usage, 1) }}</template>
-			</MkKeyValue>
-		</FormSplit>
 	</FormSection>
 
 	<FormSection>
@@ -23,22 +26,24 @@
 	</FormSection>
 
 	<FormSection>
-		<FormLink @click="chooseUploadFolder()">
-			{{ i18n.ts.uploadFolder }}
-			<template #suffix>{{ uploadFolder ? uploadFolder.name : '-' }}</template>
-			<template #suffixIcon><i class="fas fa-folder-open"></i></template>
-		</FormLink>
-		<FormSwitch v-model="keepOriginalUploading" class="_formBlock">
-			<template #label>{{ i18n.ts.keepOriginalUploading }}</template>
-			<template #caption>{{ i18n.ts.keepOriginalUploadingDescription }}</template>
-		</FormSwitch>
-		<FormSwitch v-model="alwaysMarkNsfw" class="_formBlock" @update:model-value="saveProfile()">
-			<template #label>{{ i18n.ts.alwaysMarkSensitive }}</template>
-		</FormSwitch>
-		<FormSwitch v-model="autoSensitive" class="_formBlock" @update:model-value="saveProfile()">
-			<template #label>{{ i18n.ts.enableAutoSensitive }}<span class="_beta">{{ i18n.ts.beta }}</span></template>
-			<template #caption>{{ i18n.ts.enableAutoSensitiveDescription }}</template>
-		</FormSwitch>
+		<div class="_autoGap">
+			<FormLink @click="chooseUploadFolder()">
+				{{ i18n.ts.uploadFolder }}
+				<template #suffix>{{ uploadFolder ? uploadFolder.name : '-' }}</template>
+				<template #suffixIcon><i class="fas fa-folder-open"></i></template>
+			</FormLink>
+			<FormSwitch v-model="keepOriginalUploading">
+				<template #label>{{ i18n.ts.keepOriginalUploading }}</template>
+				<template #caption>{{ i18n.ts.keepOriginalUploadingDescription }}</template>
+			</FormSwitch>
+			<FormSwitch v-model="alwaysMarkNsfw" @update:model-value="saveProfile()">
+				<template #label>{{ i18n.ts.alwaysMarkSensitive }}</template>
+			</FormSwitch>
+			<FormSwitch v-model="autoSensitive" @update:model-value="saveProfile()">
+				<template #label>{{ i18n.ts.enableAutoSensitive }}<span class="_beta">{{ i18n.ts.beta }}</span></template>
+				<template #caption>{{ i18n.ts.enableAutoSensitiveDescription }}</template>
+			</FormSwitch>
+		</div>
 	</FormSection>
 </div>
 </template>
diff --git a/packages/frontend/src/pages/settings/email.vue b/packages/frontend/src/pages/settings/email.vue
index 3fff8c6b1d..6b4b3a70c4 100644
--- a/packages/frontend/src/pages/settings/email.vue
+++ b/packages/frontend/src/pages/settings/email.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<FormSection>
 		<template #label>{{ i18n.ts.emailAddress }}</template>
 		<FormInput v-model="emailAddress" type="email" manual-save>
@@ -17,24 +17,27 @@
 
 	<FormSection>
 		<template #label>{{ i18n.ts.emailNotification }}</template>
-		<FormSwitch v-model="emailNotification_mention" class="_formBlock">
-			{{ i18n.ts._notification._types.mention }}
-		</FormSwitch>
-		<FormSwitch v-model="emailNotification_reply" class="_formBlock">
-			{{ i18n.ts._notification._types.reply }}
-		</FormSwitch>
-		<FormSwitch v-model="emailNotification_quote" class="_formBlock">
-			{{ i18n.ts._notification._types.quote }}
-		</FormSwitch>
-		<FormSwitch v-model="emailNotification_follow" class="_formBlock">
-			{{ i18n.ts._notification._types.follow }}
-		</FormSwitch>
-		<FormSwitch v-model="emailNotification_receiveFollowRequest" class="_formBlock">
-			{{ i18n.ts._notification._types.receiveFollowRequest }}
-		</FormSwitch>
-		<FormSwitch v-model="emailNotification_groupInvited" class="_formBlock">
-			{{ i18n.ts._notification._types.groupInvited }}
-		</FormSwitch>
+
+		<div class="_autoGap_half">
+			<FormSwitch v-model="emailNotification_mention">
+				{{ i18n.ts._notification._types.mention }}
+			</FormSwitch>
+			<FormSwitch v-model="emailNotification_reply">
+				{{ i18n.ts._notification._types.reply }}
+			</FormSwitch>
+			<FormSwitch v-model="emailNotification_quote">
+				{{ i18n.ts._notification._types.quote }}
+			</FormSwitch>
+			<FormSwitch v-model="emailNotification_follow">
+				{{ i18n.ts._notification._types.follow }}
+			</FormSwitch>
+			<FormSwitch v-model="emailNotification_receiveFollowRequest">
+				{{ i18n.ts._notification._types.receiveFollowRequest }}
+			</FormSwitch>
+			<FormSwitch v-model="emailNotification_groupInvited">
+				{{ i18n.ts._notification._types.groupInvited }}
+			</FormSwitch>
+		</div>
 	</FormSection>
 </div>
 </template>
diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue
index b426ccfa0a..f2d6bbe1f7 100644
--- a/packages/frontend/src/pages/settings/general.vue
+++ b/packages/frontend/src/pages/settings/general.vue
@@ -1,6 +1,6 @@
 <template>
-<div class="_formRoot">
-	<FormSelect v-model="lang" class="_formBlock">
+<div class="_autoGap">
+	<FormSelect v-model="lang">
 		<template #label>{{ i18n.ts.uiLanguage }}</template>
 		<option v-for="x in langs" :key="x[0]" :value="x[0]">{{ x[1] }}</option>
 		<template #caption>
@@ -12,7 +12,7 @@
 		</template>
 	</FormSelect>
 
-	<FormRadios v-model="overridedDeviceKind" class="_formBlock">
+	<FormRadios v-model="overridedDeviceKind">
 		<template #label>{{ i18n.ts.overridedDeviceKind }}</template>
 		<option :value="null">{{ i18n.ts.auto }}</option>
 		<option value="smartphone"><i class="ti ti-device-mobile"/> {{ i18n.ts.smartphone }}</option>
@@ -20,80 +20,88 @@
 		<option value="desktop"><i class="ti ti-device-desktop"/> {{ i18n.ts.desktop }}</option>
 	</FormRadios>
 
-	<FormSwitch v-model="showFixedPostForm" class="_formBlock">{{ i18n.ts.showFixedPostForm }}</FormSwitch>
+	<FormSwitch v-model="showFixedPostForm">{{ i18n.ts.showFixedPostForm }}</FormSwitch>
 
 	<FormSection>
 		<template #label>{{ i18n.ts.behavior }}</template>
-		<FormSwitch v-model="imageNewTab" class="_formBlock">{{ i18n.ts.openImageInNewTab }}</FormSwitch>
-		<FormSwitch v-model="enableInfiniteScroll" class="_formBlock">{{ i18n.ts.enableInfiniteScroll }}</FormSwitch>
-		<FormSwitch v-model="useReactionPickerForContextMenu" class="_formBlock">{{ i18n.ts.useReactionPickerForContextMenu }}</FormSwitch>
-
-		<FormSelect v-model="serverDisconnectedBehavior" class="_formBlock">
-			<template #label>{{ i18n.ts.whenServerDisconnected }}</template>
-			<option value="reload">{{ i18n.ts._serverDisconnectedBehavior.reload }}</option>
-			<option value="dialog">{{ i18n.ts._serverDisconnectedBehavior.dialog }}</option>
-			<option value="quiet">{{ i18n.ts._serverDisconnectedBehavior.quiet }}</option>
-		</FormSelect>
+
+		<div class="_autoGap">
+			<div class="_autoGap_half">
+				<FormSwitch v-model="imageNewTab">{{ i18n.ts.openImageInNewTab }}</FormSwitch>
+				<FormSwitch v-model="enableInfiniteScroll">{{ i18n.ts.enableInfiniteScroll }}</FormSwitch>
+				<FormSwitch v-model="useReactionPickerForContextMenu">{{ i18n.ts.useReactionPickerForContextMenu }}</FormSwitch>
+			</div>
+			<FormSelect v-model="serverDisconnectedBehavior">
+				<template #label>{{ i18n.ts.whenServerDisconnected }}</template>
+				<option value="reload">{{ i18n.ts._serverDisconnectedBehavior.reload }}</option>
+				<option value="dialog">{{ i18n.ts._serverDisconnectedBehavior.dialog }}</option>
+				<option value="quiet">{{ i18n.ts._serverDisconnectedBehavior.quiet }}</option>
+			</FormSelect>
+		</div>
 	</FormSection>
 
 	<FormSection>
 		<template #label>{{ i18n.ts.appearance }}</template>
-		<FormSwitch v-model="disableAnimatedMfm" class="_formBlock">{{ i18n.ts.disableAnimatedMfm }}</FormSwitch>
-		<FormSwitch v-model="reduceAnimation" class="_formBlock">{{ i18n.ts.reduceUiAnimation }}</FormSwitch>
-		<FormSwitch v-model="useBlurEffect" class="_formBlock">{{ i18n.ts.useBlurEffect }}</FormSwitch>
-		<FormSwitch v-model="useBlurEffectForModal" class="_formBlock">{{ i18n.ts.useBlurEffectForModal }}</FormSwitch>
-		<FormSwitch v-model="showGapBetweenNotesInTimeline" class="_formBlock">{{ i18n.ts.showGapBetweenNotesInTimeline }}</FormSwitch>
-		<FormSwitch v-model="loadRawImages" class="_formBlock">{{ i18n.ts.loadRawImages }}</FormSwitch>
-		<FormSwitch v-model="disableShowingAnimatedImages" class="_formBlock">{{ i18n.ts.disableShowingAnimatedImages }}</FormSwitch>
-		<FormSwitch v-model="squareAvatars" class="_formBlock">{{ i18n.ts.squareAvatars }}</FormSwitch>
-		<FormSwitch v-model="useSystemFont" class="_formBlock">{{ i18n.ts.useSystemFont }}</FormSwitch>
-		<div class="_formBlock">
-			<FormRadios v-model="emojiStyle">
-				<template #label>{{ i18n.ts.emojiStyle }}</template>
-				<option value="native">{{ i18n.ts.native }}</option>
-				<option value="fluentEmoji">Fluent Emoji</option>
-				<option value="twemoji">Twemoji</option>
+
+		<div class="_autoGap">
+			<div class="_autoGap_half">
+				<FormSwitch v-model="disableAnimatedMfm">{{ i18n.ts.disableAnimatedMfm }}</FormSwitch>
+				<FormSwitch v-model="reduceAnimation">{{ i18n.ts.reduceUiAnimation }}</FormSwitch>
+				<FormSwitch v-model="useBlurEffect">{{ i18n.ts.useBlurEffect }}</FormSwitch>
+				<FormSwitch v-model="useBlurEffectForModal">{{ i18n.ts.useBlurEffectForModal }}</FormSwitch>
+				<FormSwitch v-model="showGapBetweenNotesInTimeline">{{ i18n.ts.showGapBetweenNotesInTimeline }}</FormSwitch>
+				<FormSwitch v-model="loadRawImages">{{ i18n.ts.loadRawImages }}</FormSwitch>
+				<FormSwitch v-model="disableShowingAnimatedImages">{{ i18n.ts.disableShowingAnimatedImages }}</FormSwitch>
+				<FormSwitch v-model="squareAvatars">{{ i18n.ts.squareAvatars }}</FormSwitch>
+				<FormSwitch v-model="useSystemFont">{{ i18n.ts.useSystemFont }}</FormSwitch>
+				<FormSwitch v-model="disableDrawer">{{ i18n.ts.disableDrawer }}</FormSwitch>
+			</div>
+			<div>
+				<FormRadios v-model="emojiStyle">
+					<template #label>{{ i18n.ts.emojiStyle }}</template>
+					<option value="native">{{ i18n.ts.native }}</option>
+					<option value="fluentEmoji">Fluent Emoji</option>
+					<option value="twemoji">Twemoji</option>
+				</FormRadios>
+				<div style="margin: 8px 0 0 0; font-size: 1.5em;"><Mfm :key="emojiStyle" text="🍮🍦🍭🍩🍰🍫🍬🥞🍪"/></div>
+			</div>
+
+			<FormRadios v-model="fontSize">
+				<template #label>{{ i18n.ts.fontSize }}</template>
+				<option :value="null"><span style="font-size: 14px;">Aa</span></option>
+				<option value="1"><span style="font-size: 15px;">Aa</span></option>
+				<option value="2"><span style="font-size: 16px;">Aa</span></option>
+				<option value="3"><span style="font-size: 17px;">Aa</span></option>
 			</FormRadios>
-			<div style="margin: 8px 0 0 0; font-size: 1.5em;"><Mfm :key="emojiStyle" text="🍮🍦🍭🍩🍰🍫🍬🥞🍪"/></div>
 		</div>
-
-		<FormSwitch v-model="disableDrawer" class="_formBlock">{{ i18n.ts.disableDrawer }}</FormSwitch>
-
-		<FormRadios v-model="fontSize" class="_formBlock">
-			<template #label>{{ i18n.ts.fontSize }}</template>
-			<option :value="null"><span style="font-size: 14px;">Aa</span></option>
-			<option value="1"><span style="font-size: 15px;">Aa</span></option>
-			<option value="2"><span style="font-size: 16px;">Aa</span></option>
-			<option value="3"><span style="font-size: 17px;">Aa</span></option>
-		</FormRadios>
 	</FormSection>
 
 	<FormSection>
 		<FormSwitch v-model="aiChanMode">{{ i18n.ts.aiChanMode }}</FormSwitch>
 	</FormSection>
 
-	<FormSelect v-model="instanceTicker" class="_formBlock">
+	<FormSelect v-model="instanceTicker">
 		<template #label>{{ i18n.ts.instanceTicker }}</template>
 		<option value="none">{{ i18n.ts._instanceTicker.none }}</option>
 		<option value="remote">{{ i18n.ts._instanceTicker.remote }}</option>
 		<option value="always">{{ i18n.ts._instanceTicker.always }}</option>
 	</FormSelect>
 
-	<FormSelect v-model="nsfw" class="_formBlock">
+	<FormSelect v-model="nsfw">
 		<template #label>{{ i18n.ts.nsfw }}</template>
 		<option value="respect">{{ i18n.ts._nsfw.respect }}</option>
 		<option value="ignore">{{ i18n.ts._nsfw.ignore }}</option>
 		<option value="force">{{ i18n.ts._nsfw.force }}</option>
 	</FormSelect>
 
-	<FormRange v-model="numberOfPageCache" :min="1" :max="10" :step="1" easing class="_formBlock">
+	<FormRange v-model="numberOfPageCache" :min="1" :max="10" :step="1" easing>
 		<template #label>{{ i18n.ts.numberOfPageCache }}</template>
 		<template #caption>{{ i18n.ts.numberOfPageCacheDescription }}</template>
 	</FormRange>
 
-	<FormLink to="/settings/deck" class="_formBlock">{{ i18n.ts.deck }}</FormLink>
+	<FormLink to="/settings/deck">{{ i18n.ts.deck }}</FormLink>
 
-	<FormLink to="/settings/custom-css" class="_formBlock"><template #icon><i class="ti ti-code"></i></template>{{ i18n.ts.customCss }}</FormLink>
+	<FormLink to="/settings/custom-css"><template #icon><i class="ti ti-code"></i></template>{{ i18n.ts.customCss }}</FormLink>
 </div>
 </template>
 
diff --git a/packages/frontend/src/pages/settings/import-export.vue b/packages/frontend/src/pages/settings/import-export.vue
index 3012c3f283..13dcc627a2 100644
--- a/packages/frontend/src/pages/settings/import-export.vue
+++ b/packages/frontend/src/pages/settings/import-export.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<FormSection>
 		<template #label><i class="ti ti-pencil"></i> {{ i18n.ts._exportOrImport.allNotes }}</template>
 		<FormFolder>
@@ -18,18 +18,18 @@
 	</FormSection>
 	<FormSection>
 		<template #label><i class="ti ti-users"></i> {{ i18n.ts._exportOrImport.followingList }}</template>
-		<FormFolder class="_formBlock">
+		<FormFolder>
 			<template #label>{{ i18n.ts.export }}</template>
 			<template #icon><i class="ti ti-download"></i></template>
-			<FormSwitch v-model="excludeMutingUsers" class="_formBlock">
+			<FormSwitch v-model="excludeMutingUsers">
 				{{ i18n.ts._exportOrImport.excludeMutingUsers }}
 			</FormSwitch>
-			<FormSwitch v-model="excludeInactiveUsers" class="_formBlock">
+			<FormSwitch v-model="excludeInactiveUsers">
 				{{ i18n.ts._exportOrImport.excludeInactiveUsers }}
 			</FormSwitch>
 			<MkButton primary :class="$style.button" inline @click="exportFollowing()"><i class="ti ti-download"></i> {{ i18n.ts.export }}</MkButton>
 		</FormFolder>
-		<FormFolder class="_formBlock">
+		<FormFolder>
 			<template #label>{{ i18n.ts.import }}</template>
 			<template #icon><i class="ti ti-upload"></i></template>
 			<MkButton primary :class="$style.button" inline @click="importFollowing($event)"><i class="ti ti-upload"></i> {{ i18n.ts.import }}</MkButton>
@@ -37,12 +37,12 @@
 	</FormSection>
 	<FormSection>
 		<template #label><i class="ti ti-users"></i> {{ i18n.ts._exportOrImport.userLists }}</template>
-		<FormFolder class="_formBlock">
+		<FormFolder>
 			<template #label>{{ i18n.ts.export }}</template>
 			<template #icon><i class="ti ti-download"></i></template>
 			<MkButton primary :class="$style.button" inline @click="exportUserLists()"><i class="ti ti-download"></i> {{ i18n.ts.export }}</MkButton>
 		</FormFolder>
-		<FormFolder class="_formBlock">
+		<FormFolder>
 			<template #label>{{ i18n.ts.import }}</template>
 			<template #icon><i class="ti ti-upload"></i></template>
 			<MkButton primary :class="$style.button" inline @click="importUserLists($event)"><i class="ti ti-upload"></i> {{ i18n.ts.import }}</MkButton>
@@ -50,12 +50,12 @@
 	</FormSection>
 	<FormSection>
 		<template #label><i class="ti ti-user-off"></i> {{ i18n.ts._exportOrImport.muteList }}</template>
-		<FormFolder class="_formBlock">
+		<FormFolder>
 			<template #label>{{ i18n.ts.export }}</template>
 			<template #icon><i class="ti ti-download"></i></template>
 			<MkButton primary :class="$style.button" inline @click="exportMuting()"><i class="ti ti-download"></i> {{ i18n.ts.export }}</MkButton>
 		</FormFolder>
-		<FormFolder class="_formBlock">
+		<FormFolder>
 			<template #label>{{ i18n.ts.import }}</template>
 			<template #icon><i class="ti ti-upload"></i></template>
 			<MkButton primary :class="$style.button" inline @click="importMuting($event)"><i class="ti ti-upload"></i> {{ i18n.ts.import }}</MkButton>
@@ -63,12 +63,12 @@
 	</FormSection>
 	<FormSection>
 		<template #label><i class="ti ti-user-off"></i> {{ i18n.ts._exportOrImport.blockingList }}</template>
-		<FormFolder class="_formBlock">
+		<FormFolder>
 			<template #label>{{ i18n.ts.export }}</template>
 			<template #icon><i class="ti ti-download"></i></template>
 			<MkButton primary :class="$style.button" inline @click="exportBlocking()"><i class="ti ti-download"></i> {{ i18n.ts.export }}</MkButton>
 		</FormFolder>
-		<FormFolder class="_formBlock">
+		<FormFolder>
 			<template #label>{{ i18n.ts.import }}</template>
 			<template #icon><i class="ti ti-upload"></i></template>
 			<MkButton primary :class="$style.button" inline @click="importBlocking($event)"><i class="ti ti-upload"></i> {{ i18n.ts.import }}</MkButton>
diff --git a/packages/frontend/src/pages/settings/instance-mute.vue b/packages/frontend/src/pages/settings/instance-mute.vue
index 54504de188..6436be5b08 100644
--- a/packages/frontend/src/pages/settings/instance-mute.vue
+++ b/packages/frontend/src/pages/settings/instance-mute.vue
@@ -1,11 +1,11 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<MkInfo>{{ i18n.ts._instanceMute.title }}</MkInfo>
-	<FormTextarea v-model="instanceMutes" class="_formBlock">
+	<FormTextarea v-model="instanceMutes">
 		<template #label>{{ i18n.ts._instanceMute.heading }}</template>
 		<template #caption>{{ i18n.ts._instanceMute.instanceMuteDescription }}<br>{{ i18n.ts._instanceMute.instanceMuteDescription2 }}</template>
 	</FormTextarea>
-	<MkButton primary :disabled="!changed" class="_formBlock" @click="save()"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton>
+	<MkButton primary :disabled="!changed" @click="save()"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton>
 </div>
 </template>
 
diff --git a/packages/frontend/src/pages/settings/integration.vue b/packages/frontend/src/pages/settings/integration.vue
index 557fe778e6..fe8087eb62 100644
--- a/packages/frontend/src/pages/settings/integration.vue
+++ b/packages/frontend/src/pages/settings/integration.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<FormSection v-if="instance.enableTwitterIntegration">
 		<template #label><i class="ti ti-brand-twitter"></i> Twitter</template>
 		<p v-if="integrations.twitter">{{ i18n.ts.connectedTo }}: <a :href="`https://twitter.com/${integrations.twitter.screenName}`" rel="nofollow noopener" target="_blank">@{{ integrations.twitter.screenName }}</a></p>
diff --git a/packages/frontend/src/pages/settings/mute-block.vue b/packages/frontend/src/pages/settings/mute-block.vue
index 1cf33d34db..7a72d4a643 100644
--- a/packages/frontend/src/pages/settings/mute-block.vue
+++ b/packages/frontend/src/pages/settings/mute-block.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<MkTab v-model="tab" style="margin-bottom: var(--margin);">
 		<option value="mute">{{ i18n.ts.mutedUsers }}</option>
 		<option value="block">{{ i18n.ts.blockedUsers }}</option>
diff --git a/packages/frontend/src/pages/settings/navbar.vue b/packages/frontend/src/pages/settings/navbar.vue
index 9ab8700b01..33b970528a 100644
--- a/packages/frontend/src/pages/settings/navbar.vue
+++ b/packages/frontend/src/pages/settings/navbar.vue
@@ -1,11 +1,11 @@
 <template>
-<div class="_formRoot">
-	<FormTextarea v-model="items" tall manual-save class="_formBlock">
+<div class="_autoGap">
+	<FormTextarea v-model="items" tall manual-save>
 		<template #label>{{ i18n.ts.navbar }}</template>
 		<template #caption><button class="_textButton" @click="addItem">{{ i18n.ts.addItem }}</button></template>
 	</FormTextarea>
 
-	<FormRadios v-model="menuDisplay" class="_formBlock">
+	<FormRadios v-model="menuDisplay">
 		<template #label>{{ i18n.ts.display }}</template>
 		<option value="sideFull">{{ i18n.ts._menuDisplay.sideFull }}</option>
 		<option value="sideIcon">{{ i18n.ts._menuDisplay.sideIcon }}</option>
@@ -13,7 +13,7 @@
 		<!-- <MkRadio v-model="menuDisplay" value="hide" disabled>{{ i18n.ts._menuDisplay.hide }}</MkRadio>--> <!-- TODO: サイドバーを完全に隠せるようにすると、別途ハンバーガーボタンのようなものをUIに表示する必要があり面倒 -->
 	</FormRadios>
 
-	<FormButton danger class="_formBlock" @click="reset()"><i class="ti ti-reload"></i> {{ i18n.ts.default }}</FormButton>
+	<FormButton danger @click="reset()"><i class="ti ti-reload"></i> {{ i18n.ts.default }}</FormButton>
 </div>
 </template>
 
diff --git a/packages/frontend/src/pages/settings/notifications.vue b/packages/frontend/src/pages/settings/notifications.vue
index c1b7130245..872d26c3fb 100644
--- a/packages/frontend/src/pages/settings/notifications.vue
+++ b/packages/frontend/src/pages/settings/notifications.vue
@@ -1,22 +1,27 @@
 <template>
-<div class="_formRoot">
-	<FormLink class="_formBlock" @click="configure"><template #icon><i class="ti ti-settings"></i></template>{{ i18n.ts.notificationSetting }}</FormLink>
+<div class="_autoGap">
+	<FormLink @click="configure"><template #icon><i class="ti ti-settings"></i></template>{{ i18n.ts.notificationSetting }}</FormLink>
 	<FormSection>
-		<FormLink class="_formBlock" @click="readAllNotifications">{{ i18n.ts.markAsReadAllNotifications }}</FormLink>
-		<FormLink class="_formBlock" @click="readAllUnreadNotes">{{ i18n.ts.markAsReadAllUnreadNotes }}</FormLink>
-		<FormLink class="_formBlock" @click="readAllMessagingMessages">{{ i18n.ts.markAsReadAllTalkMessages }}</FormLink>
+		<div class="_autoGap">
+			<FormLink @click="readAllNotifications">{{ i18n.ts.markAsReadAllNotifications }}</FormLink>
+			<FormLink @click="readAllUnreadNotes">{{ i18n.ts.markAsReadAllUnreadNotes }}</FormLink>
+			<FormLink @click="readAllMessagingMessages">{{ i18n.ts.markAsReadAllTalkMessages }}</FormLink>
+		</div>
 	</FormSection>
 	<FormSection>
 		<template #label>{{ i18n.ts.pushNotification }}</template>
-		<MkPushNotificationAllowButton ref="allowButton" />
-		<FormSwitch class="_formBlock" :disabled="!pushRegistrationInServer" :model-value="sendReadMessage" @update:model-value="onChangeSendReadMessage">
-			<template #label>{{ i18n.ts.sendPushNotificationReadMessage }}</template>
-			<template #caption>
-				<I18n :src="i18n.ts.sendPushNotificationReadMessageCaption">
-					<template #emptyPushNotificationMessage>{{ i18n.ts._notification.emptyPushNotificationMessage }}</template>
-				</I18n>
-			</template>
-		</FormSwitch>
+
+		<div class="_autoGap">
+			<MkPushNotificationAllowButton ref="allowButton"/>
+			<FormSwitch :disabled="!pushRegistrationInServer" :model-value="sendReadMessage" @update:model-value="onChangeSendReadMessage">
+				<template #label>{{ i18n.ts.sendPushNotificationReadMessage }}</template>
+				<template #caption>
+					<I18n :src="i18n.ts.sendPushNotificationReadMessageCaption">
+						<template #emptyPushNotificationMessage>{{ i18n.ts._notification.emptyPushNotificationMessage }}</template>
+					</I18n>
+				</template>
+			</FormSwitch>
+		</div>
 	</FormSection>
 </div>
 </template>
diff --git a/packages/frontend/src/pages/settings/other.vue b/packages/frontend/src/pages/settings/other.vue
index 40bb202789..82fca7fd14 100644
--- a/packages/frontend/src/pages/settings/other.vue
+++ b/packages/frontend/src/pages/settings/other.vue
@@ -1,18 +1,18 @@
 <template>
-<div class="_formRoot">
-	<FormSwitch v-model="$i.injectFeaturedNote" class="_formBlock" @update:model-value="onChangeInjectFeaturedNote">
+<div class="_autoGap">
+	<FormSwitch v-model="$i.injectFeaturedNote" @update:model-value="onChangeInjectFeaturedNote">
 		{{ i18n.ts.showFeaturedNotesInTimeline }}
 	</FormSwitch>
 
 	<!--
-	<FormSwitch v-model="reportError" class="_formBlock">{{ i18n.ts.sendErrorReports }}<template #caption>{{ i18n.ts.sendErrorReportsDescription }}</template></FormSwitch>
+	<FormSwitch v-model="reportError">{{ i18n.ts.sendErrorReports }}<template #caption>{{ i18n.ts.sendErrorReportsDescription }}</template></FormSwitch>
 	-->
 
-	<FormLink to="/settings/account-info" class="_formBlock">{{ i18n.ts.accountInfo }}</FormLink>
+	<FormLink to="/settings/account-info">{{ i18n.ts.accountInfo }}</FormLink>
 
-	<FormLink to="/registry" class="_formBlock"><template #icon><i class="ti ti-adjustments"></i></template>{{ i18n.ts.registry }}</FormLink>
+	<FormLink to="/registry"><template #icon><i class="ti ti-adjustments"></i></template>{{ i18n.ts.registry }}</FormLink>
 
-	<FormLink to="/settings/delete-account" class="_formBlock"><template #icon><i class="ti ti-alert-triangle"></i></template>{{ i18n.ts.closeAccount }}</FormLink>
+	<FormLink to="/settings/delete-account"><template #icon><i class="ti ti-alert-triangle"></i></template>{{ i18n.ts.closeAccount }}</FormLink>
 </div>
 </template>
 
diff --git a/packages/frontend/src/pages/settings/plugin.install.vue b/packages/frontend/src/pages/settings/plugin.install.vue
index 3d77cadaaa..1950e7f089 100644
--- a/packages/frontend/src/pages/settings/plugin.install.vue
+++ b/packages/frontend/src/pages/settings/plugin.install.vue
@@ -1,12 +1,12 @@
 <template>
-<div class="_formRoot">
-	<FormInfo warn class="_formBlock">{{ i18n.ts._plugin.installWarn }}</FormInfo>
+<div class="_autoGap">
+	<FormInfo warn>{{ i18n.ts._plugin.installWarn }}</FormInfo>
 
-	<FormTextarea v-model="code" tall class="_formBlock">
+	<FormTextarea v-model="code" tall>
 		<template #label>{{ i18n.ts.code }}</template>
 	</FormTextarea>
 
-	<div class="_formBlock">
+	<div>
 		<FormButton :disabled="code == null" primary inline @click="install"><i class="ti ti-check"></i> {{ i18n.ts.install }}</FormButton>
 	</div>
 </div>
diff --git a/packages/frontend/src/pages/settings/plugin.vue b/packages/frontend/src/pages/settings/plugin.vue
index 905efd833d..3ff1d64b8e 100644
--- a/packages/frontend/src/pages/settings/plugin.vue
+++ b/packages/frontend/src/pages/settings/plugin.vue
@@ -1,23 +1,23 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<FormLink to="/settings/plugin/install"><template #icon><i class="ti ti-download"></i></template>{{ i18n.ts._plugin.install }}</FormLink>
 
 	<FormSection>
 		<template #label>{{ i18n.ts.manage }}</template>
-		<div v-for="plugin in plugins" :key="plugin.id" class="_formBlock _panel" style="padding: 20px;">
+		<div v-for="plugin in plugins" :key="plugin.id" class="_panel _autoGap_half" style="padding: 20px;">
 			<span style="display: flex;"><b>{{ plugin.name }}</b><span style="margin-left: auto;">v{{ plugin.version }}</span></span>
 
-			<FormSwitch class="_formBlock" :model-value="plugin.active" @update:model-value="changeActive(plugin, $event)">{{ i18n.ts.makeActive }}</FormSwitch>
+			<FormSwitch :model-value="plugin.active" @update:model-value="changeActive(plugin, $event)">{{ i18n.ts.makeActive }}</FormSwitch>
 
-			<MkKeyValue class="_formBlock">
+			<MkKeyValue>
 				<template #key>{{ i18n.ts.author }}</template>
 				<template #value>{{ plugin.author }}</template>
 			</MkKeyValue>
-			<MkKeyValue class="_formBlock">
+			<MkKeyValue>
 				<template #key>{{ i18n.ts.description }}</template>
 				<template #value>{{ plugin.description }}</template>
 			</MkKeyValue>
-			<MkKeyValue class="_formBlock">
+			<MkKeyValue>
 				<template #key>{{ i18n.ts.permission }}</template>
 				<template #value>{{ plugin.permission }}</template>
 			</MkKeyValue>
diff --git a/packages/frontend/src/pages/settings/preferences-backups.vue b/packages/frontend/src/pages/settings/preferences-backups.vue
index a713c1262d..bc19234c43 100644
--- a/packages/frontend/src/pages/settings/preferences-backups.vue
+++ b/packages/frontend/src/pages/settings/preferences-backups.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<div :class="$style.buttons">
 		<MkButton inline primary @click="saveNew">{{ ts._preferencesBackups.saveNew }}</MkButton>
 		<MkButton inline @click="loadFile">{{ ts._preferencesBackups.loadFile }}</MkButton>
@@ -8,17 +8,19 @@
 	<FormSection>
 		<template #label>{{ ts._preferencesBackups.list }}</template>
 		<template v-if="profiles && Object.keys(profiles).length > 0">
-			<div
-				v-for="(profile, id) in profiles"
-				:key="id"
-				class="_formBlock _panel"
-				:class="$style.profile"
-				@click="$event => menu($event, id)"
-				@contextmenu.prevent.stop="$event => menu($event, id)"
-			>
-				<div :class="$style.profileName">{{ profile.name }}</div>
-				<div :class="$style.profileTime">{{ t('_preferencesBackups.createdAt', { date: (new Date(profile.createdAt)).toLocaleDateString(), time: (new Date(profile.createdAt)).toLocaleTimeString() }) }}</div>
-				<div v-if="profile.updatedAt" :class="$style.profileTime">{{ t('_preferencesBackups.updatedAt', { date: (new Date(profile.updatedAt)).toLocaleDateString(), time: (new Date(profile.updatedAt)).toLocaleTimeString() }) }}</div>
+			<div class="_autoGap_half">
+				<div
+					v-for="(profile, id) in profiles"
+					:key="id"
+					class="_panel"
+					:class="$style.profile"
+					@click="$event => menu($event, id)"
+					@contextmenu.prevent.stop="$event => menu($event, id)"
+				>
+					<div :class="$style.profileName">{{ profile.name }}</div>
+					<div :class="$style.profileTime">{{ t('_preferencesBackups.createdAt', { date: (new Date(profile.createdAt)).toLocaleDateString(), time: (new Date(profile.createdAt)).toLocaleTimeString() }) }}</div>
+					<div v-if="profile.updatedAt" :class="$style.profileTime">{{ t('_preferencesBackups.updatedAt', { date: (new Date(profile.updatedAt)).toLocaleDateString(), time: (new Date(profile.updatedAt)).toLocaleTimeString() }) }}</div>
+				</div>
 			</div>
 		</template>
 		<div v-else-if="profiles">
diff --git a/packages/frontend/src/pages/settings/privacy.vue b/packages/frontend/src/pages/settings/privacy.vue
index 915ca05767..94ad35df4e 100644
--- a/packages/frontend/src/pages/settings/privacy.vue
+++ b/packages/frontend/src/pages/settings/privacy.vue
@@ -1,14 +1,14 @@
 <template>
-<div class="_formRoot">
-	<FormSwitch v-model="isLocked" class="_formBlock" @update:model-value="save()">{{ i18n.ts.makeFollowManuallyApprove }}<template #caption>{{ i18n.ts.lockedAccountInfo }}</template></FormSwitch>
-	<FormSwitch v-if="isLocked" v-model="autoAcceptFollowed" class="_formBlock" @update:model-value="save()">{{ i18n.ts.autoAcceptFollowed }}</FormSwitch>
+<div class="_autoGap">
+	<FormSwitch v-model="isLocked" @update:model-value="save()">{{ i18n.ts.makeFollowManuallyApprove }}<template #caption>{{ i18n.ts.lockedAccountInfo }}</template></FormSwitch>
+	<FormSwitch v-if="isLocked" v-model="autoAcceptFollowed" @update:model-value="save()">{{ i18n.ts.autoAcceptFollowed }}</FormSwitch>
 
-	<FormSwitch v-model="publicReactions" class="_formBlock" @update:model-value="save()">
+	<FormSwitch v-model="publicReactions" @update:model-value="save()">
 		{{ i18n.ts.makeReactionsPublic }}
 		<template #caption>{{ i18n.ts.makeReactionsPublicDescription }}</template>
 	</FormSwitch>
 		
-	<FormSelect v-model="ffVisibility" class="_formBlock" @update:model-value="save()">
+	<FormSelect v-model="ffVisibility" @update:model-value="save()">
 		<template #label>{{ i18n.ts.ffVisibility }}</template>
 		<option value="public">{{ i18n.ts._ffVisibility.public }}</option>
 		<option value="followers">{{ i18n.ts._ffVisibility.followers }}</option>
@@ -16,39 +16,43 @@
 		<template #caption>{{ i18n.ts.ffVisibilityDescription }}</template>
 	</FormSelect>
 		
-	<FormSwitch v-model="hideOnlineStatus" class="_formBlock" @update:model-value="save()">
+	<FormSwitch v-model="hideOnlineStatus" @update:model-value="save()">
 		{{ i18n.ts.hideOnlineStatus }}
 		<template #caption>{{ i18n.ts.hideOnlineStatusDescription }}</template>
 	</FormSwitch>
-	<FormSwitch v-model="noCrawle" class="_formBlock" @update:model-value="save()">
+	<FormSwitch v-model="noCrawle" @update:model-value="save()">
 		{{ i18n.ts.noCrawle }}
 		<template #caption>{{ i18n.ts.noCrawleDescription }}</template>
 	</FormSwitch>
-	<FormSwitch v-model="isExplorable" class="_formBlock" @update:model-value="save()">
+	<FormSwitch v-model="isExplorable" @update:model-value="save()">
 		{{ i18n.ts.makeExplorable }}
 		<template #caption>{{ i18n.ts.makeExplorableDescription }}</template>
 	</FormSwitch>
 
 	<FormSection>
-		<FormSwitch v-model="rememberNoteVisibility" class="_formBlock" @update:model-value="save()">{{ i18n.ts.rememberNoteVisibility }}</FormSwitch>
-		<FormFolder v-if="!rememberNoteVisibility" class="_formBlock">
-			<template #label>{{ i18n.ts.defaultNoteVisibility }}</template>
-			<template v-if="defaultNoteVisibility === 'public'" #suffix>{{ i18n.ts._visibility.public }}</template>
-			<template v-else-if="defaultNoteVisibility === 'home'" #suffix>{{ i18n.ts._visibility.home }}</template>
-			<template v-else-if="defaultNoteVisibility === 'followers'" #suffix>{{ i18n.ts._visibility.followers }}</template>
-			<template v-else-if="defaultNoteVisibility === 'specified'" #suffix>{{ i18n.ts._visibility.specified }}</template>
+		<div class="_autoGap">
+			<FormSwitch v-model="rememberNoteVisibility" @update:model-value="save()">{{ i18n.ts.rememberNoteVisibility }}</FormSwitch>
+			<FormFolder v-if="!rememberNoteVisibility">
+				<template #label>{{ i18n.ts.defaultNoteVisibility }}</template>
+				<template v-if="defaultNoteVisibility === 'public'" #suffix>{{ i18n.ts._visibility.public }}</template>
+				<template v-else-if="defaultNoteVisibility === 'home'" #suffix>{{ i18n.ts._visibility.home }}</template>
+				<template v-else-if="defaultNoteVisibility === 'followers'" #suffix>{{ i18n.ts._visibility.followers }}</template>
+				<template v-else-if="defaultNoteVisibility === 'specified'" #suffix>{{ i18n.ts._visibility.specified }}</template>
 
-			<FormSelect v-model="defaultNoteVisibility" class="_formBlock">
-				<option value="public">{{ i18n.ts._visibility.public }}</option>
-				<option value="home">{{ i18n.ts._visibility.home }}</option>
-				<option value="followers">{{ i18n.ts._visibility.followers }}</option>
-				<option value="specified">{{ i18n.ts._visibility.specified }}</option>
-			</FormSelect>
-			<FormSwitch v-model="defaultNoteLocalOnly" class="_formBlock">{{ i18n.ts._visibility.localOnly }}</FormSwitch>
-		</FormFolder>
+				<div class="_autoGap">
+					<FormSelect v-model="defaultNoteVisibility">
+						<option value="public">{{ i18n.ts._visibility.public }}</option>
+						<option value="home">{{ i18n.ts._visibility.home }}</option>
+						<option value="followers">{{ i18n.ts._visibility.followers }}</option>
+						<option value="specified">{{ i18n.ts._visibility.specified }}</option>
+					</FormSelect>
+					<FormSwitch v-model="defaultNoteLocalOnly">{{ i18n.ts._visibility.localOnly }}</FormSwitch>
+				</div>
+			</FormFolder>
+		</div>
 	</FormSection>
 
-	<FormSwitch v-model="keepCw" class="_formBlock" @update:model-value="save()">{{ i18n.ts.keepCw }}</FormSwitch>
+	<FormSwitch v-model="keepCw" @update:model-value="save()">{{ i18n.ts.keepCw }}</FormSwitch>
 </div>
 </template>
 
diff --git a/packages/frontend/src/pages/settings/profile.vue b/packages/frontend/src/pages/settings/profile.vue
index 14eeeaaa11..6ee2efe467 100644
--- a/packages/frontend/src/pages/settings/profile.vue
+++ b/packages/frontend/src/pages/settings/profile.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<div class="llvierxe" :style="{ backgroundImage: $i.bannerUrl ? `url(${ $i.bannerUrl })` : null }">
 		<div class="avatar">
 			<MkAvatar class="avatar" :user="$i" :disable-link="true" @click="changeAvatar"/>
@@ -8,37 +8,37 @@
 		<MkButton primary rounded class="bannerEdit" @click="changeBanner">{{ i18n.ts._profile.changeBanner }}</MkButton>
 	</div>
 
-	<FormInput v-model="profile.name" :max="30" manual-save class="_formBlock">
+	<FormInput v-model="profile.name" :max="30" manual-save>
 		<template #label>{{ i18n.ts._profile.name }}</template>
 	</FormInput>
 
-	<FormTextarea v-model="profile.description" :max="500" tall manual-save class="_formBlock">
+	<FormTextarea v-model="profile.description" :max="500" tall manual-save>
 		<template #label>{{ i18n.ts._profile.description }}</template>
 		<template #caption>{{ i18n.ts._profile.youCanIncludeHashtags }}</template>
 	</FormTextarea>
 
-	<FormInput v-model="profile.location" manual-save class="_formBlock">
+	<FormInput v-model="profile.location" manual-save>
 		<template #label>{{ i18n.ts.location }}</template>
 		<template #prefix><i class="ti ti-map-pin"></i></template>
 	</FormInput>
 
-	<FormInput v-model="profile.birthday" type="date" manual-save class="_formBlock">
+	<FormInput v-model="profile.birthday" type="date" manual-save>
 		<template #label>{{ i18n.ts.birthday }}</template>
 		<template #prefix><i class="ti ti-cake"></i></template>
 	</FormInput>
 
-	<FormSelect v-model="profile.lang" class="_formBlock">
+	<FormSelect v-model="profile.lang">
 		<template #label>{{ i18n.ts.language }}</template>
 		<option v-for="x in Object.keys(langmap)" :key="x" :value="x">{{ langmap[x].nativeName }}</option>
 	</FormSelect>
 
-	<FormSlot class="_formBlock">
+	<FormSlot>
 		<FormFolder>
 			<template #icon><i class="ti ti-list"></i></template>
 			<template #label>{{ i18n.ts._profile.metadataEdit }}</template>
 
-			<div class="_formRoot">
-				<FormSplit v-for="(record, i) in fields" :min-width="250" class="_formBlock">
+			<div class="_autoGap">
+				<FormSplit v-for="(record, i) in fields" :min-width="250">
 					<FormInput v-model="record.name" small>
 						<template #label>{{ i18n.ts._profile.metadataLabel }} #{{ i + 1 }}</template>
 					</FormInput>
@@ -46,8 +46,10 @@
 						<template #label>{{ i18n.ts._profile.metadataContent }} #{{ i + 1 }}</template>
 					</FormInput>
 				</FormSplit>
-				<MkButton :disabled="fields.length >= 16" inline style="margin-right: 8px;" @click="addField"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton>
-				<MkButton inline primary @click="saveFields"><i class="ti ti-check"></i> {{ i18n.ts.save }}</MkButton>
+				<div>
+					<MkButton :disabled="fields.length >= 16" inline style="margin-right: 8px;" @click="addField"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton>
+					<MkButton inline primary @click="saveFields"><i class="ti ti-check"></i> {{ i18n.ts.save }}</MkButton>
+				</div>
 			</div>
 		</FormFolder>
 		<template #caption>{{ i18n.ts._profile.metadataDescription }}</template>
@@ -56,13 +58,13 @@
 	<FormFolder>
 		<template #label>{{ i18n.ts.advancedSettings }}</template>
 
-		<div class="_formRoot">
-			<FormSwitch v-model="profile.isCat" class="_formBlock">{{ i18n.ts.flagAsCat }}<template #caption>{{ i18n.ts.flagAsCatDescription }}</template></FormSwitch>
-			<FormSwitch v-model="profile.isBot" class="_formBlock">{{ i18n.ts.flagAsBot }}<template #caption>{{ i18n.ts.flagAsBotDescription }}</template></FormSwitch>
+		<div class="_autoGap">
+			<FormSwitch v-model="profile.isCat">{{ i18n.ts.flagAsCat }}<template #caption>{{ i18n.ts.flagAsCatDescription }}</template></FormSwitch>
+			<FormSwitch v-model="profile.isBot">{{ i18n.ts.flagAsBot }}<template #caption>{{ i18n.ts.flagAsBotDescription }}</template></FormSwitch>
 		</div>
 	</FormFolder>
 
-	<FormSwitch v-model="profile.showTimelineReplies" class="_formBlock">{{ i18n.ts.flagShowTimelineReplies }}<template #caption>{{ i18n.ts.flagShowTimelineRepliesDescription }} {{ i18n.ts.reflectMayTakeTime }}</template></FormSwitch>
+	<FormSwitch v-model="profile.showTimelineReplies">{{ i18n.ts.flagShowTimelineReplies }}<template #caption>{{ i18n.ts.flagShowTimelineRepliesDescription }} {{ i18n.ts.reflectMayTakeTime }}</template></FormSwitch>
 </div>
 </template>
 
diff --git a/packages/frontend/src/pages/settings/reaction.vue b/packages/frontend/src/pages/settings/reaction.vue
index 2748cd7d4e..7f2e930785 100644
--- a/packages/frontend/src/pages/settings/reaction.vue
+++ b/packages/frontend/src/pages/settings/reaction.vue
@@ -1,6 +1,6 @@
 <template>
-<div class="_formRoot">
-	<FromSlot class="_formBlock">
+<div class="_autoGap">
+	<FromSlot>
 		<template #label>{{ i18n.ts.reactionSettingDescription }}</template>
 		<div v-panel style="border-radius: 6px;">
 			<Sortable v-model="reactions" class="zoaiodol" :item-key="item => item" :animation="150" :delay="100" :delay-on-touch-only="true">
@@ -17,13 +17,13 @@
 		<template #caption>{{ i18n.ts.reactionSettingDescription2 }} <button class="_textButton" @click="preview">{{ i18n.ts.preview }}</button></template>
 	</FromSlot>
 
-	<FormRadios v-model="reactionPickerSize" class="_formBlock">
+	<FormRadios v-model="reactionPickerSize">
 		<template #label>{{ i18n.ts.size }}</template>
 		<option :value="1">{{ i18n.ts.small }}</option>
 		<option :value="2">{{ i18n.ts.medium }}</option>
 		<option :value="3">{{ i18n.ts.large }}</option>
 	</FormRadios>
-	<FormRadios v-model="reactionPickerWidth" class="_formBlock">
+	<FormRadios v-model="reactionPickerWidth">
 		<template #label>{{ i18n.ts.numberOfColumn }}</template>
 		<option :value="1">5</option>
 		<option :value="2">6</option>
@@ -31,7 +31,7 @@
 		<option :value="4">8</option>
 		<option :value="5">9</option>
 	</FormRadios>
-	<FormRadios v-model="reactionPickerHeight" class="_formBlock">
+	<FormRadios v-model="reactionPickerHeight">
 		<template #label>{{ i18n.ts.height }}</template>
 		<option :value="1">{{ i18n.ts.small }}</option>
 		<option :value="2">{{ i18n.ts.medium }}</option>
@@ -39,7 +39,7 @@
 		<option :value="4">{{ i18n.ts.large }}+</option>
 	</FormRadios>
 
-	<FormSwitch v-model="reactionPickerUseDrawerForMobile" class="_formBlock">
+	<FormSwitch v-model="reactionPickerUseDrawerForMobile">
 		{{ i18n.ts.useDrawerReactionPickerForMobile }}
 		<template #caption>{{ i18n.ts.needReloadToApply }}</template>
 	</FormSwitch>
diff --git a/packages/frontend/src/pages/settings/security.vue b/packages/frontend/src/pages/settings/security.vue
index 33f49eb3ef..e3b63ea1a9 100644
--- a/packages/frontend/src/pages/settings/security.vue
+++ b/packages/frontend/src/pages/settings/security.vue
@@ -1,5 +1,5 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<FormSection>
 		<template #label>{{ i18n.ts.password }}</template>
 		<FormButton primary @click="change()">{{ i18n.ts.changePassword }}</FormButton>
diff --git a/packages/frontend/src/pages/settings/sounds.sound.vue b/packages/frontend/src/pages/settings/sounds.sound.vue
index 62627c6333..122b0d499f 100644
--- a/packages/frontend/src/pages/settings/sounds.sound.vue
+++ b/packages/frontend/src/pages/settings/sounds.sound.vue
@@ -1,10 +1,10 @@
 <template>
-<div class="_formRoot">
+<div class="_autoGap">
 	<FormSelect v-model="type">
 		<template #label>{{ i18n.ts.sound }}</template>
 		<option v-for="x in soundsTypes" :key="x" :value="x">{{ x == null ? i18n.ts.none : x }}</option>
 	</FormSelect>
-	<FormRange v-model="volume" :min="0" :max="1" :step="0.05" :text-converter="(v) => `${Math.floor(v * 100)}%`" class="_formBlock">
+	<FormRange v-model="volume" :min="0" :max="1" :step="0.05" :text-converter="(v) => `${Math.floor(v * 100)}%`">
 		<template #label>{{ i18n.ts.volume }}</template>
 	</FormRange>
 
diff --git a/packages/frontend/src/pages/settings/sounds.vue b/packages/frontend/src/pages/settings/sounds.vue
index ef60b2c3c9..4d7ea95be4 100644
--- a/packages/frontend/src/pages/settings/sounds.vue
+++ b/packages/frontend/src/pages/settings/sounds.vue
@@ -1,20 +1,22 @@
 <template>
-<div class="_formRoot">
-	<FormRange v-model="masterVolume" :min="0" :max="1" :step="0.05" :text-converter="(v) => `${Math.floor(v * 100)}%`" class="_formBlock">
+<div class="_autoGap">
+	<FormRange v-model="masterVolume" :min="0" :max="1" :step="0.05" :text-converter="(v) => `${Math.floor(v * 100)}%`">
 		<template #label>{{ i18n.ts.masterVolume }}</template>
 	</FormRange>
 
 	<FormSection>
 		<template #label>{{ i18n.ts.sounds }}</template>
-		<FormFolder v-for="type in Object.keys(sounds)" :key="type" style="margin-bottom: 8px;">
-			<template #label>{{ $t('_sfx.' + type) }}</template>
-			<template #suffix>{{ sounds[type].type ?? i18n.ts.none }}</template>
+		<div class="_autoGap_half">
+			<FormFolder v-for="type in Object.keys(sounds)" :key="type">
+				<template #label>{{ $t('_sfx.' + type) }}</template>
+				<template #suffix>{{ sounds[type].type ?? i18n.ts.none }}</template>
 
-			<XSound :type="sounds[type].type" :volume="sounds[type].volume" @update="(res) => updated(type, res)"/>
-		</FormFolder>
+				<XSound :type="sounds[type].type" :volume="sounds[type].volume" @update="(res) => updated(type, res)"/>
+			</FormFolder>
+		</div>
 	</FormSection>
 
-	<FormButton danger class="_formBlock" @click="reset()"><i class="ti ti-reload"></i> {{ i18n.ts.default }}</FormButton>
+	<FormButton danger @click="reset()"><i class="ti ti-reload"></i> {{ i18n.ts.default }}</FormButton>
 </div>
 </template>
 
diff --git a/packages/frontend/src/pages/settings/statusbar.statusbar.vue b/packages/frontend/src/pages/settings/statusbar.statusbar.vue
index 608222386e..328a7f8e10 100644
--- a/packages/frontend/src/pages/settings/statusbar.statusbar.vue
+++ b/packages/frontend/src/pages/settings/statusbar.statusbar.vue
@@ -1,21 +1,21 @@
 <template>
-<div class="_formRoot">
-	<FormSelect v-model="statusbar.type" placeholder="Please select" class="_formBlock">
+<div class="_autoGap">
+	<FormSelect v-model="statusbar.type" placeholder="Please select">
 		<template #label>{{ i18n.ts.type }}</template>
 		<option value="rss">RSS</option>
 		<option value="federation">Federation</option>
 		<option value="userList">User list timeline</option>
 	</FormSelect>
 
-	<MkInput v-model="statusbar.name" manual-save class="_formBlock">
+	<MkInput v-model="statusbar.name" manual-save>
 		<template #label>{{ i18n.ts.label }}</template>
 	</MkInput>
 
-	<MkSwitch v-model="statusbar.black" class="_formBlock">
+	<MkSwitch v-model="statusbar.black">
 		<template #label>Black</template>
 	</MkSwitch>
 
-	<FormRadios v-model="statusbar.size" class="_formBlock">
+	<FormRadios v-model="statusbar.size">
 		<template #label>{{ i18n.ts.size }}</template>
 		<option value="verySmall">{{ i18n.ts.small }}+</option>
 		<option value="small">{{ i18n.ts.small }}</option>
@@ -25,51 +25,51 @@
 	</FormRadios>
 
 	<template v-if="statusbar.type === 'rss'">
-		<MkInput v-model="statusbar.props.url" manual-save class="_formBlock" type="url">
+		<MkInput v-model="statusbar.props.url" manual-save type="url">
 			<template #label>URL</template>
 		</MkInput>
-		<MkSwitch v-model="statusbar.props.shuffle" class="_formBlock">
+		<MkSwitch v-model="statusbar.props.shuffle">
 			<template #label>{{ i18n.ts.shuffle }}</template>
 		</MkSwitch>
-		<MkInput v-model="statusbar.props.refreshIntervalSec" manual-save class="_formBlock" type="number">
+		<MkInput v-model="statusbar.props.refreshIntervalSec" manual-save type="number">
 			<template #label>{{ i18n.ts.refreshInterval }}</template>
 		</MkInput>
-		<FormRange v-model="statusbar.props.marqueeDuration" :min="5" :max="150" :step="1" class="_formBlock">
+		<FormRange v-model="statusbar.props.marqueeDuration" :min="5" :max="150" :step="1">
 			<template #label>{{ i18n.ts.speed }}</template>
 			<template #caption>{{ i18n.ts.fast }} &lt;-&gt; {{ i18n.ts.slow }}</template>
 		</FormRange>
-		<MkSwitch v-model="statusbar.props.marqueeReverse" class="_formBlock">
+		<MkSwitch v-model="statusbar.props.marqueeReverse">
 			<template #label>{{ i18n.ts.reverse }}</template>
 		</MkSwitch>
 	</template>
 	<template v-else-if="statusbar.type === 'federation'">
-		<MkInput v-model="statusbar.props.refreshIntervalSec" manual-save class="_formBlock" type="number">
+		<MkInput v-model="statusbar.props.refreshIntervalSec" manual-save type="number">
 			<template #label>{{ i18n.ts.refreshInterval }}</template>
 		</MkInput>
-		<FormRange v-model="statusbar.props.marqueeDuration" :min="5" :max="150" :step="1" class="_formBlock">
+		<FormRange v-model="statusbar.props.marqueeDuration" :min="5" :max="150" :step="1">
 			<template #label>{{ i18n.ts.speed }}</template>
 			<template #caption>{{ i18n.ts.fast }} &lt;-&gt; {{ i18n.ts.slow }}</template>
 		</FormRange>
-		<MkSwitch v-model="statusbar.props.marqueeReverse" class="_formBlock">
+		<MkSwitch v-model="statusbar.props.marqueeReverse">
 			<template #label>{{ i18n.ts.reverse }}</template>
 		</MkSwitch>
-		<MkSwitch v-model="statusbar.props.colored" class="_formBlock">
+		<MkSwitch v-model="statusbar.props.colored">
 			<template #label>{{ i18n.ts.colored }}</template>
 		</MkSwitch>
 	</template>
 	<template v-else-if="statusbar.type === 'userList' && userLists != null">
-		<FormSelect v-model="statusbar.props.userListId" class="_formBlock">
+		<FormSelect v-model="statusbar.props.userListId">
 			<template #label>{{ i18n.ts.userList }}</template>
 			<option v-for="list in userLists" :value="list.id">{{ list.name }}</option>
 		</FormSelect>
-		<MkInput v-model="statusbar.props.refreshIntervalSec" manual-save class="_formBlock" type="number">
+		<MkInput v-model="statusbar.props.refreshIntervalSec" manual-save type="number">
 			<template #label>{{ i18n.ts.refreshInterval }}</template>
 		</MkInput>
-		<FormRange v-model="statusbar.props.marqueeDuration" :min="5" :max="150" :step="1" class="_formBlock">
+		<FormRange v-model="statusbar.props.marqueeDuration" :min="5" :max="150" :step="1">
 			<template #label>{{ i18n.ts.speed }}</template>
 			<template #caption>{{ i18n.ts.fast }} &lt;-&gt; {{ i18n.ts.slow }}</template>
 		</FormRange>
-		<MkSwitch v-model="statusbar.props.marqueeReverse" class="_formBlock">
+		<MkSwitch v-model="statusbar.props.marqueeReverse">
 			<template #label>{{ i18n.ts.reverse }}</template>
 		</MkSwitch>
 	</template>
diff --git a/packages/frontend/src/pages/settings/statusbar.vue b/packages/frontend/src/pages/settings/statusbar.vue
index 86c69fa2c3..1363c79748 100644
--- a/packages/frontend/src/pages/settings/statusbar.vue
+++ b/packages/frontend/src/pages/settings/statusbar.vue
@@ -1,6 +1,6 @@
 <template>
-<div class="_formRoot">
-	<FormFolder v-for="x in statusbars" :key="x.id" class="_formBlock">
+<div class="_autoGap">
+	<FormFolder v-for="x in statusbars" :key="x.id">
 		<template #label>{{ x.type ?? i18n.ts.notSet }}</template>
 		<template #suffix>{{ x.name }}</template>
 		<XStatusbar :_id="x.id" :user-lists="userLists"/>
diff --git a/packages/frontend/src/pages/settings/theme.install.vue b/packages/frontend/src/pages/settings/theme.install.vue
index 52a436e18d..e08a03d0c9 100644
--- a/packages/frontend/src/pages/settings/theme.install.vue
+++ b/packages/frontend/src/pages/settings/theme.install.vue
@@ -1,10 +1,10 @@
 <template>
-<div class="_formRoot">
-	<FormTextarea v-model="installThemeCode" class="_formBlock">
+<div class="_autoGap">
+	<FormTextarea v-model="installThemeCode">
 		<template #label>{{ i18n.ts._theme.code }}</template>
 	</FormTextarea>
 
-	<div class="_formBlock" style="display: flex; gap: var(--margin); flex-wrap: wrap;">
+	<div style="display: flex; gap: var(--margin); flex-wrap: wrap;">
 		<FormButton :disabled="installThemeCode == null" inline @click="() => preview(installThemeCode)"><i class="ti ti-eye"></i> {{ i18n.ts.preview }}</FormButton>
 		<FormButton :disabled="installThemeCode == null" primary inline @click="() => install(installThemeCode)"><i class="ti ti-check"></i> {{ i18n.ts.install }}</FormButton>
 	</div>
diff --git a/packages/frontend/src/pages/settings/theme.manage.vue b/packages/frontend/src/pages/settings/theme.manage.vue
index 409f0af650..afbc40a18d 100644
--- a/packages/frontend/src/pages/settings/theme.manage.vue
+++ b/packages/frontend/src/pages/settings/theme.manage.vue
@@ -1,6 +1,6 @@
 <template>
-<div class="_formRoot">
-	<FormSelect v-model="selectedThemeId" class="_formBlock">
+<div class="_autoGap">
+	<FormSelect v-model="selectedThemeId">
 		<template #label>{{ i18n.ts.theme }}</template>
 		<optgroup :label="i18n.ts._theme.installedThemes">
 			<option v-for="x in installedThemes" :key="x.id" :value="x.id">{{ x.name }}</option>
@@ -10,17 +10,17 @@
 		</optgroup>
 	</FormSelect>
 	<template v-if="selectedTheme">
-		<FormInput readonly :model-value="selectedTheme.author" class="_formBlock">
+		<FormInput readonly :model-value="selectedTheme.author">
 			<template #label>{{ i18n.ts.author }}</template>
 		</FormInput>
-		<FormTextarea v-if="selectedTheme.desc" readonly :model-value="selectedTheme.desc" class="_formBlock">
+		<FormTextarea v-if="selectedTheme.desc" readonly :model-value="selectedTheme.desc">
 			<template #label>{{ i18n.ts._theme.description }}</template>
 		</FormTextarea>
-		<FormTextarea readonly tall :model-value="selectedThemeCode" class="_formBlock">
+		<FormTextarea readonly tall :model-value="selectedThemeCode">
 			<template #label>{{ i18n.ts._theme.code }}</template>
 			<template #caption><button class="_textButton" @click="copyThemeCode()">{{ i18n.ts.copy }}</button></template>
 		</FormTextarea>
-		<FormButton v-if="!builtinThemes.some(t => t.id == selectedTheme.id)" class="_formBlock" danger @click="uninstall()"><i class="ti ti-trash"></i> {{ i18n.ts.uninstall }}</FormButton>
+		<FormButton v-if="!builtinThemes.some(t => t.id == selectedTheme.id)" danger @click="uninstall()"><i class="ti ti-trash"></i> {{ i18n.ts.uninstall }}</FormButton>
 	</template>
 </div>
 </template>
diff --git a/packages/frontend/src/pages/settings/theme.vue b/packages/frontend/src/pages/settings/theme.vue
index f37c213b06..d2fc0980d4 100644
--- a/packages/frontend/src/pages/settings/theme.vue
+++ b/packages/frontend/src/pages/settings/theme.vue
@@ -1,6 +1,6 @@
 <template>
-<div class="_formRoot rsljpzjq">
-	<div v-adaptive-border class="rfqxtzch _panel _formBlock">
+<div class="_autoGap rsljpzjq">
+	<div v-adaptive-border class="rfqxtzch _panel">
 		<div class="toggle">
 			<div class="toggleWrapper">
 				<input id="dn" v-model="darkMode" type="checkbox" class="dn"/>
@@ -26,7 +26,7 @@
 		</div>
 	</div>
 
-	<div class="selects _formBlock">
+	<div class="selects">
 		<FormSelect v-model="lightThemeId" large class="select">
 			<template #label>{{ i18n.ts.themeForLightMode }}</template>
 			<template #prefix><i class="ti ti-sun"></i></template>
@@ -60,8 +60,8 @@
 		</div>
 	</FormSection>
 
-	<FormButton v-if="wallpaper == null" class="_formBlock" @click="setWallpaper">{{ i18n.ts.setWallpaper }}</FormButton>
-	<FormButton v-else class="_formBlock" @click="wallpaper = null">{{ i18n.ts.removeWallpaper }}</FormButton>
+	<FormButton v-if="wallpaper == null" @click="setWallpaper">{{ i18n.ts.setWallpaper }}</FormButton>
+	<FormButton v-else @click="wallpaper = null">{{ i18n.ts.removeWallpaper }}</FormButton>
 </div>
 </template>
 
diff --git a/packages/frontend/src/pages/settings/webhook.edit.vue b/packages/frontend/src/pages/settings/webhook.edit.vue
index c8ec1ea586..439a27ed39 100644
--- a/packages/frontend/src/pages/settings/webhook.edit.vue
+++ b/packages/frontend/src/pages/settings/webhook.edit.vue
@@ -1,14 +1,14 @@
 <template>
-<div class="_formRoot">
-	<FormInput v-model="name" class="_formBlock">
+<div class="_autoGap">
+	<FormInput v-model="name">
 		<template #label>Name</template>
 	</FormInput>
 
-	<FormInput v-model="url" type="url" class="_formBlock">
+	<FormInput v-model="url" type="url">
 		<template #label>URL</template>
 	</FormInput>
 
-	<FormInput v-model="secret" class="_formBlock">
+	<FormInput v-model="secret">
 		<template #prefix><i class="ti ti-lock"></i></template>
 		<template #label>Secret</template>
 	</FormInput>
@@ -16,18 +16,20 @@
 	<FormSection>
 		<template #label>Events</template>
 
-		<FormSwitch v-model="event_follow" class="_formBlock">Follow</FormSwitch>
-		<FormSwitch v-model="event_followed" class="_formBlock">Followed</FormSwitch>
-		<FormSwitch v-model="event_note" class="_formBlock">Note</FormSwitch>
-		<FormSwitch v-model="event_reply" class="_formBlock">Reply</FormSwitch>
-		<FormSwitch v-model="event_renote" class="_formBlock">Renote</FormSwitch>
-		<FormSwitch v-model="event_reaction" class="_formBlock">Reaction</FormSwitch>
-		<FormSwitch v-model="event_mention" class="_formBlock">Mention</FormSwitch>
+		<div class="_autoGap_half">
+			<FormSwitch v-model="event_follow">Follow</FormSwitch>
+			<FormSwitch v-model="event_followed">Followed</FormSwitch>
+			<FormSwitch v-model="event_note">Note</FormSwitch>
+			<FormSwitch v-model="event_reply">Reply</FormSwitch>
+			<FormSwitch v-model="event_renote">Renote</FormSwitch>
+			<FormSwitch v-model="event_reaction">Reaction</FormSwitch>
+			<FormSwitch v-model="event_mention">Mention</FormSwitch>
+		</div>
 	</FormSection>
 
-	<FormSwitch v-model="active" class="_formBlock">Active</FormSwitch>
+	<FormSwitch v-model="active">Active</FormSwitch>
 
-	<div class="_formBlock" style="display: flex; gap: var(--margin); flex-wrap: wrap;">
+	<div style="display: flex; gap: var(--margin); flex-wrap: wrap;">
 		<FormButton primary inline @click="save"><i class="ti ti-check"></i> {{ i18n.ts.save }}</FormButton>
 	</div>
 </div>
diff --git a/packages/frontend/src/pages/settings/webhook.new.vue b/packages/frontend/src/pages/settings/webhook.new.vue
index 00a547da69..3ef19e3f54 100644
--- a/packages/frontend/src/pages/settings/webhook.new.vue
+++ b/packages/frontend/src/pages/settings/webhook.new.vue
@@ -1,14 +1,14 @@
 <template>
-<div class="_formRoot">
-	<FormInput v-model="name" class="_formBlock">
+<div class="_autoGap">
+	<FormInput v-model="name">
 		<template #label>Name</template>
 	</FormInput>
 
-	<FormInput v-model="url" type="url" class="_formBlock">
+	<FormInput v-model="url" type="url">
 		<template #label>URL</template>
 	</FormInput>
 
-	<FormInput v-model="secret" class="_formBlock">
+	<FormInput v-model="secret">
 		<template #prefix><i class="ti ti-lock"></i></template>
 		<template #label>Secret</template>
 	</FormInput>
@@ -16,16 +16,18 @@
 	<FormSection>
 		<template #label>Events</template>
 
-		<FormSwitch v-model="event_follow" class="_formBlock">Follow</FormSwitch>
-		<FormSwitch v-model="event_followed" class="_formBlock">Followed</FormSwitch>
-		<FormSwitch v-model="event_note" class="_formBlock">Note</FormSwitch>
-		<FormSwitch v-model="event_reply" class="_formBlock">Reply</FormSwitch>
-		<FormSwitch v-model="event_renote" class="_formBlock">Renote</FormSwitch>
-		<FormSwitch v-model="event_reaction" class="_formBlock">Reaction</FormSwitch>
-		<FormSwitch v-model="event_mention" class="_formBlock">Mention</FormSwitch>
+		<div class="_autoGap_half">
+			<FormSwitch v-model="event_follow">Follow</FormSwitch>
+			<FormSwitch v-model="event_followed">Followed</FormSwitch>
+			<FormSwitch v-model="event_note">Note</FormSwitch>
+			<FormSwitch v-model="event_reply">Reply</FormSwitch>
+			<FormSwitch v-model="event_renote">Renote</FormSwitch>
+			<FormSwitch v-model="event_reaction">Reaction</FormSwitch>
+			<FormSwitch v-model="event_mention">Mention</FormSwitch>
+		</div>
 	</FormSection>
 
-	<div class="_formBlock" style="display: flex; gap: var(--margin); flex-wrap: wrap;">
+	<div style="display: flex; gap: var(--margin); flex-wrap: wrap;">
 		<FormButton primary inline @click="create"><i class="ti ti-check"></i> {{ i18n.ts.create }}</FormButton>
 	</div>
 </div>
diff --git a/packages/frontend/src/pages/settings/webhook.vue b/packages/frontend/src/pages/settings/webhook.vue
index 9be23ee4f0..e193f783f9 100644
--- a/packages/frontend/src/pages/settings/webhook.vue
+++ b/packages/frontend/src/pages/settings/webhook.vue
@@ -1,15 +1,13 @@
 <template>
-<div class="_formRoot">
-	<FormSection>
-		<FormLink :to="`/settings/webhook/new`">
-			Create webhook
-		</FormLink>
-	</FormSection>
-	
+<div class="_autoGap">
+	<FormLink :to="`/settings/webhook/new`">
+		Create webhook
+	</FormLink>
+
 	<FormSection>
 		<MkPagination :pagination="pagination">
 			<template #default="{items}">
-				<FormLink v-for="webhook in items" :key="webhook.id" :to="`/settings/webhook/edit/${webhook.id}`" class="_formBlock">
+				<FormLink v-for="webhook in items" :key="webhook.id" :to="`/settings/webhook/edit/${webhook.id}`" class="_margin">
 					<template #icon>
 						<i v-if="webhook.active === false" class="ti ti-player-pause"></i>
 						<i v-else-if="webhook.latestStatus === null" class="ti ti-circle"></i>
diff --git a/packages/frontend/src/pages/settings/word-mute.vue b/packages/frontend/src/pages/settings/word-mute.vue
index 6961d8151d..3cd28f6015 100644
--- a/packages/frontend/src/pages/settings/word-mute.vue
+++ b/packages/frontend/src/pages/settings/word-mute.vue
@@ -1,24 +1,24 @@
 <template>
-<div class="_formRoot">
-	<MkTab v-model="tab" class="_formBlock">
+<div class="_autoGap">
+	<MkTab v-model="tab">
 		<option value="soft">{{ i18n.ts._wordMute.soft }}</option>
 		<option value="hard">{{ i18n.ts._wordMute.hard }}</option>
 	</MkTab>
-	<div class="_formBlock">
-		<div v-show="tab === 'soft'">
-			<MkInfo class="_formBlock">{{ i18n.ts._wordMute.softDescription }}</MkInfo>
-			<FormTextarea v-model="softMutedWords" class="_formBlock">
+	<div>
+		<div v-show="tab === 'soft'" class="_autoGap">
+			<MkInfo>{{ i18n.ts._wordMute.softDescription }}</MkInfo>
+			<FormTextarea v-model="softMutedWords">
 				<span>{{ i18n.ts._wordMute.muteWords }}</span>
 				<template #caption>{{ i18n.ts._wordMute.muteWordsDescription }}<br>{{ i18n.ts._wordMute.muteWordsDescription2 }}</template>
 			</FormTextarea>
 		</div>
-		<div v-show="tab === 'hard'">
-			<MkInfo class="_formBlock">{{ i18n.ts._wordMute.hardDescription }} {{ i18n.ts.reflectMayTakeTime }}</MkInfo>
-			<FormTextarea v-model="hardMutedWords" class="_formBlock">
+		<div v-show="tab === 'hard'" class="_autoGap">
+			<MkInfo>{{ i18n.ts._wordMute.hardDescription }} {{ i18n.ts.reflectMayTakeTime }}</MkInfo>
+			<FormTextarea v-model="hardMutedWords">
 				<span>{{ i18n.ts._wordMute.muteWords }}</span>
 				<template #caption>{{ i18n.ts._wordMute.muteWordsDescription }}<br>{{ i18n.ts._wordMute.muteWordsDescription2 }}</template>
 			</FormTextarea>
-			<MkKeyValue v-if="hardWordMutedNotesCount != null" class="_formBlock">
+			<MkKeyValue v-if="hardWordMutedNotesCount != null">
 				<template #key>{{ i18n.ts._wordMute.mutedNotes }}</template>
 				<template #value>{{ number(hardWordMutedNotesCount) }}</template>
 			</MkKeyValue>
diff --git a/packages/frontend/src/pages/theme-editor.vue b/packages/frontend/src/pages/theme-editor.vue
index d8ff170ca2..4b058a5366 100644
--- a/packages/frontend/src/pages/theme-editor.vue
+++ b/packages/frontend/src/pages/theme-editor.vue
@@ -2,8 +2,8 @@
 <MkStickyContainer>
 	<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="800" :margin-min="16" :margin-max="32">
-		<div class="cwepdizn _formRoot">
-			<FormFolder :default-open="true" class="_formBlock">
+		<div class="cwepdizn _autoGap">
+			<FormFolder :default-open="true">
 				<template #label>{{ i18n.ts.backgroundColor }}</template>
 				<div class="cwepdizn-colors">
 					<div class="row">
@@ -19,7 +19,7 @@
 				</div>
 			</FormFolder>
 
-			<FormFolder :default-open="true" class="_formBlock">
+			<FormFolder :default-open="true">
 				<template #label>{{ i18n.ts.accentColor }}</template>
 				<div class="cwepdizn-colors">
 					<div class="row">
@@ -30,7 +30,7 @@
 				</div>
 			</FormFolder>
 
-			<FormFolder :default-open="true" class="_formBlock">
+			<FormFolder :default-open="true">
 				<template #label>{{ i18n.ts.textColor }}</template>
 				<div class="cwepdizn-colors">
 					<div class="row">
@@ -41,22 +41,22 @@
 				</div>
 			</FormFolder>
 
-			<FormFolder :default-open="false" class="_formBlock">
+			<FormFolder :default-open="false">
 				<template #icon><i class="ti ti-code"></i></template>
 				<template #label>{{ i18n.ts.editCode }}</template>
 
-				<div class="_formRoot">
-					<FormTextarea v-model="themeCode" tall class="_formBlock">
+				<div class="_autoGap">
+					<FormTextarea v-model="themeCode" tall>
 						<template #label>{{ i18n.ts._theme.code }}</template>
 					</FormTextarea>
-					<FormButton primary class="_formBlock" @click="applyThemeCode">{{ i18n.ts.apply }}</FormButton>
+					<FormButton primary @click="applyThemeCode">{{ i18n.ts.apply }}</FormButton>
 				</div>
 			</FormFolder>
 
-			<FormFolder :default-open="false" class="_formBlock">
+			<FormFolder :default-open="false">
 				<template #label>{{ i18n.ts.addDescription }}</template>
 
-				<div class="_formRoot">
+				<div class="_autoGap">
 					<FormTextarea v-model="description">
 						<template #label>{{ i18n.ts._theme.description }}</template>
 					</FormTextarea>
diff --git a/packages/frontend/src/pages/user-info.vue b/packages/frontend/src/pages/user-info.vue
index addc8db9e6..d879c95dd7 100644
--- a/packages/frontend/src/pages/user-info.vue
+++ b/packages/frontend/src/pages/user-info.vue
@@ -3,8 +3,8 @@
 	<template #header><MkPageHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs"/></template>
 	<MkSpacer :content-max="600" :margin-min="16" :margin-max="32">
 		<FormSuspense :p="init">
-			<div v-if="tab === 'overview'" class="_formRoot">
-				<div class="_formBlock aeakzknw">
+			<div v-if="tab === 'overview'" class="_autoGap">
+				<div class="aeakzknw">
 					<MkAvatar class="avatar" :user="user" :show-indicator="true"/>
 					<div class="body">
 						<span class="name"><MkUserName class="name" :user="user"/></span>
@@ -17,36 +17,36 @@
 					</div>
 				</div>
 
-				<MkInfo v-if="user.username.includes('.')" class="_formBlock">{{ i18n.ts.isSystemAccount }}</MkInfo>
+				<MkInfo v-if="user.username.includes('.')">{{ i18n.ts.isSystemAccount }}</MkInfo>
 
-				<div v-if="user.url" class="_formLinksGrid _formBlock">
+				<div v-if="user.url" class="_formLinksGrid">
 					<FormLink :to="userPage(user)">Profile</FormLink>
 					<FormLink :to="user.url" :external="true">Profile (remote)</FormLink>
 				</div>
-				<FormLink v-else class="_formBlock" :to="userPage(user)">Profile</FormLink>
+				<FormLink v-else :to="userPage(user)">Profile</FormLink>
 
-				<FormLink v-if="user.host" class="_formBlock" :to="`/instance-info/${user.host}`">{{ i18n.ts.instanceInfo }}</FormLink>
+				<FormLink v-if="user.host" :to="`/instance-info/${user.host}`">{{ i18n.ts.instanceInfo }}</FormLink>
 
-				<div class="_formBlock">
-					<MkKeyValue :copy="user.id" oneline style="margin: 1em 0;">
+				<div style="display: flex; flex-direction: column; gap: 1em;">
+					<MkKeyValue :copy="user.id" oneline>
 						<template #key>ID</template>
 						<template #value><span class="_monospace">{{ user.id }}</span></template>
 					</MkKeyValue>
 					<!-- 要る？
-					<MkKeyValue v-if="ips.length > 0" :copy="user.id" oneline style="margin: 1em 0;">
+					<MkKeyValue v-if="ips.length > 0" :copy="user.id" oneline>
 						<template #key>IP (recent)</template>
 						<template #value><span class="_monospace">{{ ips[0].ip }}</span></template>
 					</MkKeyValue>
 					-->
-					<MkKeyValue oneline style="margin: 1em 0;">
+					<MkKeyValue oneline>
 						<template #key>{{ i18n.ts.createdAt }}</template>
 						<template #value><span class="_monospace"><MkTime :time="user.createdAt" :mode="'detail'"/></span></template>
 					</MkKeyValue>
-					<MkKeyValue v-if="info" oneline style="margin: 1em 0;">
+					<MkKeyValue v-if="info" oneline>
 						<template #key>{{ i18n.ts.lastActiveDate }}</template>
 						<template #value><span class="_monospace"><MkTime :time="info.lastActiveDate" :mode="'detail'"/></span></template>
 					</MkKeyValue>
-					<MkKeyValue v-if="info" oneline style="margin: 1em 0;">
+					<MkKeyValue v-if="info" oneline>
 						<template #key>{{ i18n.ts.email }}</template>
 						<template #value><span class="_monospace">{{ info.email }}</span></template>
 					</MkKeyValue>
@@ -55,48 +55,50 @@
 				<FormSection>
 					<template #label>ActivityPub</template>
 
-					<div class="_formBlock">
-						<MkKeyValue v-if="user.host" oneline style="margin: 1em 0;">
-							<template #key>{{ i18n.ts.instanceInfo }}</template>
-							<template #value><MkA :to="`/instance-info/${user.host}`" class="_link">{{ user.host }} <i class="ti ti-chevron-right"></i></MkA></template>
-						</MkKeyValue>
-						<MkKeyValue v-else oneline style="margin: 1em 0;">
-							<template #key>{{ i18n.ts.instanceInfo }}</template>
-							<template #value>(Local user)</template>
-						</MkKeyValue>
-						<MkKeyValue oneline style="margin: 1em 0;">
-							<template #key>{{ i18n.ts.updatedAt }}</template>
-							<template #value><MkTime v-if="user.lastFetchedAt" mode="detail" :time="user.lastFetchedAt"/><span v-else>N/A</span></template>
-						</MkKeyValue>
-						<MkKeyValue v-if="ap" oneline style="margin: 1em 0;">
-							<template #key>Type</template>
-							<template #value><span class="_monospace">{{ ap.type }}</span></template>
-						</MkKeyValue>
-					</div>
+					<div class="_autoGap">
+						<div style="display: flex; flex-direction: column; gap: 1em;">
+							<MkKeyValue v-if="user.host" oneline>
+								<template #key>{{ i18n.ts.instanceInfo }}</template>
+								<template #value><MkA :to="`/instance-info/${user.host}`" class="_link">{{ user.host }} <i class="ti ti-chevron-right"></i></MkA></template>
+							</MkKeyValue>
+							<MkKeyValue v-else oneline>
+								<template #key>{{ i18n.ts.instanceInfo }}</template>
+								<template #value>(Local user)</template>
+							</MkKeyValue>
+							<MkKeyValue oneline>
+								<template #key>{{ i18n.ts.updatedAt }}</template>
+								<template #value><MkTime v-if="user.lastFetchedAt" mode="detail" :time="user.lastFetchedAt"/><span v-else>N/A</span></template>
+							</MkKeyValue>
+							<MkKeyValue v-if="ap" oneline>
+								<template #key>Type</template>
+								<template #value><span class="_monospace">{{ ap.type }}</span></template>
+							</MkKeyValue>
+						</div>
 
-					<FormButton v-if="user.host != null" class="_formBlock" @click="updateRemoteUser"><i class="ti ti-refresh"></i> {{ i18n.ts.updateRemoteUser }}</FormButton>
+						<FormButton v-if="user.host != null" @click="updateRemoteUser"><i class="ti ti-refresh"></i> {{ i18n.ts.updateRemoteUser }}</FormButton>
 
-					<FormFolder class="_formBlock">
-						<template #label>Raw</template>
+						<FormFolder>
+							<template #label>Raw</template>
 
-						<MkObjectView v-if="ap" tall :value="ap">
-						</MkObjectView>
-					</FormFolder>
+							<MkObjectView v-if="ap" tall :value="ap">
+							</MkObjectView>
+						</FormFolder>
+					</div>
 				</FormSection>
 			</div>
-			<div v-else-if="tab === 'moderation'" class="_formRoot">
-				<FormSwitch v-if="user.host == null && $i.isAdmin && (moderator || !user.isAdmin)" v-model="moderator" class="_formBlock" @update:model-value="toggleModerator">{{ i18n.ts.moderator }}</FormSwitch>
-				<FormSwitch v-model="silenced" class="_formBlock" @update:model-value="toggleSilence">{{ i18n.ts.silence }}</FormSwitch>
-				<FormSwitch v-model="suspended" class="_formBlock" @update:model-value="toggleSuspend">{{ i18n.ts.suspend }}</FormSwitch>
+			<div v-else-if="tab === 'moderation'" class="_autoGap">
+				<FormSwitch v-if="user.host == null && $i.isAdmin && (moderator || !user.isAdmin)" v-model="moderator" @update:model-value="toggleModerator">{{ i18n.ts.moderator }}</FormSwitch>
+				<FormSwitch v-model="silenced" @update:model-value="toggleSilence">{{ i18n.ts.silence }}</FormSwitch>
+				<FormSwitch v-model="suspended" @update:model-value="toggleSuspend">{{ i18n.ts.suspend }}</FormSwitch>
 				{{ i18n.ts.reflectMayTakeTime }}
-				<div class="_formBlock">
+				<div>
 					<FormButton v-if="user.host == null && iAmModerator" inline style="margin-right: 8px;" @click="resetPassword"><i class="ti ti-key"></i> {{ i18n.ts.resetPassword }}</FormButton>
 					<FormButton v-if="$i.isAdmin" inline danger @click="deleteAccount">{{ i18n.ts.deleteAccount }}</FormButton>
 				</div>
-				<FormTextarea v-model="moderationNote" manual-save class="_formBlock">
+				<FormTextarea v-model="moderationNote" manual-save>
 					<template #label>Moderation note</template>
 				</FormTextarea>
-				<FormFolder class="_formBlock">
+				<FormFolder>
 					<template #label>IP</template>
 					<MkInfo v-if="!iAmAdmin" warn>{{ i18n.ts.requireAdminForView }}</MkInfo>
 					<MkInfo v-else>The date is the IP address was first acknowledged.</MkInfo>
@@ -107,7 +109,7 @@
 						</div>
 					</template>
 				</FormFolder>
-				<FormFolder class="_formBlock">
+				<FormFolder>
 					<template #label>{{ i18n.ts.files }}</template>
 
 					<MkFileListForAdmin :pagination="filesPagination" view-mode="grid"/>
@@ -124,7 +126,7 @@
 					</FormInput>
 				</FormSection>
 			</div>
-			<div v-else-if="tab === 'chart'" class="_formRoot">
+			<div v-else-if="tab === 'chart'" class="_autoGap">
 				<div class="cmhjzshm">
 					<div class="selects">
 						<MkSelect v-model="chartSrc" style="margin: 0 10px 0 0; flex: 1;">
@@ -139,7 +141,7 @@
 					</div>
 				</div>
 			</div>
-			<div v-else-if="tab === 'raw'" class="_formRoot">
+			<div v-else-if="tab === 'raw'" class="_autoGap">
 				<MkObjectView v-if="info && $i.isAdmin" tall :value="info">
 				</MkObjectView>
 
diff --git a/packages/frontend/src/pages/user/clips.vue b/packages/frontend/src/pages/user/clips.vue
index 8c71aacb0c..95f8cbc296 100644
--- a/packages/frontend/src/pages/user/clips.vue
+++ b/packages/frontend/src/pages/user/clips.vue
@@ -2,7 +2,7 @@
 <MkSpacer :content-max="700">
 	<div class="pages-user-clips">
 		<MkPagination v-slot="{items}" ref="list" :pagination="pagination" class="list">
-			<MkA v-for="item in items" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _gap">
+			<MkA v-for="item in items" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _margin">
 				<b>{{ item.name }}</b>
 				<div v-if="item.description" class="description">{{ item.description }}</div>
 			</MkA>
diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue
index 4a92074d93..40da7f9d57 100644
--- a/packages/frontend/src/pages/user/home.vue
+++ b/packages/frontend/src/pages/user/home.vue
@@ -86,7 +86,7 @@
 			</div>
 
 			<div class="contents">
-				<div v-if="user.pinnedNotes.length > 0" class="_gap">
+				<div v-if="user.pinnedNotes.length > 0" class="_margin">
 					<XNote v-for="note in user.pinnedNotes" :key="note.id" class="note _block" :note="note" :pinned="true"/>
 				</div>
 				<MkInfo v-else-if="$i && $i.id === user.id">{{ i18n.ts.userPagePinTip }}</MkInfo>
diff --git a/packages/frontend/src/pages/user/pages.vue b/packages/frontend/src/pages/user/pages.vue
index 7833d6c42c..7ea1d75f43 100644
--- a/packages/frontend/src/pages/user/pages.vue
+++ b/packages/frontend/src/pages/user/pages.vue
@@ -1,7 +1,7 @@
 <template>
 <MkSpacer :content-max="700">
 	<MkPagination v-slot="{items}" ref="list" :pagination="pagination">
-		<MkPagePreview v-for="page in items" :key="page.id" :page="page" class="_gap"/>
+		<MkPagePreview v-for="page in items" :key="page.id" :page="page" class="_margin"/>
 	</MkPagination>
 </MkSpacer>
 </template>
diff --git a/packages/frontend/src/pages/user/reactions.vue b/packages/frontend/src/pages/user/reactions.vue
index bc4f39a74f..24129ec024 100644
--- a/packages/frontend/src/pages/user/reactions.vue
+++ b/packages/frontend/src/pages/user/reactions.vue
@@ -1,7 +1,7 @@
 <template>
 <MkSpacer :content-max="700">
 	<MkPagination v-slot="{items}" ref="list" :pagination="pagination">
-		<div v-for="item in items" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _gap afdcfbfb">
+		<div v-for="item in items" :key="item.id" :to="`/clips/${item.id}`" class="item _panel _margin afdcfbfb">
 			<div class="header">
 				<MkAvatar class="avatar" :user="user"/>
 				<MkReactionIcon class="reaction" :reaction="item.type" :no-style="true"/>
diff --git a/packages/frontend/src/pages/welcome.setup.vue b/packages/frontend/src/pages/welcome.setup.vue
index 2729d30d4b..0c627be8e4 100644
--- a/packages/frontend/src/pages/welcome.setup.vue
+++ b/packages/frontend/src/pages/welcome.setup.vue
@@ -1,18 +1,18 @@
 <template>
 <form class="mk-setup" @submit.prevent="submit()">
 	<h1>Welcome to Misskey!</h1>
-	<div class="_formRoot">
+	<div class="_autoGap">
 		<p>{{ $ts.intro }}</p>
-		<MkInput v-model="username" pattern="^[a-zA-Z0-9_]{1,20}$" :spellcheck="false" required data-cy-admin-username class="_formBlock">
+		<MkInput v-model="username" pattern="^[a-zA-Z0-9_]{1,20}$" :spellcheck="false" required data-cy-admin-username>
 			<template #label>{{ $ts.username }}</template>
 			<template #prefix>@</template>
 			<template #suffix>@{{ host }}</template>
 		</MkInput>
-		<MkInput v-model="password" type="password" data-cy-admin-password class="_formBlock">
+		<MkInput v-model="password" type="password" data-cy-admin-password>
 			<template #label>{{ $ts.password }}</template>
 			<template #prefix><i class="ti ti-lock"></i></template>
 		</MkInput>
-		<div class="bottom _formBlock">
+		<div class="bottom">
 			<MkButton gradate type="submit" :disabled="submitting" data-cy-admin-ok>
 				{{ submitting ? $ts.processing : $ts.done }}<MkEllipsis v-if="submitting"/>
 			</MkButton>
diff --git a/packages/frontend/src/style.scss b/packages/frontend/src/style.scss
index f4369884f7..e0ff1c23e0 100644
--- a/packages/frontend/src/style.scss
+++ b/packages/frontend/src/style.scss
@@ -252,6 +252,7 @@ hr {
 	overflow: clip;
 }
 
+// TODO: 廃止
 ._block {
 	@extend ._panel;
 
@@ -260,10 +261,22 @@ hr {
 	}
 }
 
-._gap {
+._margin {
 	margin: var(--margin) 0;
 }
 
+._autoGap {
+	display: flex;
+	flex-direction: column;
+	gap: 1.5em;
+}
+
+._autoGap_half {
+	display: flex;
+	flex-direction: column;
+	gap: 0.75em;
+}
+
 // TODO: 廃止
 ._card {
 	@extend ._panel;
@@ -370,20 +383,6 @@ hr {
 	backdrop-filter: var(--blur, blur(15px));
 }
 
-._formBlock {
-	margin: 1.5em 0;
-}
-
-._formRoot {
-	> ._formBlock:first-child {
-		margin-top: 0;
-	}
-
-	> ._formBlock:last-child {
-		margin-bottom: 0;
-	}
-}
-
 ._formLinksGrid {
 	display: grid;
 	grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
@@ -534,7 +533,7 @@ hr {
 	transition: transform 0.1s ease;
 }
 
-@keyframes bounce{
+@keyframes bounce {
   0% {
     transform:  scaleX(0.90) scaleY(0.90) ;
   }
-- 
cgit v1.2.3-freya

