diff --git a/README.md b/README.md
index 0939c371..1ac4ff60 100644
--- a/README.md
+++ b/README.md
@@ -38,6 +38,8 @@
 
 ## 細かい変更点
 
+- マージされていない本家版へのプルリクエストを独断でマージ
+  - RTL Layout Support ([!10452](https://git.joinfirefish.org/firefish/firefish/-/merge_requests/10452))
 - `emojis` の API エンドポイント(Misskey v13- 互換)を追加([firefish-mkdir](https://git.mkdir.uk/hiira/firefish-mkdir) から取り込み)
 - Docker のベースイメージに Node v21 を使用
 - HTML のコードに入るコメントアートを削除
diff --git a/packages/backend/src/server/web/bios.css b/packages/backend/src/server/web/bios.css
index d6a1285e..719ac90b 100644
--- a/packages/backend/src/server/web/bios.css
+++ b/packages/backend/src/server/web/bios.css
@@ -83,8 +83,8 @@ button {
 	color: rgb(156, 207, 216);
 	font-size: 16px;
   padding: 0 20px;
-  margin-right: 5px;
-  margin-left: 5px;
+  margin-inline-end: 5px;
+  margin-inline-start: 5px;
 }
 button:hover {
 	background: #555;
diff --git a/packages/backend/src/server/web/cli.css b/packages/backend/src/server/web/cli.css
index 740a2aa1..cfbe047f 100644
--- a/packages/backend/src/server/web/cli.css
+++ b/packages/backend/src/server/web/cli.css
@@ -19,7 +19,7 @@ main {
 
 img {
 	border-radius: 10px;
-	margin-right: 10px;
+	margin-inline-end: 10px;
 }
 
 #form {
diff --git a/packages/backend/src/server/web/style.css b/packages/backend/src/server/web/style.css
index cb99a160..8a16ca84 100644
--- a/packages/backend/src/server/web/style.css
+++ b/packages/backend/src/server/web/style.css
@@ -13,7 +13,7 @@ html {
 	position: fixed;
 	z-index: 10000;
 	top: 0;
-	left: 0;
+	inset-inline-start: 0;
 	width: 100vw;
 	height: 100vh;
 	cursor: wait;
@@ -25,9 +25,9 @@ html {
 #splashIcon {
 	position: absolute;
 	top: 0;
-	right: 0;
+	inset-inline-end: 0;
 	bottom: 0;
-	left: 0;
+	inset-inline-start: 0;
 	margin: auto;
 	width: 64px;
 	height: 64px;
@@ -37,9 +37,9 @@ html {
 #splashSpinner {
 	position: absolute;
 	top: 0;
-	right: 0;
+	inset-inline-end: 0;
 	bottom: 0;
-	left: 0;
+	inset-inline-start: 0;
 	margin: auto;
 	display: inline-block;
 	width: 28px;
@@ -51,7 +51,7 @@ html {
 #splashSpinner > .spinner {
 	position: absolute;
 	top: 0;
-	left: 0;
+	inset-inline-start: 0;
 	width: 28px;
 	height: 28px;
 	fill-rule: evenodd;
@@ -113,9 +113,9 @@ html {
 #splashText {
 	position: absolute;
 	top: 0;
-	right: 0;
+	inset-inline-end: 0;
 	bottom: 0;
-	left: 0;
+	inset-inline-start: 0;
 	margin: auto;
 	display: inline-block;
 	width: 70%;
diff --git a/packages/backend/src/services/send-email.ts b/packages/backend/src/services/send-email.ts
index ccc6b365..fd8f7328 100644
--- a/packages/backend/src/services/send-email.ts
+++ b/packages/backend/src/services/send-email.ts
@@ -47,7 +47,7 @@ export async function sendEmail(
 	<body style="background: #191724; padding: 16px; margin: 0; font-family: sans-serif; font-size: 14px;">
 		<main style="max-width: 500px; margin: 0 auto; background: #1f1d2e; color: #e0def4; border-radius: 20px;">
 			<header style="padding: 32px; background: #31748f; color: #e0def4; display: flex; border-radius: 20px;">
-				<img src="${meta.logoImageUrl || meta.iconUrl || iconUrl}" style="max-width: 128px; max-height: 72px; vertical-align: bottom; margin-right: 16px;"/>
+				<img src="${meta.logoImageUrl || meta.iconUrl || iconUrl}" style="max-width: 128px; max-height: 72px; vertical-align: bottom; margin-inline-end: 16px;"/>
 				<h1 style="margin: 0 0 1em 0;">${meta.name}</h1>
 			</header>
 			<article style="padding: 32px;">
diff --git a/packages/client/src/components/MkAbuseReport.vue b/packages/client/src/components/MkAbuseReport.vue
index 55365239..24067e6a 100644
--- a/packages/client/src/components/MkAbuseReport.vue
+++ b/packages/client/src/components/MkAbuseReport.vue
@@ -100,9 +100,9 @@ function resolve() {
 	> .target {
 		width: 35%;
 		box-sizing: border-box;
-		text-align: left;
+		text-align: initial;
 		padding: 24px;
-		border-right: solid 1px var(--divider);
+		border-inline-end: solid 1px var(--divider);
 
 		> .info {
 			display: flex;
@@ -129,7 +129,7 @@ function resolve() {
 			}
 
 			> .names {
-				margin-left: 0.3em;
+				margin-inline-start: 0.3em;
 				padding: 0 8px;
 				flex: 1;
 
diff --git a/packages/client/src/components/MkAbuseReportWindow.vue b/packages/client/src/components/MkAbuseReportWindow.vue
index 8d567586..c6fc768a 100644
--- a/packages/client/src/components/MkAbuseReportWindow.vue
+++ b/packages/client/src/components/MkAbuseReportWindow.vue
@@ -9,7 +9,7 @@
 		<template #header>
 			<i
 				:class="icon('ph-warning-circle')"
-				style="margin-right: 0.5em"
+				style="margin-inline-end: 0.5em"
 			></i>
 			<I18n :src="i18n.ts.reportAbuseOf" tag="span">
 				<template #name>
diff --git a/packages/client/src/components/MkButton.vue b/packages/client/src/components/MkButton.vue
index 071e981d..02a7ed66 100644
--- a/packages/client/src/components/MkButton.vue
+++ b/packages/client/src/components/MkButton.vue
@@ -128,8 +128,8 @@ function onMousedown(evt: MouseEvent): void {
 	overflow: clip;
 	box-sizing: border-box;
 	transition: background 0.1s ease;
-	margin-right: 0.2rem;
-	margin-left: 0.2rem;
+	margin-inline-end: 0.2rem;
+	margin-inline-start: 0.2rem;
 
 	&:not(:disabled):hover {
 		background: var(--buttonHoverBg);
@@ -227,7 +227,7 @@ function onMousedown(evt: MouseEvent): void {
 		position: absolute;
 		z-index: 0;
 		top: 0;
-		left: 0;
+		inset-inline-start: 0;
 		width: 100%;
 		height: 100%;
 		border-radius: 6px;
diff --git a/packages/client/src/components/MkChannelFollowButton.vue b/packages/client/src/components/MkChannelFollowButton.vue
index c1910bc5..b9a20e4b 100644
--- a/packages/client/src/components/MkChannelFollowButton.vue
+++ b/packages/client/src/components/MkChannelFollowButton.vue
@@ -93,9 +93,9 @@ async function onClick() {
 			pointer-events: none;
 			position: absolute;
 			top: -5px;
-			right: -5px;
+			inset-inline-end: -5px;
 			bottom: -5px;
-			left: -5px;
+			inset-inline-start: -5px;
 			border: 2px solid var(--focus);
 			border-radius: 32px;
 		}
@@ -130,7 +130,7 @@ async function onClick() {
 	}
 
 	> span {
-		margin-right: 6px;
+		margin-inline-end: 6px;
 	}
 }
 </style>
diff --git a/packages/client/src/components/MkChannelPreview.vue b/packages/client/src/components/MkChannelPreview.vue
index f824a1b2..c23217c0 100644
--- a/packages/client/src/components/MkChannelPreview.vue
+++ b/packages/client/src/components/MkChannelPreview.vue
@@ -12,7 +12,7 @@
 					<I18n
 						:src="i18n.ts._channel.usersCount"
 						tag="span"
-						style="margin-left: 4px"
+						style="margin-inline-start: 4px"
 					>
 						<template #n>
 							<b>{{ channel.usersCount }}</b>
@@ -24,7 +24,7 @@
 					<I18n
 						:src="i18n.ts._channel.notesCount"
 						tag="span"
-						style="margin-left: 4px"
+						style="margin-inline-start: 4px"
 					>
 						<template #n>
 							<b>{{ channel.notesCount }}</b>
@@ -88,7 +88,7 @@ const bannerStyle = computed(() => {
 		> .fade {
 			position: absolute;
 			bottom: 0;
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: 64px;
 			background: linear-gradient(0deg, var(--panel), var(--X15));
@@ -97,7 +97,7 @@ const bannerStyle = computed(() => {
 		> .name {
 			position: absolute;
 			top: 16px;
-			left: 16px;
+			inset-inline-start: 16px;
 			padding: 12px 16px;
 			-webkit-backdrop-filter: var(--blur, blur(8px));
 			backdrop-filter: var(--blur, blur(8px));
@@ -111,7 +111,7 @@ const bannerStyle = computed(() => {
 			position: absolute;
 			z-index: 1;
 			bottom: 16px;
-			right: 16px;
+			inset-inline-end: 16px;
 			padding: 8px 12px;
 			font-size: 80%;
 			-webkit-backdrop-filter: var(--blur, blur(8px));
diff --git a/packages/client/src/components/MkChart.vue b/packages/client/src/components/MkChart.vue
index adfed3fb..30aef8f7 100644
--- a/packages/client/src/components/MkChart.vue
+++ b/packages/client/src/components/MkChart.vue
@@ -459,7 +459,7 @@ onMounted(() => {
 	> .fetching {
 		position: absolute;
 		top: 0;
-		left: 0;
+		inset-inline-start: 0;
 		width: 100%;
 		height: 100%;
 		-webkit-backdrop-filter: var(--blur, blur(12px));
diff --git a/packages/client/src/components/MkChartTooltip.vue b/packages/client/src/components/MkChartTooltip.vue
index 659dc6d3..6886f827 100644
--- a/packages/client/src/components/MkChartTooltip.vue
+++ b/packages/client/src/components/MkChartTooltip.vue
@@ -61,7 +61,7 @@ const emit = defineEmits<{
 			height: 8px;
 			border-width: 1px;
 			border-style: solid;
-			margin-right: 8px;
+			margin-inline-end: 8px;
 		}
 	}
 }
diff --git a/packages/client/src/components/MkContainer.vue b/packages/client/src/components/MkContainer.vue
index 404f9844..794524c5 100644
--- a/packages/client/src/components/MkContainer.vue
+++ b/packages/client/src/components/MkContainer.vue
@@ -217,7 +217,7 @@ export default defineComponent({
 	> header {
 		position: sticky;
 		top: var(--stickyTop, 0px);
-		left: 0;
+		inset-inline-start: 0;
 		color: var(--panelHeaderFg);
 		background: var(--panelHeaderBg);
 		border-bottom: solid 0.5px var(--panelHeaderDivider);
@@ -229,7 +229,7 @@ export default defineComponent({
 			padding: 12px 16px;
 
 			> ::v-deep(i) {
-				margin-right: 6px;
+				margin-inline-end: 6px;
 				transform: translateY(0.1em);
 			}
 
@@ -242,7 +242,7 @@ export default defineComponent({
 			position: absolute;
 			z-index: 2;
 			top: 0;
-			right: 0;
+			inset-inline-end: 0;
 			height: 100%;
 
 			> ::v-deep(button) {
@@ -265,7 +265,7 @@ export default defineComponent({
 				position: absolute;
 				z-index: 10;
 				bottom: 0;
-				left: 0;
+				inset-inline-start: 0;
 				width: 100%;
 				height: 64px;
 				background: linear-gradient(0deg, var(--panel), var(--X15));
diff --git a/packages/client/src/components/MkCropperDialog.vue b/packages/client/src/components/MkCropperDialog.vue
index 1c566993..7504abe1 100644
--- a/packages/client/src/components/MkCropperDialog.vue
+++ b/packages/client/src/components/MkCropperDialog.vue
@@ -160,7 +160,7 @@ onMounted(() => {
 		position: absolute;
 		z-index: 10;
 		top: 0;
-		left: 0;
+		inset-inline-start: 0;
 		width: 100%;
 		height: 100%;
 		display: flex;
diff --git a/packages/client/src/components/MkCwButton.vue b/packages/client/src/components/MkCwButton.vue
index a8e74173..c851158a 100644
--- a/packages/client/src/components/MkCwButton.vue
+++ b/packages/client/src/components/MkCwButton.vue
@@ -84,9 +84,9 @@ defineExpose({
 
 	&.fade {
 		display: block;
-		position: absolute;
+		position: sticky;
 		bottom: 0;
-		left: 0;
+		inset-inline-start: 0;
 		width: 100%;
 		> span {
 			display: inline-block;
diff --git a/packages/client/src/components/MkDateSeparatedList.vue b/packages/client/src/components/MkDateSeparatedList.vue
index 124de083..1628724f 100644
--- a/packages/client/src/components/MkDateSeparatedList.vue
+++ b/packages/client/src/components/MkDateSeparatedList.vue
@@ -176,18 +176,18 @@ export default defineComponent({
 
 			> span {
 				&:first-child {
-					margin-right: 8px;
+					margin-inline-end: 8px;
 
 					> .icon {
-						margin-right: 8px;
+						margin-inline-end: 8px;
 					}
 				}
 
 				&:last-child {
-					margin-left: 8px;
+					margin-inline-start: 8px;
 
 					> .icon {
-						margin-left: 8px;
+						margin-inline-start: 8px;
 					}
 				}
 			}
diff --git a/packages/client/src/components/MkDrive.file.vue b/packages/client/src/components/MkDrive.file.vue
index 5163b9f7..5105fc0f 100644
--- a/packages/client/src/components/MkDrive.file.vue
+++ b/packages/client/src/components/MkDrive.file.vue
@@ -308,7 +308,7 @@ async function deleteFile() {
 	> .label {
 		position: absolute;
 		top: 0;
-		left: 0;
+		inset-inline-start: 0;
 		pointer-events: none;
 
 		&:before,
@@ -322,14 +322,14 @@ async function deleteFile() {
 
 		&:before {
 			top: 0;
-			left: 57px;
+			inset-inline-start: 57px;
 			width: 28px;
 			height: 8px;
 		}
 
 		&:after {
 			top: 57px;
-			left: 0;
+			inset-inline-start: 0;
 			width: 8px;
 			height: 28px;
 		}
@@ -345,14 +345,14 @@ async function deleteFile() {
 			position: absolute;
 			z-index: 2;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 		}
 
 		> p {
 			position: absolute;
 			z-index: 3;
 			top: 19px;
-			left: -28px;
+			inset-inline-start: -28px;
 			width: 120px;
 			margin: 0;
 			text-align: center;
diff --git a/packages/client/src/components/MkDrive.folder.vue b/packages/client/src/components/MkDrive.folder.vue
index 38dc6186..cf34f6e1 100644
--- a/packages/client/src/components/MkDrive.folder.vue
+++ b/packages/client/src/components/MkDrive.folder.vue
@@ -302,7 +302,7 @@ function onContextmenu(ev: MouseEvent) {
 	> .checkbox {
 		position: absolute;
 		bottom: 8px;
-		right: 8px;
+		inset-inline-end: 8px;
 		width: 16px;
 		height: 16px;
 		background: #fff;
@@ -319,9 +319,9 @@ function onContextmenu(ev: MouseEvent) {
 			pointer-events: none;
 			position: absolute;
 			top: -4px;
-			right: -4px;
+			inset-inline-end: -4px;
 			bottom: -4px;
-			left: -4px;
+			inset-inline-start: -4px;
 			border: 2px dashed var(--focus);
 			border-radius: 4px;
 		}
@@ -333,9 +333,9 @@ function onContextmenu(ev: MouseEvent) {
 		color: var(--desktopDriveFolderFg);
 
 		> i {
-			margin-right: 4px;
-			margin-left: 2px;
-			text-align: left;
+			margin-inline-end: 4px;
+			margin-inline-start: 2px;
+			text-align: initial;
 		}
 	}
 
diff --git a/packages/client/src/components/MkDrive.navFolder.vue b/packages/client/src/components/MkDrive.navFolder.vue
index cfd889ae..b972fbce 100644
--- a/packages/client/src/components/MkDrive.navFolder.vue
+++ b/packages/client/src/components/MkDrive.navFolder.vue
@@ -126,7 +126,7 @@ function onDrop(ev: DragEvent) {
 	}
 
 	> i {
-		margin-right: 4px;
+		margin-inline-end: 4px;
 	}
 }
 </style>
diff --git a/packages/client/src/components/MkDrive.vue b/packages/client/src/components/MkDrive.vue
index 55c7d989..29803965 100644
--- a/packages/client/src/components/MkDrive.vue
+++ b/packages/client/src/components/MkDrive.vue
@@ -848,7 +848,7 @@ onBeforeUnmount(() => {
 		}
 
 		> .menu {
-			margin-left: auto;
+			margin-inline-start: auto;
 			padding: 0 12px;
 		}
 	}
@@ -916,7 +916,7 @@ onBeforeUnmount(() => {
 
 	> .dropzone {
 		position: absolute;
-		left: 0;
+		inset-inline-start: 0;
 		top: 38px;
 		width: 100%;
 		height: calc(100% - 38px);
diff --git a/packages/client/src/components/MkDriveFileThumbnail.vue b/packages/client/src/components/MkDriveFileThumbnail.vue
index 9fe0a62c..81d4a0cf 100644
--- a/packages/client/src/components/MkDriveFileThumbnail.vue
+++ b/packages/client/src/components/MkDriveFileThumbnail.vue
@@ -88,7 +88,7 @@ const isThumbnailAvailable = computed(() => {
 		width: 30%;
 		height: auto;
 		margin: 0;
-		right: 4%;
+		inset-inline-end: 4%;
 		bottom: 4%;
 	}
 
diff --git a/packages/client/src/components/MkDriveSelectDialog.vue b/packages/client/src/components/MkDriveSelectDialog.vue
index 1047acce..5ec929a8 100644
--- a/packages/client/src/components/MkDriveSelectDialog.vue
+++ b/packages/client/src/components/MkDriveSelectDialog.vue
@@ -22,7 +22,7 @@
 			}}
 			<span
 				v-if="selected.length > 0"
-				style="margin-left: 8px; opacity: 0.5"
+				style="margin-inline-start: 8px; opacity: 0.5"
 				>({{ number(selected.length) }})</span
 			>
 		</template>
diff --git a/packages/client/src/components/MkEmojiPicker.vue b/packages/client/src/components/MkEmojiPicker.vue
index c4cdf682..bdd93449 100644
--- a/packages/client/src/components/MkEmojiPicker.vue
+++ b/packages/client/src/components/MkEmojiPicker.vue
@@ -634,7 +634,7 @@ defineExpose({
 			> header {
 				/*position: sticky;
 				top: 0;
-				left: 0;*/
+				inset-inline-start: 0;*/
 				height: 32px;
 				line-height: 32px;
 				z-index: 2;
@@ -647,7 +647,7 @@ defineExpose({
 			> header {
 				position: sticky;
 				top: 0;
-				left: 0;
+				inset-inline-start: 0;
 				height: 32px;
 				line-height: 32px;
 				z-index: 1;
diff --git a/packages/client/src/components/MkFileListForAdmin.vue b/packages/client/src/components/MkFileListForAdmin.vue
index e6a02a83..021f9ba1 100644
--- a/packages/client/src/components/MkFileListForAdmin.vue
+++ b/packages/client/src/components/MkFileListForAdmin.vue
@@ -36,7 +36,9 @@
 						<div v-else>{{ i18n.ts.system }}</div>
 					</div>
 					<div>
-						<span style="margin-right: 1em">{{ file.type }}</span>
+						<span style="margin-inline-end: 1em">{{
+							file.type
+						}}</span>
 						<span>{{ bytes(file.size) }}</span>
 					</div>
 					<div>
@@ -82,7 +84,7 @@ const props = defineProps<{
 			display: flex;
 			width: 100%;
 			box-sizing: border-box;
-			text-align: left;
+			text-align: initial;
 			align-items: center;
 
 			&:hover {
@@ -95,7 +97,7 @@ const props = defineProps<{
 			}
 
 			> .body {
-				margin-left: 0.3em;
+				margin-inline-start: 0.3em;
 				padding: 8px;
 				flex: 1;
 
@@ -125,7 +127,7 @@ const props = defineProps<{
 				position: absolute;
 				z-index: 10;
 				top: 8px;
-				left: 8px;
+				inset-inline-start: 8px;
 				padding: 2px 4px;
 				background: #ff0000bf;
 				color: #fff;
diff --git a/packages/client/src/components/MkFolder.vue b/packages/client/src/components/MkFolder.vue
index 354b2c59..1c22d0e4 100644
--- a/packages/client/src/components/MkFolder.vue
+++ b/packages/client/src/components/MkFolder.vue
@@ -159,7 +159,7 @@ export default defineComponent({
 			padding: 12px 16px 12px 0;
 
 			> i {
-				margin-right: 6px;
+				margin-inline-end: 6px;
 			}
 
 			&:empty {
diff --git a/packages/client/src/components/MkFollowButton.vue b/packages/client/src/components/MkFollowButton.vue
index 46599947..50a2cc12 100644
--- a/packages/client/src/components/MkFollowButton.vue
+++ b/packages/client/src/components/MkFollowButton.vue
@@ -235,9 +235,9 @@ onBeforeUnmount(() => {
 			pointer-events: none;
 			position: absolute;
 			top: -5px;
-			right: -5px;
+			inset-inline-end: -5px;
 			bottom: -5px;
-			left: -5px;
+			inset-inline-start: -5px;
 			border: 2px solid var(--focus);
 			border-radius: 32px;
 		}
@@ -272,7 +272,7 @@ onBeforeUnmount(() => {
 	}
 
 	> span {
-		margin-right: 6px;
+		margin-inline-end: 6px;
 	}
 }
 
diff --git a/packages/client/src/components/MkGalleryPostPreview.vue b/packages/client/src/components/MkGalleryPostPreview.vue
index e393c6ac..e82a5234 100644
--- a/packages/client/src/components/MkGalleryPostPreview.vue
+++ b/packages/client/src/components/MkGalleryPostPreview.vue
@@ -82,7 +82,7 @@ const props = defineProps<{
 			display: flex;
 
 			> .avatar {
-				margin-left: auto;
+				margin-inline-start: auto;
 				width: 32px;
 				height: 32px;
 			}
@@ -104,7 +104,7 @@ const props = defineProps<{
 				position: absolute;
 				z-index: -1;
 				top: 0;
-				left: 0;
+				inset-inline-start: 0;
 				width: 100%;
 				height: 100%;
 				background: linear-gradient(rgba(0, 0, 0, 0.4), transparent);
diff --git a/packages/client/src/components/MkGoogle.vue b/packages/client/src/components/MkGoogle.vue
index 94e10ccd..66c9ceb1 100644
--- a/packages/client/src/components/MkGoogle.vue
+++ b/packages/client/src/components/MkGoogle.vue
@@ -52,7 +52,7 @@ const search = () => {
 		margin: 0;
 		padding: 0 16px;
 		border: solid 1px var(--divider);
-		border-left: none;
+		border-inline-start: none;
 		border-radius: 0 4px 4px 0;
 
 		&:active {
diff --git a/packages/client/src/components/MkImageViewer.vue b/packages/client/src/components/MkImageViewer.vue
index a75928be..aa6378e8 100644
--- a/packages/client/src/components/MkImageViewer.vue
+++ b/packages/client/src/components/MkImageViewer.vue
@@ -84,9 +84,9 @@ const modal = ref<InstanceType<typeof MkModal>>();
 		opacity: 0.8;
 
 		> span + span {
-			margin-left: 0.5em;
-			padding-left: 0.5em;
-			border-left: solid 1px rgba(255, 255, 255, 0.5);
+			margin-inline-start: 0.5em;
+			padding-inline-start: 0.5em;
+			border-inline-start: solid 1px rgba(255, 255, 255, 0.5);
 		}
 	}
 }
diff --git a/packages/client/src/components/MkInfo.vue b/packages/client/src/components/MkInfo.vue
index 1247903a..f62f1677 100644
--- a/packages/client/src/components/MkInfo.vue
+++ b/packages/client/src/components/MkInfo.vue
@@ -80,10 +80,10 @@ function close() {
 	}
 
 	> i {
-		margin-right: 4px;
+		margin-inline-end: 4px;
 	}
 	> .close {
-		margin-left: auto;
+		margin-inline-start: auto;
 		float: right;
 	}
 }
diff --git a/packages/client/src/components/MkInstanceCardMini.vue b/packages/client/src/components/MkInstanceCardMini.vue
index 54b4b319..bd7556f1 100644
--- a/packages/client/src/components/MkInstanceCardMini.vue
+++ b/packages/client/src/components/MkInstanceCardMini.vue
@@ -59,7 +59,7 @@ function getInstanceIcon(instance): string {
 		height: ($bodyTitleHieght + $bodyInfoHieght);
 		object-fit: cover;
 		border-radius: 4px;
-		margin-right: 10px;
+		margin-inline-end: 10px;
 	}
 
 	> :global(.body) {
@@ -67,7 +67,7 @@ function getInstanceIcon(instance): string {
 		overflow: hidden;
 		font-size: 0.9em;
 		color: var(--fg);
-		padding-right: 8px;
+		padding-inline-end: 8px;
 
 		> :global(.host) {
 			display: block;
diff --git a/packages/client/src/components/MkInstanceSelectDialog.vue b/packages/client/src/components/MkInstanceSelectDialog.vue
index e328695e..3075f0ad 100644
--- a/packages/client/src/components/MkInstanceSelectDialog.vue
+++ b/packages/client/src/components/MkInstanceSelectDialog.vue
@@ -169,7 +169,7 @@ const cancel = () => {
 					> .icon {
 						width: 16px;
 						height: 16px;
-						margin-right: 8px;
+						margin-inline-end: 8px;
 						float: left;
 					}
 				}
diff --git a/packages/client/src/components/MkInstanceStats.vue b/packages/client/src/components/MkInstanceStats.vue
index 9e4ff2b5..7aee0478 100644
--- a/packages/client/src/components/MkInstanceStats.vue
+++ b/packages/client/src/components/MkInstanceStats.vue
@@ -222,7 +222,7 @@ onMounted(() => {
 				> .title {
 					position: absolute;
 					top: 24px;
-					left: 24px;
+					inset-inline-start: 24px;
 				}
 			}
 
diff --git a/packages/client/src/components/MkInstanceTicker.vue b/packages/client/src/components/MkInstanceTicker.vue
index a365cbc8..65d7a85c 100644
--- a/packages/client/src/components/MkInstanceTicker.vue
+++ b/packages/client/src/components/MkInstanceTicker.vue
@@ -112,7 +112,7 @@ function getInstanceIcon(instance): string {
 
 	> .name {
 		display: none;
-		margin-left: 4px;
+		margin-inline-start: 4px;
 		font-size: 0.85em;
 		vertical-align: top;
 		font-weight: bold;
diff --git a/packages/client/src/components/MkKeyValue.vue b/packages/client/src/components/MkKeyValue.vue
index a454ea94..e4d47dd8 100644
--- a/packages/client/src/components/MkKeyValue.vue
+++ b/packages/client/src/components/MkKeyValue.vue
@@ -9,7 +9,7 @@
 				v-if="copy"
 				v-tooltip="i18n.ts.copy"
 				class="_textButton"
-				style="margin-left: 0.5em"
+				style="margin-inline-start: 0.5em"
 				@click="copy_"
 			>
 				<i :class="icon('ph-clipboard-text', false)"></i>
diff --git a/packages/client/src/components/MkLaunchPad.vue b/packages/client/src/components/MkLaunchPad.vue
index 9e194f8e..7893e169 100644
--- a/packages/client/src/components/MkLaunchPad.vue
+++ b/packages/client/src/components/MkLaunchPad.vue
@@ -121,7 +121,7 @@ function close() {
 	box-sizing: border-box;
 	overflow: auto;
 	overscroll-behavior: contain;
-	text-align: left;
+	text-align: initial;
 	border-radius: 16px;
 
 	&.asDrawer {
@@ -169,13 +169,13 @@ function close() {
 			> .indicator {
 				position: absolute;
 				top: 32px;
-				left: 32px;
+				inset-inline-start: 32px;
 				color: var(--indicator);
 				font-size: 8px;
 
 				@media (max-width: 500px) {
 					top: 16px;
-					left: 16px;
+					inset-inline-start: 16px;
 				}
 			}
 
diff --git a/packages/client/src/components/MkLink.vue b/packages/client/src/components/MkLink.vue
index b49bac86..3608b01a 100644
--- a/packages/client/src/components/MkLink.vue
+++ b/packages/client/src/components/MkLink.vue
@@ -59,7 +59,7 @@ useTooltip(el, (showing) => {
 	word-break: break-all;
 
 	> .icon {
-		padding-left: 2px;
+		padding-inline-start: 2px;
 		font-size: 0.9em;
 	}
 }
diff --git a/packages/client/src/components/MkMedia.vue b/packages/client/src/components/MkMedia.vue
index dad2f9e7..bd816230 100644
--- a/packages/client/src/components/MkMedia.vue
+++ b/packages/client/src/components/MkMedia.vue
@@ -205,7 +205,7 @@ watch(
 		border-radius: 6px;
 		overflow: hidden;
 		top: 12px;
-		right: 12px;
+		inset-inline-end: 12px;
 		> * {
 			background-color: var(--accentedBg);
 			-webkit-backdrop-filter: var(--blur, blur(15px));
@@ -241,7 +241,7 @@ watch(
 			display: inline-block;
 			font-size: 14px;
 			font-weight: bold;
-			left: 12px;
+			inset-inline-start: 12px;
 			opacity: 0.5;
 			padding: 0 6px;
 			text-align: center;
diff --git a/packages/client/src/components/MkMediaBanner.vue b/packages/client/src/components/MkMediaBanner.vue
index 8c3fd680..155ee987 100644
--- a/packages/client/src/components/MkMediaBanner.vue
+++ b/packages/client/src/components/MkMediaBanner.vue
@@ -114,7 +114,7 @@ onMounted(() => {
 		}
 
 		> *:not(:last-child) {
-			margin-right: 0.2em;
+			margin-inline-end: 0.2em;
 		}
 
 		> .icon {
diff --git a/packages/client/src/components/MkMediaCaption.vue b/packages/client/src/components/MkMediaCaption.vue
index b44fa0d5..8cfe1826 100644
--- a/packages/client/src/components/MkMediaCaption.vue
+++ b/packages/client/src/components/MkMediaCaption.vue
@@ -207,7 +207,7 @@ export default defineComponent({
 	flex-direction: row;
 	overflow: scroll;
 	position: fixed;
-	left: 0;
+	inset-inline-start: 0;
 	top: 0;
 }
 @media (max-width: 850px) {
@@ -245,7 +245,7 @@ export default defineComponent({
 		> .text-count {
 			opacity: 0.7;
 			position: absolute;
-			right: 0;
+			inset-inline-end: 0;
 		}
 	}
 
@@ -318,9 +318,9 @@ export default defineComponent({
 		opacity: 0.8;
 
 		> span + span {
-			margin-left: 0.5em;
-			padding-left: 0.5em;
-			border-left: solid 1px rgba(255, 255, 255, 0.5);
+			margin-inline-start: 0.5em;
+			padding-inline-start: 0.5em;
+			border-inline-start: solid 1px rgba(255, 255, 255, 0.5);
 		}
 	}
 }
diff --git a/packages/client/src/components/MkMediaList.vue b/packages/client/src/components/MkMediaList.vue
index 0d6f098f..8b0077bd 100644
--- a/packages/client/src/components/MkMediaList.vue
+++ b/packages/client/src/components/MkMediaList.vue
@@ -312,7 +312,7 @@ const previewableCount = props.mediaList.filter((media) =>
 
 	position: absolute;
 	bottom: 30px;
-	left: 50%;
+	inset-inline-start: 50%;
 	transform: translateX(-50%);
 
 	width: 75%;
diff --git a/packages/client/src/components/MkMenu.vue b/packages/client/src/components/MkMenu.vue
index 1054061d..35fb5a6b 100644
--- a/packages/client/src/components/MkMenu.vue
+++ b/packages/client/src/components/MkMenu.vue
@@ -359,7 +359,7 @@ onBeforeUnmount(() => {
 		white-space: nowrap;
 		font-size: 0.9em;
 		line-height: 20px;
-		text-align: left;
+		text-align: initial;
 		outline: none;
 
 		&:before {
@@ -367,8 +367,8 @@ onBeforeUnmount(() => {
 			display: block;
 			position: absolute;
 			top: 0;
-			left: 0;
-			right: 0;
+			inset-inline-start: 0;
+			inset-inline-end: 0;
 			margin: auto;
 			width: calc(100% - 16px);
 			margin-bottom: 0.2rem;
@@ -472,7 +472,7 @@ onBeforeUnmount(() => {
 			cursor: default;
 
 			> .caret {
-				margin-left: auto;
+				margin-inline-start: auto;
 			}
 
 			&.childShowing {
@@ -486,12 +486,12 @@ onBeforeUnmount(() => {
 		}
 
 		> i {
-			margin-right: 5px;
+			margin-inline-end: 5px;
 			width: 20px;
 		}
 
 		> .avatar {
-			margin-right: 5px;
+			margin-inline-end: 5px;
 			width: 20px;
 			height: 20px;
 		}
@@ -499,7 +499,7 @@ onBeforeUnmount(() => {
 		> .indicator {
 			position: absolute;
 			top: 5px;
-			left: 13px;
+			inset-inline-start: 13px;
 			color: var(--indicator);
 			font-size: 12px;
 		}
@@ -531,7 +531,7 @@ onBeforeUnmount(() => {
 			}
 
 			> i {
-				margin-right: 14px;
+				margin-inline-end: 14px;
 				width: 24px;
 			}
 		}
diff --git a/packages/client/src/components/MkModal.vue b/packages/client/src/components/MkModal.vue
index f6b52a62..0f42db59 100644
--- a/packages/client/src/components/MkModal.vue
+++ b/packages/client/src/components/MkModal.vue
@@ -539,8 +539,8 @@ defineExpose({
 			position: fixed;
 			top: 0;
 			bottom: 0;
-			left: 0;
-			right: 0;
+			inset-inline-start: 0;
+			inset-inline-end: 0;
 			margin: auto;
 			padding: 32px;
 			// TODO: mask-imageはiOSだとやたら重い。なんとかしたい
@@ -604,7 +604,7 @@ defineExpose({
 	&.drawer {
 		position: fixed;
 		top: 0;
-		left: 0;
+		inset-inline-start: 0;
 		width: 100%;
 		height: 100%;
 		overflow: clip;
@@ -612,8 +612,8 @@ defineExpose({
 		> .content {
 			position: fixed;
 			bottom: 0;
-			left: 0;
-			right: 0;
+			inset-inline-start: 0;
+			inset-inline-end: 0;
 			margin: auto;
 
 			> ::v-deep(*) {
diff --git a/packages/client/src/components/MkModalPageWindow.vue b/packages/client/src/components/MkModalPageWindow.vue
index bd443790..11ac9b08 100644
--- a/packages/client/src/components/MkModalPageWindow.vue
+++ b/packages/client/src/components/MkModalPageWindow.vue
@@ -196,7 +196,7 @@ function onContextmenu(ev: MouseEvent) {
 		@media (max-width: 500px) {
 			height: $height-narrow;
 			line-height: $height-narrow;
-			padding-left: 16px;
+			padding-inline-start: 16px;
 
 			> button {
 				height: $height-narrow;
@@ -208,7 +208,7 @@ function onContextmenu(ev: MouseEvent) {
 			flex: 1;
 
 			> .icon {
-				margin-right: 0.5em;
+				margin-inline-end: 0.5em;
 			}
 		}
 	}
diff --git a/packages/client/src/components/MkModalWindow.vue b/packages/client/src/components/MkModalWindow.vue
index cab0f07a..a7bc4765 100644
--- a/packages/client/src/components/MkModalWindow.vue
+++ b/packages/client/src/components/MkModalWindow.vue
@@ -148,7 +148,7 @@ defineExpose({
 		> .title {
 			flex: 1;
 			line-height: $height;
-			padding-left: 32px;
+			padding-inline-start: 32px;
 			font-weight: bold;
 			white-space: nowrap;
 			overflow: hidden;
@@ -157,12 +157,12 @@ defineExpose({
 
 			@media (max-width: 500px) {
 				line-height: $height-narrow;
-				padding-left: 16px;
+				padding-inline-start: 16px;
 			}
 		}
 
 		> button + .title {
-			padding-left: 0;
+			padding-inline-start: 0;
 		}
 	}
 
diff --git a/packages/client/src/components/MkMoved.vue b/packages/client/src/components/MkMoved.vue
index abb2d14a..88eeac25 100644
--- a/packages/client/src/components/MkMoved.vue
+++ b/packages/client/src/components/MkMoved.vue
@@ -1,6 +1,9 @@
 <template>
 	<div class="msjugskd _block">
-		<i :class="icon('ph-airplane-takeoff')" style="margin-right: 8px" />
+		<i
+			:class="icon('ph-airplane-takeoff')"
+			style="margin-inline-end: 8px"
+		/>
 		{{ i18n.ts.accountMoved }}
 		<MkMention class="link" :username="acct" :host="host" />
 	</div>
@@ -26,7 +29,7 @@ defineProps<{
 	border-radius: var(--radius);
 
 	> .link {
-		margin-left: 4px;
+		margin-inline-start: 4px;
 		color: var(--accent);
 	}
 }
diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue
index f42642f6..95a99c82 100644
--- a/packages/client/src/components/MkNote.vue
+++ b/packages/client/src/components/MkNote.vue
@@ -693,8 +693,8 @@ defineExpose({
 			position: absolute;
 			z-index: 10;
 			top: 0;
-			left: 0;
-			right: 0;
+			inset-inline-start: 0;
+			inset-inline-end: 0;
 			bottom: 0;
 			margin: auto;
 			width: calc(100% - 8px);
@@ -721,8 +721,8 @@ defineExpose({
 				display: block;
 				margin-bottom: -4px;
 				margin-top: 16px;
-				border-left: 2px solid currentColor;
-				margin-left: calc((var(--avatarSize) / 2) - 1px);
+				border-inline-start: 2px solid currentColor;
+				margin-inline-start: calc((var(--avatarSize) / 2) - 1px);
 				opacity: 0.25;
 			}
 		}
@@ -747,14 +747,14 @@ defineExpose({
 			z-index: 2;
 			width: 0;
 			display: flex;
-			margin-right: 0;
+			margin-inline-end: 0;
 			margin-top: 0;
 			flex-grow: 0;
 			pointer-events: none;
 		}
 
 		> div > i {
-			margin-left: -0.5px;
+			margin-inline-start: -0.5px;
 		}
 		> .info {
 			display: flex;
@@ -764,11 +764,11 @@ defineExpose({
 			color: #f6c177;
 
 			> i {
-				margin-right: 4px;
+				margin-inline-end: 4px;
 			}
 
 			> .hide {
-				margin-left: auto;
+				margin-inline-start: auto;
 				color: inherit;
 			}
 		}
@@ -781,7 +781,7 @@ defineExpose({
 			cursor: pointer;
 
 			> i {
-				margin-right: 4px;
+				margin-inline-end: 4px;
 			}
 
 			> span {
@@ -796,7 +796,7 @@ defineExpose({
 			}
 
 			> .info {
-				margin-left: auto;
+				margin-inline-start: auto;
 				font-size: 0.9em;
 				display: flex;
 
@@ -806,7 +806,7 @@ defineExpose({
 					display: inline-flex;
 					align-items: center;
 					> .dropdownIcon {
-						margin-right: 4px;
+						margin-inline-end: 4px;
 					}
 				}
 			}
@@ -818,9 +818,9 @@ defineExpose({
 				&::after {
 					content: "";
 					position: absolute;
-					border-left: 2px solid currentColor;
+					border-inline-start: 2px solid currentColor;
 					border-top: 2px solid currentColor;
-					margin-left: calc(var(--avatarSize) / 2 - 1px);
+					margin-inline-start: calc(var(--avatarSize) / 2 - 1px);
 					width: calc(var(--avatarSize) / 2 + 14px);
 					border-top-left-radius: calc(var(--avatarSize) / 4);
 					top: calc(50% - 1px);
@@ -836,7 +836,7 @@ defineExpose({
 				height: 1.2em;
 				border-radius: 2em;
 				overflow: hidden;
-				margin-right: 0.4em;
+				margin-inline-end: 0.4em;
 				background: var(--panelHighlight);
 			}
 			.username {
@@ -884,7 +884,7 @@ defineExpose({
 				height: var(--avatarSize);
 				position: relative;
 				top: 0;
-				left: 0;
+				inset-inline-start: 0;
 			}
 			> .header {
 				width: 0;
@@ -956,7 +956,7 @@ defineExpose({
 						transition: background 0.2s;
 					}
 					&:first-of-type {
-						margin-left: -0.5em;
+						margin-inline-start: -0.5em;
 						&::before {
 							border-radius: 100px 0 0 100px;
 						}
@@ -1003,7 +1003,7 @@ defineExpose({
 				margin-top: 0px;
 			}
 			> .line {
-				margin-right: 0;
+				margin-inline-end: 0;
 				&::before {
 					margin-top: 8px;
 				}
@@ -1016,7 +1016,7 @@ defineExpose({
 				padding-top: 104px;
 			}
 			> .main > .header-container > .avatar {
-				margin-right: 10px;
+				margin-inline-end: 10px;
 				// top: calc(14px + var(--stickyTop, 0px));
 			}
 		}
diff --git a/packages/client/src/components/MkNoteDetailed.vue b/packages/client/src/components/MkNoteDetailed.vue
index 0bbae02e..f74121b2 100644
--- a/packages/client/src/components/MkNoteDetailed.vue
+++ b/packages/client/src/components/MkNoteDetailed.vue
@@ -500,8 +500,8 @@ onUnmounted(() => {
 			position: absolute;
 			z-index: 10;
 			top: 0;
-			left: 0;
-			right: 0;
+			inset-inline-start: 0;
+			inset-inline-end: 0;
 			bottom: 0;
 			margin: auto;
 			width: calc(100% - 8px);
@@ -539,7 +539,7 @@ onUnmounted(() => {
 
 	> :deep(.chips) {
 		padding-block: 6px 12px;
-		padding-left: 32px;
+		padding-inline-start: 32px;
 		&:last-child {
 			margin-bottom: 12px;
 		}
@@ -651,7 +651,7 @@ onUnmounted(() => {
 			padding: 12px 0 0 0;
 			font-size: 1.05rem;
 			> .header > .body {
-				padding-left: 10px;
+				padding-inline-start: 10px;
 			}
 		}
 		> .clips,
@@ -660,7 +660,7 @@ onUnmounted(() => {
 			padding-inline: 16px !important;
 		}
 		> :deep(.underline) {
-			padding-left: 16px !important;
+			padding-inline-start: 16px !important;
 		}
 	}
 
diff --git a/packages/client/src/components/MkNoteHeader.vue b/packages/client/src/components/MkNoteHeader.vue
index 5f580faa..ef6b82b6 100644
--- a/packages/client/src/components/MkNoteHeader.vue
+++ b/packages/client/src/components/MkNoteHeader.vue
@@ -31,7 +31,7 @@
 								})
 							"
 							:class="icon('ph-pencil', false)"
-							style="margin-left: 0.4rem"
+							style="margin-inline-start: 0.4rem"
 						></i>
 					</MkA>
 					<MkVisibility :note="note" />
@@ -97,7 +97,7 @@ function openServerInfo() {
 	> .avatar {
 		width: 3.7em;
 		height: 3.7em;
-		margin-right: 1em;
+		margin-inline-end: 1em;
 	}
 	> .user-info {
 		width: 0;
@@ -166,7 +166,7 @@ function openServerInfo() {
 		.info {
 			display: inline-flex;
 			flex-shrink: 0;
-			margin-left: 0.5em;
+			margin-inline-start: 0.5em;
 			font-size: 0.9em;
 			.created-at {
 				max-width: 100%;
@@ -177,7 +177,7 @@ function openServerInfo() {
 
 		.ticker {
 			display: inline-flex;
-			margin-left: 0.5em;
+			margin-inline-start: 0.5em;
 			vertical-align: middle;
 			> .name {
 				display: none;
diff --git a/packages/client/src/components/MkNotePreview.vue b/packages/client/src/components/MkNotePreview.vue
index 62bcc0f0..1c0e6954 100644
--- a/packages/client/src/components/MkNotePreview.vue
+++ b/packages/client/src/components/MkNotePreview.vue
@@ -79,7 +79,7 @@ defineProps<{
 				overflow-wrap: break-word;
 
 				> .text {
-					margin-right: 8px;
+					margin-inline-end: 8px;
 				}
 			}
 
diff --git a/packages/client/src/components/MkNoteSub.vue b/packages/client/src/components/MkNoteSub.vue
index 53ff99ed..b03e3fc0 100644
--- a/packages/client/src/components/MkNoteSub.vue
+++ b/packages/client/src/components/MkNoteSub.vue
@@ -483,7 +483,7 @@ function noteClick(e) {
 	outline: none;
 	&.children {
 		padding: 10px 0 0 var(--indent);
-		padding-left: var(--indent) !important;
+		padding-inline-start: var(--indent) !important;
 		font-size: 1em;
 		cursor: auto;
 
@@ -496,7 +496,7 @@ function noteClick(e) {
 		display: flex;
 
 		> .avatar-container {
-			margin-right: 8px;
+			margin-inline-end: 8px;
 			z-index: 2;
 			> .avatar {
 				flex-shrink: 0;
@@ -561,7 +561,7 @@ function noteClick(e) {
 						transition: background 0.2s;
 					}
 					&:first-of-type {
-						margin-left: -0.5em;
+						margin-inline-start: -0.5em;
 						&::before {
 							border-radius: 100px 0 0 100px;
 						}
@@ -607,19 +607,19 @@ function noteClick(e) {
 	&.reply,
 	&.reply-to {
 		> .main > .body {
-			margin-right: -24px;
-			padding-right: 24px;
+			margin-inline-end: -24px;
+			padding-inline-end: 24px;
 			margin-top: -12px;
 			padding-top: 12px;
-			margin-left: calc(0px - var(--avatarSize) - 32px);
-			padding-left: calc(var(--avatarSize) + 32px);
+			margin-inline-start: calc(0px - var(--avatarSize) - 32px);
+			padding-inline-start: calc(var(--avatarSize) + 32px);
 			border-radius: var(--radius);
 		}
 	}
 	&.reply-to {
 		> .main > .body {
-			margin-left: calc(0px - var(--avatarSize) - 38px);
-			padding-left: calc(var(--avatarSize) + 38px);
+			margin-inline-start: calc(0px - var(--avatarSize) - 38px);
+			padding-inline-start: calc(var(--avatarSize) + 38px);
 			margin-top: -16px;
 			padding-top: 16px;
 		}
@@ -627,7 +627,7 @@ function noteClick(e) {
 	&.reply {
 		--avatarSize: 38px;
 		.avatar-container {
-			margin-right: 8px !important;
+			margin-inline-end: 8px !important;
 		}
 	}
 	> .reply,
@@ -651,7 +651,7 @@ function noteClick(e) {
 			flex-grow: 0 !important;
 			margin-top: -10px !important;
 			margin-bottom: 10px !important;
-			margin-right: 10px !important;
+			margin-inline-end: 10px !important;
 			&::before {
 				border-left-style: dashed !important;
 				border-bottom-left-radius: 100px !important;
@@ -706,7 +706,7 @@ function noteClick(e) {
 				display: flex;
 				flex-direction: column;
 				align-items: center;
-				margin-right: 14px;
+				margin-inline-end: 14px;
 				width: var(--avatarSize);
 				> .avatar {
 					width: var(--avatarSize);
@@ -727,8 +727,8 @@ function noteClick(e) {
 			&::before {
 				content: "";
 				position: absolute;
-				border-left: 2px solid currentColor;
-				margin-left: calc((var(--avatarSize) / 2) - 1px);
+				border-inline-start: 2px solid currentColor;
+				margin-inline-start: calc((var(--avatarSize) / 2) - 1px);
 				width: calc(var(--indent) / 2);
 				inset-block: 0;
 				min-height: 8px;
@@ -753,7 +753,7 @@ function noteClick(e) {
 		> .line {
 			position: absolute;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 			bottom: 0;
 		}
 	}
@@ -763,15 +763,15 @@ function noteClick(e) {
 		> .line {
 			position: absolute;
 			z-index: 2;
-			left: 0;
+			inset-inline-start: 0;
 			top: 0;
 			opacity: 0.25;
 			&::after {
 				content: "";
 				position: absolute;
-				border-left: 2px solid currentColor;
+				border-inline-start: 2px solid currentColor;
 				border-bottom: 2px solid currentColor;
-				margin-left: calc((var(--avatarSize) / 2) - 1px);
+				margin-inline-start: calc((var(--avatarSize) / 2) - 1px);
 				width: calc(var(--indent) / 2);
 				height: calc((var(--avatarSize) / 2));
 				border-bottom-left-radius: calc(var(--indent) / 2);
@@ -794,7 +794,7 @@ function noteClick(e) {
 		// 	border-top: 1px solid var(--X13);
 		// 	position: absolute;
 		// 	bottom: 0;
-		// 	margin-left: calc(var(--avatarSize) + 12px);
+		// 	margin-inline-start: calc(var(--avatarSize) + 12px);
 		// 	inset-inline: 0;
 		// }
 	}
@@ -822,7 +822,7 @@ function noteClick(e) {
 				--indent: 35px;
 			}
 			> .children:not(.single) {
-				padding-left: 28px !important;
+				padding-inline-start: 28px !important;
 			}
 		}
 		&.reply-to {
@@ -833,7 +833,7 @@ function noteClick(e) {
 			margin-bottom: 0 !important;
 		}
 		> .main > .avatar-container {
-			margin-right: 10px;
+			margin-inline-end: 10px;
 		}
 		&:first-child > .main > .body {
 			margin-top: -20px;
diff --git a/packages/client/src/components/MkNotification.vue b/packages/client/src/components/MkNotification.vue
index 7c158d06..71173eda 100644
--- a/packages/client/src/components/MkNotification.vue
+++ b/packages/client/src/components/MkNotification.vue
@@ -399,7 +399,7 @@ useTooltip(reactionRef, (showing) => {
 		flex-shrink: 0;
 		width: 42px;
 		height: 42px;
-		margin-right: 8px;
+		margin-inline-end: 8px;
 
 		> .icon {
 			display: block;
@@ -412,7 +412,7 @@ useTooltip(reactionRef, (showing) => {
 			position: absolute;
 			z-index: 1;
 			bottom: -2px;
-			right: -2px;
+			inset-inline-end: -2px;
 			width: 20px;
 			height: 20px;
 			box-sizing: border-box;
@@ -496,7 +496,7 @@ useTooltip(reactionRef, (showing) => {
 			}
 
 			> .time {
-				margin-left: auto;
+				margin-inline-start: auto;
 				font-size: 0.9em;
 			}
 		}
@@ -520,11 +520,11 @@ useTooltip(reactionRef, (showing) => {
 			}
 
 			> i:first-child {
-				margin-right: 4px;
+				margin-inline-end: 4px;
 			}
 
 			> i:last-child {
-				margin-left: 4px;
+				margin-inline-start: 4px;
 			}
 		}
 	}
diff --git a/packages/client/src/components/MkNotificationToast.vue b/packages/client/src/components/MkNotificationToast.vue
index c5ca37d3..54d66ad2 100644
--- a/packages/client/src/components/MkNotificationToast.vue
+++ b/packages/client/src/components/MkNotificationToast.vue
@@ -53,7 +53,7 @@ onMounted(() => {
 
 .mk-notification-toast {
 	position: fixed;
-	left: 0;
+	inset-inline-start: 0;
 	width: 250px;
 	top: 32px;
 	padding: 0 32px;
diff --git a/packages/client/src/components/MkObjectView.value.vue b/packages/client/src/components/MkObjectView.value.vue
index 99836f22..aa384a8e 100644
--- a/packages/client/src/components/MkObjectView.value.vue
+++ b/packages/client/src/components/MkObjectView.value.vue
@@ -150,7 +150,7 @@ export default defineComponent({
 
 		> .element {
 			display: block;
-			padding-left: 16px;
+			padding-inline-start: 16px;
 		}
 	}
 
@@ -164,7 +164,7 @@ export default defineComponent({
 
 		> .kv {
 			display: block;
-			padding-left: 16px;
+			padding-inline-start: 16px;
 
 			> .toggle {
 				width: 16px;
@@ -178,7 +178,7 @@ export default defineComponent({
 
 			> .k {
 				display: inline;
-				margin-right: 8px;
+				margin-inline-end: 8px;
 			}
 
 			> .v {
diff --git a/packages/client/src/components/MkPagePreview.vue b/packages/client/src/components/MkPagePreview.vue
index 034c6fed..eee861d0 100644
--- a/packages/client/src/components/MkPagePreview.vue
+++ b/packages/client/src/components/MkPagePreview.vue
@@ -71,7 +71,7 @@ defineProps<{
 		}
 
 		& + article {
-			left: 100px;
+			inset-inline-start: 100px;
 			width: calc(100% - 100px);
 		}
 	}
@@ -103,7 +103,7 @@ defineProps<{
 				display: inline-block;
 				width: 16px;
 				height: 16px;
-				margin-right: 4px;
+				margin-inline-end: 4px;
 				vertical-align: top;
 			}
 
@@ -125,7 +125,7 @@ defineProps<{
 			height: 100px;
 
 			& + article {
-				left: 0;
+				inset-inline-start: 0;
 				width: 100%;
 			}
 		}
diff --git a/packages/client/src/components/MkPageWindow.vue b/packages/client/src/components/MkPageWindow.vue
index d237f180..0c00cd8e 100644
--- a/packages/client/src/components/MkPageWindow.vue
+++ b/packages/client/src/components/MkPageWindow.vue
@@ -17,7 +17,7 @@
 					v-if="pageMetadata.value.icon"
 					class="icon"
 					:class="pageMetadata.value.icon"
-					style="margin-right: 0.5em"
+					style="margin-inline-end: 0.5em"
 				></i>
 				<span>{{ pageMetadata.value.title }}</span>
 			</template>
diff --git a/packages/client/src/components/MkPagination.vue b/packages/client/src/components/MkPagination.vue
index da8e7e7e..f12e7ed1 100644
--- a/packages/client/src/components/MkPagination.vue
+++ b/packages/client/src/components/MkPagination.vue
@@ -491,8 +491,8 @@ defineExpose({
 
 .cxiknjgy {
 	> .button {
-		margin-left: auto;
-		margin-right: auto;
+		margin-inline-start: auto;
+		margin-inline-end: auto;
 	}
 }
 .list > :deep(._button) {
diff --git a/packages/client/src/components/MkPoll.vue b/packages/client/src/components/MkPoll.vue
index 48211f17..8b66ed23 100644
--- a/packages/client/src/components/MkPoll.vue
+++ b/packages/client/src/components/MkPoll.vue
@@ -167,7 +167,7 @@ const vote = async (id) => {
 			> .backdrop {
 				position: absolute;
 				top: 0;
-				left: 0;
+				inset-inline-start: 0;
 				height: 100%;
 				background: var(--accent);
 				background: linear-gradient(
@@ -186,12 +186,12 @@ const vote = async (id) => {
 				border-radius: 3px;
 
 				> i {
-					margin-right: 4px;
+					margin-inline-end: 4px;
 					color: var(--accent);
 				}
 
 				> .votes {
-					margin-left: 4px;
+					margin-inline-start: 4px;
 					opacity: 0.7;
 				}
 			}
diff --git a/packages/client/src/components/MkPollEditor.vue b/packages/client/src/components/MkPollEditor.vue
index 622ac7fd..abacb413 100644
--- a/packages/client/src/components/MkPollEditor.vue
+++ b/packages/client/src/components/MkPollEditor.vue
@@ -195,7 +195,7 @@ watch(
 		color: #f00;
 
 		> i {
-			margin-right: 4px;
+			margin-inline-end: 4px;
 		}
 	}
 
diff --git a/packages/client/src/components/MkPostForm.vue b/packages/client/src/components/MkPostForm.vue
index 175e6412..917eee7e 100644
--- a/packages/client/src/components/MkPostForm.vue
+++ b/packages/client/src/components/MkPostForm.vue
@@ -99,7 +99,9 @@
 				</button>
 			</div>
 			<div v-if="visibility === 'specified'" class="to-specified">
-				<span style="margin-right: 8px">{{ i18n.ts.recipient }}</span>
+				<span style="margin-inline-end: 8px">{{
+					i18n.ts.recipient
+				}}</span>
 				<div class="visibleUsers">
 					<span v-for="u in visibleUsers" :key="u.id">
 						<MkAcct :user="u" />
@@ -1120,7 +1122,7 @@ onMounted(() => {
 		> .right {
 			position: absolute;
 			top: 0;
-			right: 0;
+			inset-inline-end: 0;
 			display: flex;
 			align-items: center;
 
@@ -1135,7 +1137,7 @@ onMounted(() => {
 				margin: 0 0 0 8px;
 
 				& + .localOnly {
-					margin-left: 0 !important;
+					margin-inline-start: 0 !important;
 				}
 
 				> span:only-child > i {
@@ -1182,7 +1184,7 @@ onMounted(() => {
 				}
 
 				> i {
-					margin-left: 6px;
+					margin-inline-start: 6px;
 				}
 			}
 		}
diff --git a/packages/client/src/components/MkPostFormAttaches.vue b/packages/client/src/components/MkPostFormAttaches.vue
index a879bd5d..ea051c58 100644
--- a/packages/client/src/components/MkPostFormAttaches.vue
+++ b/packages/client/src/components/MkPostFormAttaches.vue
@@ -172,7 +172,7 @@ function showFileMenu(file, ev: MouseEvent) {
 			position: relative;
 			width: 64px;
 			height: 64px;
-			margin-right: 4px;
+			margin-inline-end: 4px;
 			border-radius: 4px;
 			cursor: move;
 
@@ -193,7 +193,7 @@ function showFileMenu(file, ev: MouseEvent) {
 				width: 64px;
 				height: 64px;
 				top: 0;
-				left: 0;
+				inset-inline-start: 0;
 				z-index: 2;
 				background: var(--header);
 				color: var(--fg);
@@ -209,7 +209,7 @@ function showFileMenu(file, ev: MouseEvent) {
 		display: block;
 		position: absolute;
 		top: 8px;
-		right: 8px;
+		inset-inline-end: 8px;
 		margin: 0;
 		padding: 0;
 	}
diff --git a/packages/client/src/components/MkQuoteButton.vue b/packages/client/src/components/MkQuoteButton.vue
index baa09d71..24189e0f 100644
--- a/packages/client/src/components/MkQuoteButton.vue
+++ b/packages/client/src/components/MkQuoteButton.vue
@@ -51,7 +51,7 @@ function quote(): void {
 
 	> .count {
 		display: inline;
-		margin-left: 8px;
+		margin-inline-start: 8px;
 		opacity: 0.7;
 	}
 }
diff --git a/packages/client/src/components/MkReactedUsers.vue b/packages/client/src/components/MkReactedUsers.vue
index f906c1b0..dbce566a 100644
--- a/packages/client/src/components/MkReactedUsers.vue
+++ b/packages/client/src/components/MkReactedUsers.vue
@@ -18,7 +18,7 @@
 					:custom-emojis="note.emojis"
 					style="max-width: 100%"
 				/>
-				<span style="margin-left: 4px">{{
+				<span style="margin-inline-start: 4px">{{
 					note.reactions[reaction]
 				}}</span>
 			</button>
diff --git a/packages/client/src/components/MkReactionsViewer.details.vue b/packages/client/src/components/MkReactionsViewer.details.vue
index 0d992ae4..3eb5edf7 100644
--- a/packages/client/src/components/MkReactionsViewer.details.vue
+++ b/packages/client/src/components/MkReactionsViewer.details.vue
@@ -69,11 +69,11 @@ const emit = defineEmits<{
 		flex: 1;
 		min-width: 0;
 		font-size: 0.95em;
-		border-left: solid 0.5px var(--divider);
-		padding-left: 10px;
-		margin-left: 10px;
-		margin-right: 14px;
-		text-align: left;
+		border-inline-start: solid 0.5px var(--divider);
+		padding-inline-start: 10px;
+		margin-inline-start: 10px;
+		margin-inline-end: 14px;
+		text-align: initial;
 
 		> .user {
 			line-height: 24px;
@@ -88,7 +88,7 @@ const emit = defineEmits<{
 			> .avatar {
 				width: 24px;
 				height: 24px;
-				margin-right: 3px;
+				margin-inline-end: 3px;
 			}
 		}
 	}
diff --git a/packages/client/src/components/MkRemoteCaution.vue b/packages/client/src/components/MkRemoteCaution.vue
index 23a7a731..64d5f98e 100644
--- a/packages/client/src/components/MkRemoteCaution.vue
+++ b/packages/client/src/components/MkRemoteCaution.vue
@@ -28,7 +28,7 @@ defineProps<{
 	border-radius: var(--radius);
 
 	> .link {
-		margin-left: 4px;
+		margin-inline-start: 4px;
 		color: var(--accent);
 	}
 }
diff --git a/packages/client/src/components/MkShowMoreButton.vue b/packages/client/src/components/MkShowMoreButton.vue
index 9b817e12..67a13435 100644
--- a/packages/client/src/components/MkShowMoreButton.vue
+++ b/packages/client/src/components/MkShowMoreButton.vue
@@ -39,7 +39,7 @@ defineExpose({
 	display: block;
 	position: absolute;
 	bottom: 0;
-	left: 0;
+	inset-inline-start: 0;
 	width: 100%;
 	padding: 20px;
 	margin-bottom: -10px;
diff --git a/packages/client/src/components/MkSparkle.vue b/packages/client/src/components/MkSparkle.vue
index f97a9d68..5bb484e3 100644
--- a/packages/client/src/components/MkSparkle.vue
+++ b/packages/client/src/components/MkSparkle.vue
@@ -138,7 +138,7 @@ onUnmounted(() => {
 	> svg {
 		position: absolute;
 		top: -32px;
-		left: -32px;
+		inset-inline-start: -32px;
 		pointer-events: none;
 	}
 }
diff --git a/packages/client/src/components/MkSubNoteContent.vue b/packages/client/src/components/MkSubNoteContent.vue
index a3b6e440..5b134e95 100644
--- a/packages/client/src/components/MkSubNoteContent.vue
+++ b/packages/client/src/components/MkSubNoteContent.vue
@@ -35,7 +35,7 @@
 		/>
 	</p>
 	<div class="wrmlmaau">
-		<div
+		<bdi
 			class="content"
 			:class="{
 				collapsed,
@@ -154,7 +154,7 @@
 				v-model="showContent"
 				:note="note"
 			/>
-		</div>
+		</bdi>
 		<MkButton
 			v-if="hasMfm && defaultStore.state.animatedMfm"
 			mini
@@ -270,7 +270,7 @@ function focusFooter(ev) {
 	display: inline-block;
 	border-radius: 6px;
 	padding: 0.2em 0.2em;
-	margin-right: 0.2em;
+	margin-inline-end: 0.2em;
 	color: var(--accent);
 	transition: background 0.2s;
 	&:hover,
@@ -286,7 +286,7 @@ function focusFooter(ev) {
 	margin-bottom: 10px;
 	overflow-wrap: break-word;
 	> .text {
-		margin-right: 8px;
+		margin-inline-end: 8px;
 	}
 }
 
@@ -296,7 +296,7 @@ function focusFooter(ev) {
 		> .body {
 			transition: filter 0.1s;
 			> .rp {
-				margin-left: 4px;
+				margin-inline-start: 4px;
 				font-style: oblique;
 				color: var(--renote);
 			}
@@ -304,7 +304,7 @@ function focusFooter(ev) {
 				display: inline-block;
 				border-radius: 6px;
 				padding: 0.2em 0.2em;
-				margin-right: 0.2em;
+				margin-inline-end: 0.2em;
 				color: var(--accent);
 				transition: background 0.2s;
 				&:hover,
@@ -393,8 +393,8 @@ function focusFooter(ev) {
 	}
 	> :deep(button) {
 		margin-top: 10px;
-		margin-left: 0;
-		margin-right: 0.4rem;
+		margin-inline-start: 0;
+		margin-inline-end: 0.4rem;
 	}
 	> .fade {
 		position: absolute;
diff --git a/packages/client/src/components/MkSuperMenu.vue b/packages/client/src/components/MkSuperMenu.vue
index ac7cdc01..f761b619 100644
--- a/packages/client/src/components/MkSuperMenu.vue
+++ b/packages/client/src/components/MkSuperMenu.vue
@@ -113,7 +113,7 @@ export default defineComponent({
 
 				> .icon {
 					width: 32px;
-					margin-right: 2px;
+					margin-inline-end: 2px;
 					flex-shrink: 0;
 					text-align: center;
 					opacity: 0.8;
@@ -123,7 +123,7 @@ export default defineComponent({
 					white-space: nowrap;
 					text-overflow: ellipsis;
 					overflow: hidden;
-					padding-right: 12px;
+					padding-inline-end: 12px;
 				}
 			}
 		}
@@ -136,8 +136,8 @@ export default defineComponent({
 				border-top: none;
 			}
 
-			margin-left: 0;
-			margin-right: 0;
+			margin-inline-start: 0;
+			margin-inline-end: 0;
 
 			> .title {
 				font-size: 1em;
@@ -160,13 +160,13 @@ export default defineComponent({
 
 					> .icon {
 						display: block;
-						margin-right: 0;
+						margin-inline-end: 0;
 						margin-bottom: 12px;
 						font-size: 1.5em;
 					}
 
 					> .text {
-						padding-right: 0;
+						padding-inline-end: 0;
 						width: 100%;
 						font-size: 0.8em;
 					}
diff --git a/packages/client/src/components/MkTab.vue b/packages/client/src/components/MkTab.vue
index 8e3108ec..7891b5b7 100644
--- a/packages/client/src/components/MkTab.vue
+++ b/packages/client/src/components/MkTab.vue
@@ -81,11 +81,11 @@ export default defineComponent({
 		}
 
 		&:not(:first-child) {
-			margin-left: 8px;
+			margin-inline-start: 8px;
 		}
 
 		> .icon {
-			margin-right: 6px;
+			margin-inline-end: 6px;
 		}
 
 		&:empty {
@@ -104,7 +104,7 @@ export default defineComponent({
 			black calc(100% - 90px),
 			transparent
 		);
-		padding-right: 90px !important;
+		padding-inline-end: 90px !important;
 		white-space: nowrap;
 
 		&::-webkit-scrollbar {
@@ -116,7 +116,7 @@ export default defineComponent({
 			align-items: center;
 			flex: unset;
 			margin: 0;
-			margin-right: 8px;
+			margin-inline-end: 8px;
 			padding: 0.5em 1em;
 			border-radius: 100px;
 			background: var(--buttonBg);
@@ -124,7 +124,7 @@ export default defineComponent({
 				margin-top: -0.1em;
 			}
 			> .count {
-				margin-right: -0.2em;
+				margin-inline-end: -0.2em;
 			}
 		}
 	}
diff --git a/packages/client/src/components/MkTagCloud.vue b/packages/client/src/components/MkTagCloud.vue
index 3a40fbde..d8912424 100644
--- a/packages/client/src/components/MkTagCloud.vue
+++ b/packages/client/src/components/MkTagCloud.vue
@@ -111,7 +111,7 @@ defineExpose({
 	> .tags {
 		position: absolute;
 		top: 999px;
-		left: 999px;
+		inset-inline-start: 999px;
 	}
 }
 </style>
diff --git a/packages/client/src/components/MkTimeline.vue b/packages/client/src/components/MkTimeline.vue
index 57a7600e..532fe940 100644
--- a/packages/client/src/components/MkTimeline.vue
+++ b/packages/client/src/components/MkTimeline.vue
@@ -333,9 +333,9 @@ defineExpose({
 			z-index: -1;
 		}
 		i {
-			margin-left: 0.7em;
-			border-left: 1px solid var(--accentedBg);
-			padding-left: 0.4em;
+			margin-inline-start: 0.7em;
+			border-inline-start: 1px solid var(--accentedBg);
+			padding-inline-start: 0.4em;
 		}
 	}
 }
diff --git a/packages/client/src/components/MkToast.vue b/packages/client/src/components/MkToast.vue
index 5ee7e500..351fb177 100644
--- a/packages/client/src/components/MkToast.vue
+++ b/packages/client/src/components/MkToast.vue
@@ -56,8 +56,8 @@ onMounted(() => {
 .mk-toast {
 	> .body {
 		position: fixed;
-		left: 0;
-		right: 0;
+		inset-inline-start: 0;
+		inset-inline-end: 0;
 		top: 0;
 		margin: 0 auto;
 		margin-top: 16px;
diff --git a/packages/client/src/components/MkTutorialDialog.vue b/packages/client/src/components/MkTutorialDialog.vue
index d73cf155..ea88d3f1 100644
--- a/packages/client/src/components/MkTutorialDialog.vue
+++ b/packages/client/src/components/MkTutorialDialog.vue
@@ -305,11 +305,11 @@ function close(res) {
 				}
 
 				&:first-child {
-					padding-right: 8px;
+					padding-inline-end: 8px;
 				}
 
 				&:last-child {
-					padding-left: 8px;
+					padding-inline-start: 8px;
 				}
 			}
 
@@ -319,7 +319,7 @@ function close(res) {
 		}
 
 		> .ok {
-			margin-left: auto;
+			margin-inline-start: auto;
 		}
 	}
 }
diff --git a/packages/client/src/components/MkUrlPreview.vue b/packages/client/src/components/MkUrlPreview.vue
index 8632ce71..89a232e2 100644
--- a/packages/client/src/components/MkUrlPreview.vue
+++ b/packages/client/src/components/MkUrlPreview.vue
@@ -267,7 +267,7 @@ onUnmounted(() => {
 				overflow: hidden;
 				> span {
 					font-weight: 600;
-					margin-right: 0.4em;
+					margin-inline-end: 0.4em;
 				}
 			}
 		}
diff --git a/packages/client/src/components/MkUserCardMini.vue b/packages/client/src/components/MkUserCardMini.vue
index 90349fb4..943ed812 100644
--- a/packages/client/src/components/MkUserCardMini.vue
+++ b/packages/client/src/components/MkUserCardMini.vue
@@ -55,7 +55,7 @@ const props = withDefaults(
 		display: block;
 		width: ($bodyTitleHieght + $bodyInfoHieght);
 		height: ($bodyTitleHieght + $bodyInfoHieght);
-		margin-right: 12px;
+		margin-inline-end: 12px;
 	}
 
 	> :global(.body) {
@@ -63,7 +63,7 @@ const props = withDefaults(
 		overflow: hidden;
 		font-size: 0.9em;
 		color: var(--fg);
-		padding-right: 8px;
+		padding-inline-end: 8px;
 
 		> :global(.name) {
 			display: block;
@@ -88,7 +88,7 @@ const props = withDefaults(
 		// > :global(.moderation) {
 		// 	display: flex;
 		// 	gap: 1rem;
-		// 	margin-right: 1rem;
+		// 	margin-inline-end: 1rem;
 		// }
 	}
 
diff --git a/packages/client/src/components/MkUsersTooltip.vue b/packages/client/src/components/MkUsersTooltip.vue
index 25af3ac1..84d9a3af 100644
--- a/packages/client/src/components/MkUsersTooltip.vue
+++ b/packages/client/src/components/MkUsersTooltip.vue
@@ -34,7 +34,7 @@ const emit = defineEmits<{
 <style lang="scss" scoped>
 .beaffaef {
 	font-size: 0.9em;
-	text-align: left;
+	text-align: initial;
 
 	> .user {
 		line-height: 24px;
@@ -49,7 +49,7 @@ const emit = defineEmits<{
 		> .avatar {
 			width: 24px;
 			height: 24px;
-			margin-right: 3px;
+			margin-inline-end: 3px;
 		}
 	}
 }
diff --git a/packages/client/src/components/MkVisibility.vue b/packages/client/src/components/MkVisibility.vue
index 34da3c2e..b9ff257f 100644
--- a/packages/client/src/components/MkVisibility.vue
+++ b/packages/client/src/components/MkVisibility.vue
@@ -79,6 +79,6 @@ if (
 <style lang="scss" module>
 .visibility,
 .localOnly {
-	margin-left: 0.5em;
+	margin-inline-start: 0.5em;
 }
 </style>
diff --git a/packages/client/src/components/MkVisibilityPicker.vue b/packages/client/src/components/MkVisibilityPicker.vue
index 7a9ace08..91285015 100644
--- a/packages/client/src/components/MkVisibilityPicker.vue
+++ b/packages/client/src/components/MkVisibilityPicker.vue
@@ -202,7 +202,7 @@ function choose(
 	display: flex;
 	padding: 8px 14px;
 	font-size: 12px;
-	text-align: left;
+	text-align: initial;
 	width: 100%;
 	box-sizing: border-box;
 
@@ -229,7 +229,7 @@ function choose(
 	display: flex;
 	justify-content: center;
 	align-items: center;
-	margin-right: 10px;
+	margin-inline-end: 10px;
 	width: 16px;
 	top: 0;
 	bottom: 0;
@@ -258,7 +258,7 @@ function choose(
 	display: flex;
 	justify-content: center;
 	align-items: center;
-	margin-left: 10px;
+	margin-inline-start: 10px;
 	width: 16px;
 	top: 0;
 	bottom: 0;
diff --git a/packages/client/src/components/MkWidgets.vue b/packages/client/src/components/MkWidgets.vue
index 0991cefc..32b9e801 100644
--- a/packages/client/src/components/MkWidgets.vue
+++ b/packages/client/src/components/MkWidgets.vue
@@ -207,11 +207,11 @@ function onContextmenu(widget: Widget, ev: MouseEvent) {
 		}
 
 		> .config {
-			right: 8px + 8px + 32px;
+			inset-inline-end: 8px + 8px + 32px;
 		}
 
 		> .remove {
-			right: 8px;
+			inset-inline-end: 8px;
 		}
 
 		> .handle {
diff --git a/packages/client/src/components/MkWindow.vue b/packages/client/src/components/MkWindow.vue
index 102ff244..608c8f70 100644
--- a/packages/client/src/components/MkWindow.vue
+++ b/packages/client/src/components/MkWindow.vue
@@ -530,7 +530,7 @@ defineExpose({
 .ebkgocck {
 	position: fixed;
 	top: 0;
-	left: 0;
+	inset-inline-start: 0;
 
 	> .body {
 		overflow: clip;
@@ -578,7 +578,7 @@ defineExpose({
 			}
 
 			> .left {
-				margin-right: 16px;
+				margin-inline-end: 16px;
 			}
 
 			> .right {
@@ -615,7 +615,7 @@ defineExpose({
 
 		&.top {
 			top: -($size);
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: $size;
 			cursor: ns-resize;
@@ -623,7 +623,7 @@ defineExpose({
 
 		&.right {
 			top: 0;
-			right: -($size);
+			inset-inline-end: -($size);
 			width: $size;
 			height: 100%;
 			cursor: ew-resize;
@@ -631,7 +631,7 @@ defineExpose({
 
 		&.bottom {
 			bottom: -($size);
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: $size;
 			cursor: ns-resize;
@@ -639,7 +639,7 @@ defineExpose({
 
 		&.left {
 			top: 0;
-			left: -($size);
+			inset-inline-start: -($size);
 			width: $size;
 			height: 100%;
 			cursor: ew-resize;
@@ -647,7 +647,7 @@ defineExpose({
 
 		&.top-left {
 			top: -($size);
-			left: -($size);
+			inset-inline-start: -($size);
 			width: $size * 2;
 			height: $size * 2;
 			cursor: nwse-resize;
@@ -655,7 +655,7 @@ defineExpose({
 
 		&.top-right {
 			top: -($size);
-			right: -($size);
+			inset-inline-end: -($size);
 			width: $size * 2;
 			height: $size * 2;
 			cursor: nesw-resize;
@@ -663,7 +663,7 @@ defineExpose({
 
 		&.bottom-right {
 			bottom: -($size);
-			right: -($size);
+			inset-inline-end: -($size);
 			width: $size * 2;
 			height: $size * 2;
 			cursor: nwse-resize;
@@ -671,7 +671,7 @@ defineExpose({
 
 		&.bottom-left {
 			bottom: -($size);
-			left: -($size);
+			inset-inline-start: -($size);
 			width: $size * 2;
 			height: $size * 2;
 			cursor: nesw-resize;
diff --git a/packages/client/src/components/form/checkbox.vue b/packages/client/src/components/form/checkbox.vue
index 78a6f68f..ed862e68 100644
--- a/packages/client/src/components/form/checkbox.vue
+++ b/packages/client/src/components/form/checkbox.vue
@@ -104,7 +104,7 @@ const toggle = () => {
 	}
 
 	> .label {
-		margin-left: 12px;
+		margin-inline-start: 12px;
 		margin-top: 2px;
 		display: block;
 		transition: inherit;
diff --git a/packages/client/src/components/form/folder.vue b/packages/client/src/components/form/folder.vue
index c289701d..40a61d19 100644
--- a/packages/client/src/components/form/folder.vue
+++ b/packages/client/src/components/form/folder.vue
@@ -53,7 +53,7 @@ const opened = ref(props.defaultOpen);
 		}
 
 		> .icon {
-			margin-right: 0.75em;
+			margin-inline-end: 0.75em;
 			flex-shrink: 0;
 			text-align: center;
 			opacity: 0.8;
@@ -62,7 +62,7 @@ const opened = ref(props.defaultOpen);
 				display: none;
 
 				& + .text {
-					padding-left: 4px;
+					padding-inline-start: 4px;
 				}
 			}
 		}
@@ -71,16 +71,16 @@ const opened = ref(props.defaultOpen);
 			white-space: nowrap;
 			text-overflow: ellipsis;
 			overflow: hidden;
-			padding-right: 12px;
+			padding-inline-end: 12px;
 		}
 
 		> .right {
-			margin-left: auto;
+			margin-inline-start: auto;
 			opacity: 0.7;
 			white-space: nowrap;
 
 			> .text:not(:empty) {
-				margin-right: 0.75em;
+				margin-inline-end: 0.75em;
 			}
 		}
 	}
diff --git a/packages/client/src/components/form/input.vue b/packages/client/src/components/form/input.vue
index e54302ed..7a48c8d4 100644
--- a/packages/client/src/components/form/input.vue
+++ b/packages/client/src/components/form/input.vue
@@ -259,13 +259,13 @@ defineExpose({
 			}
 
 			> .prefix {
-				left: 0;
-				padding-right: 6px;
+				inset-inline-start: 0;
+				padding-inline-end: 6px;
 			}
 
 			> .suffix {
-				right: 0;
-				padding-left: 6px;
+				inset-inline-end: 0;
+				padding-inline-start: 6px;
 			}
 
 			&.inline {
diff --git a/packages/client/src/components/form/link.vue b/packages/client/src/components/form/link.vue
index f20d37dc..01a5e56a 100644
--- a/packages/client/src/components/form/link.vue
+++ b/packages/client/src/components/form/link.vue
@@ -66,7 +66,7 @@ defineProps<{
 		}
 
 		> .icon {
-			margin-right: 0.75em;
+			margin-inline-end: 0.75em;
 			flex-shrink: 0;
 			text-align: center;
 			color: var(--fgTransparentWeak);
@@ -75,7 +75,7 @@ defineProps<{
 				display: none;
 
 				& + .text {
-					padding-left: 4px;
+					padding-inline-start: 4px;
 				}
 			}
 		}
@@ -84,16 +84,16 @@ defineProps<{
 			white-space: nowrap;
 			text-overflow: ellipsis;
 			overflow: hidden;
-			padding-right: 12px;
+			padding-inline-end: 12px;
 		}
 
 		> .right {
-			margin-left: auto;
+			margin-inline-start: auto;
 			opacity: 0.7;
 			white-space: nowrap;
 
 			> .text:not(:empty) {
-				margin-right: 0.75em;
+				margin-inline-end: 0.75em;
 			}
 		}
 	}
diff --git a/packages/client/src/components/form/radio.vue b/packages/client/src/components/form/radio.vue
index 2c6d59bb..77830863 100644
--- a/packages/client/src/components/form/radio.vue
+++ b/packages/client/src/components/form/radio.vue
@@ -38,7 +38,7 @@ function toggle(x) {
 .novjtctn {
 	position: relative;
 	display: inline-block;
-	text-align: left;
+	text-align: initial;
 	cursor: pointer;
 	padding: 8px 10px;
 	min-width: 60px;
@@ -112,9 +112,9 @@ function toggle(x) {
 			display: block;
 			position: absolute;
 			top: 3px;
-			right: 3px;
+			inset-inline-end: 3px;
 			bottom: 3px;
-			left: 3px;
+			inset-inline-start: 3px;
 			border-radius: 100%;
 			opacity: 0;
 			transform: scale(0);
@@ -123,7 +123,7 @@ function toggle(x) {
 	}
 
 	> .label {
-		margin-left: 28px;
+		margin-inline-start: 28px;
 		display: block;
 		line-height: 20px;
 		cursor: pointer;
diff --git a/packages/client/src/components/form/select.vue b/packages/client/src/components/form/select.vue
index 6ad9967b..a933847a 100644
--- a/packages/client/src/components/form/select.vue
+++ b/packages/client/src/components/form/select.vue
@@ -282,13 +282,13 @@ function show(ev: MouseEvent) {
 		}
 
 		> .prefix {
-			left: 0;
-			padding-right: 6px;
+			inset-inline-start: 0;
+			padding-inline-end: 6px;
 		}
 
 		> .suffix {
-			right: 0;
-			padding-left: 6px;
+			inset-inline-end: 0;
+			padding-inline-start: 6px;
 		}
 
 		&.inline {
diff --git a/packages/client/src/components/form/switch.vue b/packages/client/src/components/form/switch.vue
index 2b7c7663..d8dd038f 100644
--- a/packages/client/src/components/form/switch.vue
+++ b/packages/client/src/components/form/switch.vue
@@ -73,7 +73,7 @@ function toggle(x) {
 		> .knob {
 			position: absolute;
 			top: 3px;
-			left: 3px;
+			inset-inline-start: 3px;
 			width: 15px;
 			height: 15px;
 			background: var(--swutchOffFg);
@@ -92,7 +92,7 @@ function toggle(x) {
 	}
 
 	> .label {
-		margin-left: 12px;
+		margin-inline-start: 12px;
 		margin-top: 2px;
 		display: block;
 		transition: inherit;
@@ -126,7 +126,7 @@ function toggle(x) {
 		border-color: var(--swutchOnBg) !important;
 
 		> .knob {
-			left: 12px;
+			inset-inline-start: 12px;
 			background: var(--swutchOnFg);
 		}
 	}
diff --git a/packages/client/src/components/global/MkAd.vue b/packages/client/src/components/global/MkAd.vue
index 542070aa..619b4226 100644
--- a/packages/client/src/components/global/MkAd.vue
+++ b/packages/client/src/components/global/MkAd.vue
@@ -158,7 +158,7 @@ function reduceFrequency(): void {
 			> .menu {
 				position: absolute;
 				top: 1px;
-				right: 1px;
+				inset-inline-end: 1px;
 
 				> .info-circle {
 					border: 3px solid var(--panel);
diff --git a/packages/client/src/components/global/MkAvatar.vue b/packages/client/src/components/global/MkAvatar.vue
index acda80be..7c3616db 100644
--- a/packages/client/src/components/global/MkAvatar.vue
+++ b/packages/client/src/components/global/MkAvatar.vue
@@ -144,8 +144,8 @@ watch(
 	> .inner {
 		position: absolute;
 		bottom: 0;
-		left: 0;
-		right: 0;
+		inset-inline-start: 0;
+		inset-inline-end: 0;
 		top: 0;
 		border-radius: 100%;
 		z-index: 1;
@@ -159,7 +159,7 @@ watch(
 		position: absolute;
 		z-index: 1;
 		bottom: 0;
-		left: 0;
+		inset-inline-start: 0;
 		width: 18%;
 		height: 18%;
 	}
diff --git a/packages/client/src/components/global/MkLoading.vue b/packages/client/src/components/global/MkLoading.vue
index e5709d95..7a30cbd2 100644
--- a/packages/client/src/components/global/MkLoading.vue
+++ b/packages/client/src/components/global/MkLoading.vue
@@ -112,7 +112,7 @@ const props = withDefaults(
 .spinner {
 	position: absolute;
 	top: 0;
-	left: 0;
+	inset-inline-start: 0;
 	z-index: 999;
 	width: var(--size);
 	height: var(--size);
diff --git a/packages/client/src/components/global/MkMisskeyFlavoredMarkdown.vue b/packages/client/src/components/global/MkMisskeyFlavoredMarkdown.vue
index 7c5d1adf..406e2914 100644
--- a/packages/client/src/components/global/MkMisskeyFlavoredMarkdown.vue
+++ b/packages/client/src/components/global/MkMisskeyFlavoredMarkdown.vue
@@ -354,9 +354,9 @@ const props = withDefaults(
 	::v-deep(blockquote) {
 		display: block;
 		margin: 8px 0;
-		padding-left: 12px;
+		padding-inline-start: 12px;
 		color: var(--fgTransparentWeak);
-		border-left: solid 4px var(--fgTransparent);
+		border-inline-start: solid 4px var(--fgTransparent);
 	}
 
 	::v-deep(pre) {
diff --git a/packages/client/src/components/global/MkPageHeader.vue b/packages/client/src/components/global/MkPageHeader.vue
index c68c2695..17698ffb 100644
--- a/packages/client/src/components/global/MkPageHeader.vue
+++ b/packages/client/src/components/global/MkPageHeader.vue
@@ -374,13 +374,13 @@ onUnmounted(() => {
 		display: flex;
 		> .buttons {
 			&:not(:empty) {
-				margin-right: 8px;
-				margin-left: calc(0px - var(--margin));
+				margin-inline-end: 8px;
+				margin-inline-start: calc(0px - var(--margin));
 			}
 			> .avatar {
 				width: 32px;
 				height: 32px;
-				margin-left: var(--margin);
+				margin-inline-start: var(--margin);
 			}
 		}
 	}
@@ -393,16 +393,16 @@ onUnmounted(() => {
 		&.right {
 			justify-content: flex-end;
 			z-index: 2;
-			// margin-right: calc(0px - var(--margin));
-			// margin-left: var(--margin);
+			// margin-inline-end: calc(0px - var(--margin));
+			// margin-inline-start: var(--margin);
 			> .button:last-child {
-				margin-right: calc(0px - var(--margin));
+				margin-inline-end: calc(0px - var(--margin));
 			}
 		}
 
 		> .fullButton {
 			& + .fullButton {
-				margin-left: 12px;
+				margin-inline-start: 12px;
 			}
 		}
 	}
@@ -419,7 +419,7 @@ onUnmounted(() => {
 			max-width: 400px;
 			overflow: auto;
 			white-space: nowrap;
-			text-align: left;
+			text-align: initial;
 			font-weight: bold;
 			flex-shrink: 0;
 			> .avatar {
@@ -428,11 +428,11 @@ onUnmounted(() => {
 				width: $size;
 				height: $size;
 				vertical-align: bottom;
-				margin-right: 8px;
+				margin-inline-end: 8px;
 			}
 
 			> .icon {
-				margin-right: 8px;
+				margin-inline-end: 8px;
 				min-width: 16px;
 				width: 1em;
 				text-align: center;
@@ -458,7 +458,7 @@ onUnmounted(() => {
 
 						> .chevron {
 							display: inline-block;
-							margin-left: 6px;
+							margin-inline-start: 6px;
 						}
 					}
 				}
@@ -474,14 +474,14 @@ onUnmounted(() => {
 	}
 	> .left {
 		min-width: 20%;
-		margin-left: -10px;
-		padding-left: 10px;
+		margin-inline-start: -10px;
+		padding-inline-start: 10px;
 	}
 	> .right {
-		// margin-left: auto;
+		// margin-inline-start: auto;
 		min-width: max-content;
-		margin-right: -10px;
-		padding-right: 10px;
+		margin-inline-end: -10px;
+		padding-inline-end: 10px;
 	}
 
 	> .tabs {
@@ -555,7 +555,7 @@ onUnmounted(() => {
 			}
 
 			> .icon + .title {
-				margin-left: 8px;
+				margin-inline-start: 8px;
 			}
 			> .title {
 				transition: opacity 0.2s;
@@ -564,7 +564,7 @@ onUnmounted(() => {
 		> .highlight {
 			position: absolute;
 			bottom: 0;
-			left: 0;
+			inset-inline-start: 0;
 			height: 3px;
 			background: var(--accent);
 			border-radius: 999px;
diff --git a/packages/client/src/components/global/MkUrl.vue b/packages/client/src/components/global/MkUrl.vue
index 5a8c6245..b2e4a3ef 100644
--- a/packages/client/src/components/global/MkUrl.vue
+++ b/packages/client/src/components/global/MkUrl.vue
@@ -84,7 +84,7 @@ const target = self ? null : "_blank";
 	}
 
 	> .icon {
-		padding-left: 2px;
+		padding-inline-start: 2px;
 		font-size: 0.9em;
 	}
 
diff --git a/packages/client/src/components/page/page.switch.vue b/packages/client/src/components/page/page.switch.vue
index f9314cc8..3e8e6042 100644
--- a/packages/client/src/components/page/page.switch.vue
+++ b/packages/client/src/components/page/page.switch.vue
@@ -53,7 +53,7 @@ export default defineComponent({
 	margin: 16px auto;
 
 	& + .hkcxmtwj {
-		margin-left: 16px;
+		margin-inline-start: 16px;
 	}
 }
 </style>
diff --git a/packages/client/src/init.ts b/packages/client/src/init.ts
index 3608ce28..5cc708f6 100644
--- a/packages/client/src/init.ts
+++ b/packages/client/src/init.ts
@@ -35,6 +35,7 @@ import { set } from "@/scripts/idb-proxy";
 
 import { login, refreshAccount, signout, updateAccount } from "@/account";
 import components from "@/components";
+import { langmap } from "@/scripts/langmap";
 import { lang, ui, version } from "@/config";
 import directives from "@/directives";
 import { i18n } from "@/i18n";
@@ -123,7 +124,8 @@ function checkForSplash() {
 	// #region Set lang attr
 	const html = document.documentElement;
 	html.setAttribute("lang", lang || "en-US");
-	// #endregion
+	html.setAttribute("dir", langmap[lang].rtl ? "rtl" : "ltr");
+	//#endregion
 
 	// #region loginId
 	const params = new URLSearchParams(location.search);
diff --git a/packages/client/src/pages/about-firefish.vue b/packages/client/src/pages/about-firefish.vue
index 6dc931a4..d52acc3b 100644
--- a/packages/client/src/pages/about-firefish.vue
+++ b/packages/client/src/pages/about-firefish.vue
@@ -170,7 +170,7 @@
 								:key="sponsor"
 								style="
 									margin-bottom: 0.5rem;
-									margin-right: 0.5rem;
+									margin-inline-end: 0.5rem;
 									font-size: 1.7rem;
 								"
 							>
@@ -192,7 +192,7 @@
 								:key="patron"
 								style="
 									margin-bottom: 0.5rem;
-									margin-right: 0.5rem;
+									margin-inline-end: 0.5rem;
 								"
 							>
 								<Mfm :text="`${patron}`" />
@@ -324,7 +324,7 @@ definePageMetadata({
 		> .emoji {
 			position: absolute;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 			visibility: hidden;
 
 			> .emoji {
diff --git a/packages/client/src/pages/admin/_header_.vue b/packages/client/src/pages/admin/_header_.vue
index 7b0b6270..873d209e 100644
--- a/packages/client/src/pages/admin/_header_.vue
+++ b/packages/client/src/pages/admin/_header_.vue
@@ -40,7 +40,10 @@
 						class="fullButton"
 						primary
 						@click.stop="action.handler"
-						><i :class="action.icon" style="margin-right: 6px"></i
+						><i
+							:class="action.icon"
+							style="margin-inline-end: 6px"
+						></i
 						>{{ action.text }}</MkButton
 					>
 					<button
@@ -205,7 +208,7 @@ onUnmounted(() => {
 		margin: 0 var(--margin);
 
 		&.right {
-			margin-left: auto;
+			margin-inline-start: auto;
 		}
 
 		&:empty {
@@ -233,7 +236,7 @@ onUnmounted(() => {
 
 		> .fullButton {
 			& + .fullButton {
-				margin-left: 12px;
+				margin-inline-start: 12px;
 			}
 		}
 	}
@@ -244,10 +247,10 @@ onUnmounted(() => {
 		max-width: 400px;
 		overflow: auto;
 		white-space: nowrap;
-		text-align: left;
+		text-align: initial;
 		font-weight: bold;
 		flex-shrink: 0;
-		margin-left: 24px;
+		margin-inline-start: 24px;
 
 		> .avatar {
 			$size: 32px;
@@ -260,7 +263,7 @@ onUnmounted(() => {
 		}
 
 		> .icon {
-			margin-right: 8px;
+			margin-inline-end: 8px;
 			width: 16px;
 			text-align: center;
 		}
@@ -285,7 +288,7 @@ onUnmounted(() => {
 
 					> .chevron {
 						display: inline-block;
-						margin-left: 6px;
+						margin-inline-start: 6px;
 					}
 				}
 			}
@@ -294,7 +297,7 @@ onUnmounted(() => {
 
 	> .tabs {
 		position: relative;
-		margin-left: 16px;
+		margin-inline-start: 16px;
 		font-size: 0.8em;
 		overflow: auto;
 		white-space: nowrap;
@@ -314,7 +317,7 @@ onUnmounted(() => {
 			}
 
 			> .icon + .title {
-				margin-left: 8px;
+				margin-inline-start: 8px;
 			}
 		}
 
diff --git a/packages/client/src/pages/admin/emojis.vue b/packages/client/src/pages/admin/emojis.vue
index bc67be36..ff4cbc00 100644
--- a/packages/client/src/pages/admin/emojis.vue
+++ b/packages/client/src/pages/admin/emojis.vue
@@ -463,7 +463,7 @@ definePageMetadata(
 				display: flex;
 				align-items: center;
 				padding: 11px;
-				text-align: left;
+				text-align: initial;
 				border: solid 1px var(--panel);
 
 				&:hover {
@@ -514,7 +514,7 @@ definePageMetadata(
 				display: flex;
 				align-items: center;
 				padding: 12px;
-				text-align: left;
+				text-align: initial;
 
 				&:hover {
 					color: var(--accent);
diff --git a/packages/client/src/pages/admin/index.vue b/packages/client/src/pages/admin/index.vue
index 273f035f..155837ca 100644
--- a/packages/client/src/pages/admin/index.vue
+++ b/packages/client/src/pages/admin/index.vue
@@ -443,7 +443,7 @@ defineExpose({
 			width: 32%;
 			max-width: 280px;
 			box-sizing: border-box;
-			border-right: solid 0.5px var(--divider);
+			border-inline-end: solid 0.5px var(--divider);
 			overflow: auto;
 			height: 100%;
 		}
diff --git a/packages/client/src/pages/admin/overview.federation.vue b/packages/client/src/pages/admin/overview.federation.vue
index 6996b35f..f3346453 100644
--- a/packages/client/src/pages/admin/overview.federation.vue
+++ b/packages/client/src/pages/admin/overview.federation.vue
@@ -106,7 +106,7 @@ onMounted(async () => {
 				> .title {
 					position: absolute;
 					top: 20px;
-					left: 20px;
+					inset-inline-start: 20px;
 					font-size: 90%;
 				}
 
@@ -117,7 +117,7 @@ onMounted(async () => {
 				> .subTitle {
 					position: absolute;
 					bottom: 20px;
-					right: 20px;
+					inset-inline-end: 20px;
 					font-size: 85%;
 				}
 			}
@@ -138,7 +138,7 @@ onMounted(async () => {
 					place-items: center;
 					height: 100%;
 					aspect-ratio: 1;
-					margin-right: 12px;
+					margin-inline-end: 12px;
 					background: var(--accentedBg);
 					color: var(--accent);
 					border-radius: 10px;
diff --git a/packages/client/src/pages/admin/overview.metrics.vue b/packages/client/src/pages/admin/overview.metrics.vue
index c8d7efad..f1c4f4d2 100644
--- a/packages/client/src/pages/admin/overview.metrics.vue
+++ b/packages/client/src/pages/admin/overview.metrics.vue
@@ -121,7 +121,7 @@ onUnmounted(() => {
 		> .pie {
 			height: 82px;
 			flex-shrink: 0;
-			margin-right: 16px;
+			margin-inline-end: 16px;
 		}
 
 		> div {
@@ -136,7 +136,7 @@ onUnmounted(() => {
 					margin-bottom: 4px;
 
 					> i {
-						margin-right: 4px;
+						margin-inline-end: 4px;
 					}
 				}
 			}
diff --git a/packages/client/src/pages/admin/overview.stats.vue b/packages/client/src/pages/admin/overview.stats.vue
index e0e715fd..01410460 100644
--- a/packages/client/src/pages/admin/overview.stats.vue
+++ b/packages/client/src/pages/admin/overview.stats.vue
@@ -14,7 +14,7 @@
 						<div class="value">
 							<MkNumber
 								:value="stats.originalUsersCount"
-								style="margin-right: 0.5em"
+								style="margin-inline-end: 0.5em"
 							/>
 						</div>
 						<div class="label">{{ i18n.ts.users }}</div>
@@ -28,7 +28,7 @@
 						<div class="value">
 							<MkNumber
 								:value="stats.originalNotesCount"
-								style="margin-right: 0.5em"
+								style="margin-inline-end: 0.5em"
 							/>
 						</div>
 						<div class="label">{{ i18n.ts.notes }}</div>
@@ -42,7 +42,7 @@
 						<div class="value">
 							<MkNumber
 								:value="stats.instances"
-								style="margin-right: 0.5em"
+								style="margin-inline-end: 0.5em"
 							/>
 						</div>
 						<div class="label">{{ i18n.ts.instances }}</div>
@@ -56,7 +56,7 @@
 						<div class="value">
 							<MkNumber
 								:value="onlineUsersCount"
-								style="margin-right: 0.5em"
+								style="margin-inline-end: 0.5em"
 							/>
 						</div>
 						<div class="label">{{ i18n.ts.online }}</div>
@@ -70,7 +70,7 @@
 						<div class="value">
 							<MkNumber
 								:value="emojiCount"
-								style="margin-right: 0.5em"
+								style="margin-inline-end: 0.5em"
 							/>
 						</div>
 						<div class="label">{{ i18n.ts.emojis }}</div>
@@ -141,7 +141,7 @@ onMounted(async () => {
 				place-items: center;
 				height: 100%;
 				aspect-ratio: 1;
-				margin-right: 12px;
+				margin-inline-end: 12px;
 				background: var(--accentedBg);
 				color: var(--accent);
 				border-radius: 10px;
diff --git a/packages/client/src/pages/admin/overview.user.vue b/packages/client/src/pages/admin/overview.user.vue
index 8a220893..d838b1ed 100644
--- a/packages/client/src/pages/admin/overview.user.vue
+++ b/packages/client/src/pages/admin/overview.user.vue
@@ -39,7 +39,7 @@ const props = defineProps<{
 		display: block;
 		width: ($bodyTitleHieght + $bodyInfoHieght);
 		height: ($bodyTitleHieght + $bodyInfoHieght);
-		margin-right: 12px;
+		margin-inline-end: 12px;
 	}
 
 	> :global(.body) {
@@ -47,7 +47,7 @@ const props = defineProps<{
 		overflow: hidden;
 		font-size: 0.9em;
 		color: var(--fg);
-		padding-right: 8px;
+		padding-inline-end: 8px;
 
 		> :global(.name) {
 			display: block;
diff --git a/packages/client/src/pages/admin/promotions.vue b/packages/client/src/pages/admin/promotions.vue
index 7f3da4d1..6604b42b 100644
--- a/packages/client/src/pages/admin/promotions.vue
+++ b/packages/client/src/pages/admin/promotions.vue
@@ -42,7 +42,7 @@
 							class="button"
 							inline
 							primary
-							style="margin-right: 12px"
+							style="margin-inline-end: 12px"
 							@click="save(ad)"
 							><i :class="icon('ph-floppy-disk-back')"></i>
 							{{ i18n.ts.save }}</MkButton
diff --git a/packages/client/src/pages/admin/queue.chart.vue b/packages/client/src/pages/admin/queue.chart.vue
index ed4702e0..6cf25265 100644
--- a/packages/client/src/pages/admin/queue.chart.vue
+++ b/packages/client/src/pages/admin/queue.chart.vue
@@ -47,7 +47,7 @@
 					>
 						{{ job[0] }}
 					</a>
-					<span style="margin-left: 8px; opacity: 0.7"
+					<span style="margin-inline-start: 8px; opacity: 0.7"
 						>({{ number(job[1]) }} jobs)</span
 					>
 				</div>
diff --git a/packages/client/src/pages/admin/relays.vue b/packages/client/src/pages/admin/relays.vue
index 6ffd4ae5..b5a46f4e 100644
--- a/packages/client/src/pages/admin/relays.vue
+++ b/packages/client/src/pages/admin/relays.vue
@@ -118,7 +118,7 @@ definePageMetadata({
 
 		> .icon {
 			width: 1em;
-			margin-right: 0.75em;
+			margin-inline-end: 0.75em;
 
 			&.accepted {
 				color: var(--success);
diff --git a/packages/client/src/pages/admin/users.vue b/packages/client/src/pages/admin/users.vue
index 56855a8e..c69fbd4b 100644
--- a/packages/client/src/pages/admin/users.vue
+++ b/packages/client/src/pages/admin/users.vue
@@ -223,10 +223,10 @@ definePageMetadata(
 			margin-bottom: 16px;
 
 			> * {
-				margin-right: 16px;
+				margin-inline-end: 16px;
 
 				&:last-child {
-					margin-right: 0;
+					margin-inline-end: 0;
 				}
 			}
 		}
diff --git a/packages/client/src/pages/channel.vue b/packages/client/src/pages/channel.vue
index f141cc6f..1730d0cd 100644
--- a/packages/client/src/pages/channel.vue
+++ b/packages/client/src/pages/channel.vue
@@ -43,7 +43,7 @@
 								><I18n
 									:src="i18n.ts._channel.usersCount"
 									tag="span"
-									style="margin-left: 4px"
+									style="margin-inline-start: 4px"
 									><template #n
 										><b>{{
 											channel.usersCount
@@ -56,7 +56,7 @@
 								><I18n
 									:src="i18n.ts._channel.notesCount"
 									tag="span"
-									style="margin-left: 4px"
+									style="margin-inline-start: 4px"
 									><template #n
 										><b>{{
 											channel.notesCount
@@ -165,14 +165,14 @@ definePageMetadata(
 		position: absolute;
 		z-index: 1;
 		top: 16px;
-		left: 16px;
+		inset-inline-start: 16px;
 	}
 
 	> .toggle {
 		position: absolute;
 		z-index: 2;
 		top: 8px;
-		right: 8px;
+		inset-inline-end: 8px;
 		font-size: 1.2em;
 		width: 48px;
 		height: 48px;
@@ -194,7 +194,7 @@ definePageMetadata(
 		> .fade {
 			position: absolute;
 			bottom: 0;
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: 64px;
 			background: linear-gradient(0deg, var(--panel), var(--X15));
@@ -204,7 +204,7 @@ definePageMetadata(
 			position: absolute;
 			z-index: 1;
 			bottom: 16px;
-			right: 16px;
+			inset-inline-end: 16px;
 			padding: 8px 12px;
 			font-size: 80%;
 			background: rgba(0, 0, 0, 0.7);
@@ -221,7 +221,7 @@ definePageMetadata(
 		position: absolute;
 		z-index: 1;
 		top: 0;
-		left: 0;
+		inset-inline-start: 0;
 		width: 100%;
 		height: 100%;
 		-webkit-backdrop-filter: var(--blur, blur(16px));
@@ -236,7 +236,7 @@ definePageMetadata(
 
 		> .toggle {
 			top: 0;
-			right: 0;
+			inset-inline-end: 0;
 			height: 100%;
 			background: transparent;
 		}
diff --git a/packages/client/src/pages/emojis.emoji.vue b/packages/client/src/pages/emojis.emoji.vue
index c1edd640..574f8fdf 100644
--- a/packages/client/src/pages/emojis.emoji.vue
+++ b/packages/client/src/pages/emojis.emoji.vue
@@ -58,7 +58,7 @@ function menu(ev) {
 	display: flex;
 	align-items: center;
 	padding: 12px;
-	text-align: left;
+	text-align: initial;
 	background: var(--panel);
 	border-radius: 8px;
 
diff --git a/packages/client/src/pages/explore.users.vue b/packages/client/src/pages/explore.users.vue
index 9f3a4391..d7cadbfd 100644
--- a/packages/client/src/pages/explore.users.vue
+++ b/packages/client/src/pages/explore.users.vue
@@ -10,7 +10,7 @@
 					<template #header
 						><i
 							:class="icon('ph-bookmark ph-fw')"
-							style="margin-right: 0.5em"
+							style="margin-inline-end: 0.5em"
 						></i
 						>{{ i18n.ts.pinnedUsers }}</template
 					>
@@ -24,7 +24,7 @@
 					<template #header
 						><i
 							:class="icon('ph-chart-line-up ph-fw')"
-							style="margin-right: 0.5em"
+							style="margin-inline-end: 0.5em"
 						></i
 						>{{ i18n.ts.popularUsers }}</template
 					>
@@ -38,7 +38,7 @@
 					<template #header
 						><i
 							:class="icon('ph-activity ph-fw')"
-							style="margin-right: 0.5em"
+							style="margin-inline-end: 0.5em"
 						></i
 						>{{ i18n.ts.recentlyUpdatedUsers }}</template
 					>
@@ -52,7 +52,7 @@
 					<template #header
 						><i
 							:class="icon('ph-butterfly ph-fw')"
-							style="margin-right: 0.5em"
+							style="margin-inline-end: 0.5em"
 						></i
 						>{{ i18n.ts.recentlyRegisteredUsers }}</template
 					>
@@ -70,7 +70,7 @@
 				<template #header
 					><i
 						:class="icon('ph-compass ph-fw')"
-						style="margin-right: 0.5em"
+						style="margin-inline-end: 0.5em"
 					></i
 					>{{ i18n.ts.popularTags }}</template
 				>
@@ -96,7 +96,7 @@
 				<template #header
 					><i
 						:class="icon('ph-hash ph-fw')"
-						style="margin-right: 0.5em"
+						style="margin-inline-end: 0.5em"
 					></i
 					>{{ tag }}</template
 				>
@@ -108,7 +108,7 @@
 					<template #header
 						><i
 							:class="icon('ph-chart-line-up ph-fw')"
-							style="margin-right: 0.5em"
+							style="margin-inline-end: 0.5em"
 						></i
 						>{{ i18n.ts.popularUsers }}</template
 					>
@@ -118,7 +118,7 @@
 					<template #header
 						><i
 							:class="icon('ph-activity ph-fw')"
-							style="margin-right: 0.5em"
+							style="margin-inline-end: 0.5em"
 						></i
 						>{{ i18n.ts.recentlyUpdatedUsers }}</template
 					>
@@ -128,7 +128,7 @@
 					<template #header
 						><i
 							:class="icon('ph-rocket-launch ph-fw')"
-							style="margin-right: 0.5em"
+							style="margin-inline-end: 0.5em"
 						></i
 						>{{ i18n.ts.recentlyDiscoveredUsers }}</template
 					>
@@ -253,7 +253,7 @@ os.api("hashtags/list", {
 <style lang="scss" scoped>
 .vxjfqztj {
 	> * {
-		margin-right: 16px;
+		margin-inline-end: 16px;
 
 		&.local {
 			font-weight: bold;
diff --git a/packages/client/src/pages/follow-requests.vue b/packages/client/src/pages/follow-requests.vue
index a3282a7e..0f465c5c 100644
--- a/packages/client/src/pages/follow-requests.vue
+++ b/packages/client/src/pages/follow-requests.vue
@@ -176,8 +176,8 @@ definePageMetadata(
 				text-overflow: ellipsis;
 				opacity: 0.7;
 				font-size: 14px;
-				padding-right: 40px;
-				padding-left: 8px;
+				padding-inline-end: 40px;
+				padding-inline-start: 8px;
 				box-sizing: border-box;
 
 				@media (max-width: 500px) {
@@ -189,7 +189,7 @@ definePageMetadata(
 				position: absolute;
 				top: 0;
 				bottom: 0;
-				right: 0;
+				inset-inline-end: 0;
 				margin: auto 0;
 
 				> button {
diff --git a/packages/client/src/pages/gallery/edit.vue b/packages/client/src/pages/gallery/edit.vue
index 330a12f2..7f79c7f3 100644
--- a/packages/client/src/pages/gallery/edit.vue
+++ b/packages/client/src/pages/gallery/edit.vue
@@ -181,7 +181,7 @@ definePageMetadata(
 	> .name {
 		position: absolute;
 		top: 8px;
-		left: 9px;
+		inset-inline-start: 9px;
 		padding: 8px;
 		background: var(--panel);
 	}
@@ -189,7 +189,7 @@ definePageMetadata(
 	> .remove {
 		position: absolute;
 		top: 8px;
-		right: 9px;
+		inset-inline-end: 9px;
 		padding: 8px;
 		background: var(--panel);
 	}
diff --git a/packages/client/src/pages/gallery/post.vue b/packages/client/src/pages/gallery/post.vue
index f34fc505..25b414db 100644
--- a/packages/client/src/pages/gallery/post.vue
+++ b/packages/client/src/pages/gallery/post.vue
@@ -302,13 +302,13 @@ definePageMetadata(
 					color: #eb6f92;
 
 					::v-deep(.count) {
-						margin-left: 0.5em;
+						margin-inline-start: 0.5em;
 					}
 				}
 			}
 
 			> .other {
-				margin-left: auto;
+				margin-inline-start: auto;
 
 				> button {
 					padding: 8px;
@@ -339,7 +339,7 @@ definePageMetadata(
 			}
 
 			> .koudoku {
-				margin-left: auto;
+				margin-inline-start: auto;
 			}
 		}
 	}
diff --git a/packages/client/src/pages/messaging/messaging-room.form.vue b/packages/client/src/pages/messaging/messaging-room.form.vue
index 21f132c1..da5fff78 100644
--- a/packages/client/src/pages/messaging/messaging-room.form.vue
+++ b/packages/client/src/pages/messaging/messaging-room.form.vue
@@ -358,7 +358,7 @@ defineExpose({
 			> .remove {
 				display: none;
 				position: absolute;
-				right: -6px;
+				inset-inline-end: -6px;
 				top: -6px;
 				margin: 0;
 				padding: 0;
@@ -394,7 +394,7 @@ defineExpose({
 		}
 
 		> .send {
-			margin-left: auto;
+			margin-inline-start: auto;
 			color: var(--accent);
 
 			&:hover {
diff --git a/packages/client/src/pages/messaging/messaging-room.message.vue b/packages/client/src/pages/messaging/messaging-room.message.vue
index f1ce1baf..d52b8476 100644
--- a/packages/client/src/pages/messaging/messaging-room.message.vue
+++ b/packages/client/src/pages/messaging/messaging-room.message.vue
@@ -156,7 +156,7 @@ function del(): void {
 				position: absolute;
 				z-index: 1;
 				top: -4px;
-				right: -4px;
+				inset-inline-end: -4px;
 				margin: 0;
 				padding: 0;
 				cursor: pointer;
@@ -250,17 +250,17 @@ function del(): void {
 			}
 
 			> i {
-				margin-left: 4px;
+				margin-inline-start: 4px;
 			}
 		}
 	}
 
 	&:not(.isMe) {
-		padding-left: var(--margin);
+		padding-inline-start: var(--margin);
 
 		> .content {
-			padding-left: 16px;
-			padding-right: 32px;
+			padding-inline-start: 16px;
+			padding-inline-end: 32px;
 
 			> .balloon {
 				$color: var(--X4);
@@ -271,11 +271,11 @@ function del(): void {
 				}
 
 				&:not(.noText):before {
-					left: -14px;
+					inset-inline-start: -14px;
 					border-top: solid 8px transparent;
-					border-right: solid 8px $color;
+					border-inline-end: solid 8px $color;
 					border-bottom: solid 8px transparent;
-					border-left: solid 8px transparent;
+					border-inline-start: solid 8px transparent;
 				}
 
 				> .content {
@@ -286,24 +286,26 @@ function del(): void {
 			}
 
 			> footer {
-				text-align: left;
+				text-align: initial;
 			}
 		}
 	}
 
 	&.isMe {
 		flex-direction: row-reverse;
-		padding-right: var(--margin);
-		right: var(--margin); // 削除時にposition: absoluteになったときに使う
+		padding-inline-end: var(--margin);
+		inset-inline-end: var(
+			--margin
+		); // 削除時にposition: absoluteになったときに使う
 
 		> .content {
-			padding-right: 16px;
-			padding-left: 32px;
+			padding-inline-end: 16px;
+			padding-inline-start: 32px;
 			text-align: right;
 
 			> .balloon {
 				background: $me-balloon-color;
-				text-align: left;
+				text-align: initial;
 
 				::selection {
 					color: var(--accent);
@@ -315,12 +317,12 @@ function del(): void {
 				}
 
 				&:not(.noText):before {
-					right: -14px;
-					left: auto;
+					inset-inline-end: -14px;
+					inset-inline-start: auto;
 					border-top: solid 8px transparent;
-					border-right: solid 8px transparent;
+					border-inline-end: solid 8px transparent;
 					border-bottom: solid 8px transparent;
-					border-left: solid 8px $me-balloon-color;
+					border-inline-start: solid 8px $me-balloon-color;
 				}
 
 				> .content {
diff --git a/packages/client/src/pages/messaging/messaging-room.vue b/packages/client/src/pages/messaging/messaging-room.vue
index 1747147e..b3b20da4 100644
--- a/packages/client/src/pages/messaging/messaging-room.vue
+++ b/packages/client/src/pages/messaging/messaging-room.vue
@@ -400,7 +400,7 @@ XMessage:last-of-type {
 			}
 
 			> i {
-				margin-right: 4px;
+				margin-inline-end: 4px;
 			}
 		}
 
@@ -436,7 +436,7 @@ XMessage:last-of-type {
 
 				> i {
 					display: inline-block;
-					margin-right: 8px;
+					margin-inline-end: 8px;
 				}
 			}
 		}
diff --git a/packages/client/src/pages/miauth.vue b/packages/client/src/pages/miauth.vue
index 34dd7825..44df56bc 100644
--- a/packages/client/src/pages/miauth.vue
+++ b/packages/client/src/pages/miauth.vue
@@ -41,7 +41,7 @@
 						>
 							<i
 								:class="icon('ph-shield-warning ph-xl', false)"
-								style="margin-right: 0.5rem"
+								style="margin-inline-end: 0.5rem"
 							></i>
 							{{ i18n.ts._permissions.allPermissions }}
 						</div>
@@ -54,7 +54,7 @@
 						>
 							<i
 								:class="icon(`ph-${getIcon(p)} ph-xl`, false)"
-								style="margin-right: 0.5rem"
+								style="margin-inline-end: 0.5rem"
 							></i>
 							{{ i18n.t(`_permissions.${p}`) }}
 						</div>
diff --git a/packages/client/src/pages/my-antennas/index.vue b/packages/client/src/pages/my-antennas/index.vue
index a027e8b4..db819ab8 100644
--- a/packages/client/src/pages/my-antennas/index.vue
+++ b/packages/client/src/pages/my-antennas/index.vue
@@ -107,7 +107,7 @@ definePageMetadata({
 		float: left;
 		min-width: 25px;
 		padding: 13px;
-		margin-right: 10px;
+		margin-inline-end: 10px;
 		border: solid 1px var(--divider);
 		border-radius: 6px;
 
@@ -137,7 +137,7 @@ definePageMetadata({
 	.notify-icon {
 		position: relative;
 		top: -1em;
-		left: -0.5em;
+		inset-inline-start: -0.5em;
 
 		&.ph-circle ph-fill {
 			color: var(--indicator);
diff --git a/packages/client/src/pages/page-editor/page-editor.container.vue b/packages/client/src/pages/page-editor/page-editor.container.vue
index f769fc21..8fb5ed62 100644
--- a/packages/client/src/pages/page-editor/page-editor.container.vue
+++ b/packages/client/src/pages/page-editor/page-editor.container.vue
@@ -125,7 +125,7 @@ export default defineComponent({
 			box-shadow: 0 1px rgba(#000, 0.07);
 
 			> i {
-				margin-right: 6px;
+				margin-inline-end: 6px;
 			}
 
 			&:empty {
@@ -137,7 +137,7 @@ export default defineComponent({
 			position: absolute;
 			z-index: 2;
 			top: 0;
-			right: 0;
+			inset-inline-end: 0;
 
 			> button {
 				padding: 0;
diff --git a/packages/client/src/pages/page-editor/page-editor.vue b/packages/client/src/pages/page-editor/page-editor.vue
index 4d160845..625b9753 100644
--- a/packages/client/src/pages/page-editor/page-editor.vue
+++ b/packages/client/src/pages/page-editor/page-editor.vue
@@ -576,7 +576,7 @@ definePageMetadata(
 			box-shadow: 0 1px rgba(#000, 0.07);
 
 			> i {
-				margin-right: 6px;
+				margin-inline-end: 6px;
 			}
 
 			&:empty {
@@ -588,7 +588,7 @@ definePageMetadata(
 			position: absolute;
 			z-index: 2;
 			top: 0;
-			right: 0;
+			inset-inline-end: 0;
 
 			> button {
 				padding: 0;
diff --git a/packages/client/src/pages/page.vue b/packages/client/src/pages/page.vue
index f776158b..7e39269a 100644
--- a/packages/client/src/pages/page.vue
+++ b/packages/client/src/pages/page.vue
@@ -369,7 +369,7 @@ definePageMetadata(
 					width: fit-content;
 					position: relative;
 					top: -10px;
-					left: 1rem;
+					inset-inline-start: 1rem;
 
 					> .menu {
 						vertical-align: bottom;
@@ -381,7 +381,7 @@ definePageMetadata(
 					}
 
 					> .koudoku {
-						margin-left: 4px;
+						margin-inline-start: 4px;
 						vertical-align: bottom;
 					}
 				}
@@ -408,7 +408,7 @@ definePageMetadata(
 					color: #eb6f92;
 
 					::v-deep(.count) {
-						margin-left: 0.5em;
+						margin-inline-start: 0.5em;
 					}
 				}
 			}
@@ -425,7 +425,7 @@ definePageMetadata(
 			}
 
 			> .user {
-				margin-left: auto;
+				margin-inline-start: auto;
 				display: flex;
 				align-items: center;
 
@@ -440,7 +440,7 @@ definePageMetadata(
 				}
 
 				> .koudoku {
-					margin-left: auto;
+					margin-inline-start: auto;
 					margin: 1rem;
 				}
 			}
@@ -452,7 +452,7 @@ definePageMetadata(
 			border-top: solid 0.5px var(--divider);
 
 			> .link {
-				margin-right: 2em;
+				margin-inline-end: 2em;
 			}
 		}
 	}
diff --git a/packages/client/src/pages/settings/2fa.vue b/packages/client/src/pages/settings/2fa.vue
index 75c2e32f..b88e18c6 100644
--- a/packages/client/src/pages/settings/2fa.vue
+++ b/packages/client/src/pages/settings/2fa.vue
@@ -7,7 +7,7 @@
 				<template #icon
 					><i
 						:class="icon('ph-shield-check')"
-						style="margin-right: 0.5rem"
+						style="margin-inline-end: 0.5rem"
 					></i
 				></template>
 				<template #label>{{ i18n.ts.totp }}</template>
@@ -18,7 +18,7 @@
 						<MkButton @click="renewTOTP"
 							><i
 								:class="icon('ph-shield-check')"
-								style="margin-right: 0.5rem"
+								style="margin-inline-end: 0.5rem"
 							></i
 							>{{ i18n.ts._2fa.renewTOTP }}</MkButton
 						>
@@ -27,7 +27,7 @@
 					<MkButton v-else @click="unregisterTOTP"
 						><i
 							:class="icon('ph-shield-slash')"
-							style="margin-right: 0.5rem"
+							style="margin-inline-end: 0.5rem"
 						></i
 						>{{ i18n.ts.unregister }}</MkButton
 					>
@@ -42,7 +42,10 @@
 
 			<MkFolder>
 				<template #icon
-					><i :class="icon('ph-key')" style="margin-right: 0.5rem"></i
+					><i
+						:class="icon('ph-key')"
+						style="margin-inline-end: 0.5rem"
+					></i
 				></template>
 				<template #label>{{ i18n.ts.securityKeyAndPasskey }}</template>
 				<div class="_gaps_s">
@@ -67,7 +70,7 @@
 						<MkButton primary @click="addSecurityKey"
 							><i
 								:class="icon('ph-key')"
-								style="margin-right: 0.5rem"
+								style="margin-inline-end: 0.5rem"
 							></i
 							>{{ i18n.ts._2fa.registerSecurityKey }}</MkButton
 						>
diff --git a/packages/client/src/pages/settings/import-export.vue b/packages/client/src/pages/settings/import-export.vue
index 4dd64e0f..325fe83a 100644
--- a/packages/client/src/pages/settings/import-export.vue
+++ b/packages/client/src/pages/settings/import-export.vue
@@ -284,6 +284,6 @@ definePageMetadata({
 
 <style module>
 .button {
-	margin-right: 16px;
+	margin-inline-end: 16px;
 }
 </style>
diff --git a/packages/client/src/pages/settings/index.vue b/packages/client/src/pages/settings/index.vue
index 47812e53..2ddb434d 100644
--- a/packages/client/src/pages/settings/index.vue
+++ b/packages/client/src/pages/settings/index.vue
@@ -344,7 +344,7 @@ definePageMetadata(INFO);
 
 			> .nav {
 				width: 34%;
-				padding-right: 32px;
+				padding-inline-end: 32px;
 				box-sizing: border-box;
 			}
 
diff --git a/packages/client/src/pages/settings/migration.vue b/packages/client/src/pages/settings/migration.vue
index 527b297c..6afa33ca 100644
--- a/packages/client/src/pages/settings/migration.vue
+++ b/packages/client/src/pages/settings/migration.vue
@@ -37,7 +37,7 @@
 				class="button"
 				:disabled="accountAlias.length >= 10"
 				inline
-				style="margin-right: 8px"
+				style="margin-inline-end: 8px"
 				@click="add"
 				><i :class="icon('ph-plus')"></i> {{ i18n.ts.add }}</FormButton
 			>
diff --git a/packages/client/src/pages/settings/navbar.vue b/packages/client/src/pages/settings/navbar.vue
index 7410fd22..d5660769 100644
--- a/packages/client/src/pages/settings/navbar.vue
+++ b/packages/client/src/pages/settings/navbar.vue
@@ -1,7 +1,7 @@
 <template>
 	<div class="_formRoot">
 		<FormSlot>
-			<VueDraggable v-model="items" animation="150" delay="50">
+			<VueDraggable v-model="items" :animation="150" :delay="50">
 				<div
 					v-for="(element, index) in items"
 					:key="index"
@@ -161,7 +161,7 @@ definePageMetadata({
 	> .itemText {
 		position: relative;
 		font-size: 0.9em;
-		margin-left: 1rem;
+		margin-inline-start: 1rem;
 	}
 
 	> .itemRemove {
diff --git a/packages/client/src/pages/settings/plugin.vue b/packages/client/src/pages/settings/plugin.vue
index 8633f97a..64bd89ad 100644
--- a/packages/client/src/pages/settings/plugin.vue
+++ b/packages/client/src/pages/settings/plugin.vue
@@ -16,7 +16,7 @@
 			>
 				<span style="display: flex"
 					><b>{{ plugin.name }}</b
-					><span style="margin-left: auto"
+					><span style="margin-inline-start: auto"
 						>v{{ plugin.version }}</span
 					></span
 				>
diff --git a/packages/client/src/pages/settings/profile.vue b/packages/client/src/pages/settings/profile.vue
index 99486adf..7de6bba9 100644
--- a/packages/client/src/pages/settings/profile.vue
+++ b/packages/client/src/pages/settings/profile.vue
@@ -110,7 +110,7 @@
 					<MkButton
 						:disabled="fields.length >= 16"
 						inline
-						style="margin-right: 8px"
+						style="margin-inline-end: 8px"
 						@click="addField"
 						><i :class="icon('ph-plus')"></i>
 						{{ i18n.ts.add }}</MkButton
@@ -323,7 +323,7 @@ definePageMetadata({
 	> .bannerEdit {
 		position: absolute;
 		top: 16px;
-		right: 16px;
+		inset-inline-end: 16px;
 	}
 }
 </style>
diff --git a/packages/client/src/pages/settings/security.vue b/packages/client/src/pages/settings/security.vue
index 6d773813..9a64f53b 100644
--- a/packages/client/src/pages/settings/security.vue
+++ b/packages/client/src/pages/settings/security.vue
@@ -150,7 +150,7 @@ definePageMetadata({
 
 		> .icon {
 			width: 1em;
-			margin-right: 0.75em;
+			margin-inline-end: 0.75em;
 
 			&.succ {
 				color: var(--success);
@@ -167,11 +167,11 @@ definePageMetadata({
 			white-space: nowrap;
 			overflow: hidden;
 			text-overflow: ellipsis;
-			margin-right: 12px;
+			margin-inline-end: 12px;
 		}
 
 		> .time {
-			margin-left: auto;
+			margin-inline-start: auto;
 			opacity: 0.7;
 		}
 	}
diff --git a/packages/client/src/pages/settings/theme.vue b/packages/client/src/pages/settings/theme.vue
index c4c34d7c..1ac95ca7 100644
--- a/packages/client/src/pages/settings/theme.vue
+++ b/packages/client/src/pages/settings/theme.vue
@@ -288,13 +288,13 @@ definePageMetadata({
 
 		> .toggleWrapper {
 			display: inline-block;
-			text-align: left;
+			text-align: initial;
 			padding: 0 100px;
 			vertical-align: bottom;
 
 			input {
 				position: absolute;
-				left: -99em;
+				inset-inline-start: -99em;
 			}
 
 			&:focus-within > .toggle {
@@ -321,12 +321,12 @@ definePageMetadata({
 			}
 
 			> .before {
-				left: -70px;
+				inset-inline-start: -70px;
 				color: var(--accent);
 			}
 
 			> .after {
-				right: -68px;
+				inset-inline-end: -68px;
 				color: var(--fg);
 			}
 		}
@@ -336,7 +336,7 @@ definePageMetadata({
 			position: relative;
 			z-index: 1;
 			top: 3px;
-			left: 3px;
+			inset-inline-start: 3px;
 			width: 50px - 6;
 			height: 50px - 6;
 			background-color: #ffcf96;
@@ -355,21 +355,21 @@ definePageMetadata({
 
 			.crater--1 {
 				top: 18px;
-				left: 10px;
+				inset-inline-start: 10px;
 				width: 4px;
 				height: 4px;
 			}
 
 			.crater--2 {
 				top: 28px;
-				left: 22px;
+				inset-inline-start: 22px;
 				width: 6px;
 				height: 6px;
 			}
 
 			.crater--3 {
 				top: 10px;
-				left: 25px;
+				inset-inline-start: 25px;
 				width: 8px;
 				height: 8px;
 			}
@@ -384,7 +384,7 @@ definePageMetadata({
 
 		.star--1 {
 			top: 10px;
-			left: 35px;
+			inset-inline-start: 35px;
 			z-index: 0;
 			width: 30px;
 			height: 3px;
@@ -392,7 +392,7 @@ definePageMetadata({
 
 		.star--2 {
 			top: 18px;
-			left: 28px;
+			inset-inline-start: 28px;
 			z-index: 1;
 			width: 30px;
 			height: 3px;
@@ -400,7 +400,7 @@ definePageMetadata({
 
 		.star--3 {
 			top: 27px;
-			left: 40px;
+			inset-inline-start: 40px;
 			z-index: 0;
 			width: 30px;
 			height: 3px;
@@ -415,7 +415,7 @@ definePageMetadata({
 
 		.star--4 {
 			top: 16px;
-			left: 11px;
+			inset-inline-start: 11px;
 			z-index: 0;
 			width: 2px;
 			height: 2px;
@@ -424,7 +424,7 @@ definePageMetadata({
 
 		.star--5 {
 			top: 32px;
-			left: 17px;
+			inset-inline-start: 17px;
 			z-index: 0;
 			width: 3px;
 			height: 3px;
@@ -433,7 +433,7 @@ definePageMetadata({
 
 		.star--6 {
 			top: 36px;
-			left: 28px;
+			inset-inline-start: 28px;
 			z-index: 0;
 			width: 2px;
 			height: 2px;
diff --git a/packages/client/src/pages/theme-editor.vue b/packages/client/src/pages/theme-editor.vue
index 474fe51b..15cd92e4 100644
--- a/packages/client/src/pages/theme-editor.vue
+++ b/packages/client/src/pages/theme-editor.vue
@@ -372,8 +372,8 @@ definePageMetadata({
 				> .preview {
 					position: absolute;
 					top: 0;
-					left: 0;
-					right: 0;
+					inset-inline-start: 0;
+					inset-inline-end: 0;
 					bottom: 0;
 					margin: auto;
 					width: 42px;
diff --git a/packages/client/src/pages/user-info.vue b/packages/client/src/pages/user-info.vue
index 8929c809..49dadea9 100644
--- a/packages/client/src/pages/user-info.vue
+++ b/packages/client/src/pages/user-info.vue
@@ -671,7 +671,7 @@ definePageMetadata(
 		display: block;
 		width: 64px;
 		height: 64px;
-		margin-right: 16px;
+		margin-inline-end: 16px;
 	}
 
 	> .body {
@@ -751,7 +751,7 @@ definePageMetadata(
 	}
 
 	> :global(.ip) {
-		margin-left: auto;
+		margin-inline-start: auto;
 	}
 }
 </style>
diff --git a/packages/client/src/pages/user/home.vue b/packages/client/src/pages/user/home.vue
index a676de94..e293f54a 100644
--- a/packages/client/src/pages/user/home.vue
+++ b/packages/client/src/pages/user/home.vue
@@ -179,7 +179,7 @@
 									v-tooltip.noDelay="i18n.ts.isModerator"
 									style="
 										color: var(--badge);
-										margin-left: 0.5rem;
+										margin-inline-start: 0.5rem;
 									"
 									><i :class="icon('ph-gavel')"></i
 								></span>
@@ -525,7 +525,7 @@ onUnmounted(() => {
 					> .fade {
 						position: absolute;
 						bottom: 0;
-						left: 0;
+						inset-inline-start: 0;
 						width: 100%;
 						height: 78px;
 						background: linear-gradient(
@@ -537,7 +537,7 @@ onUnmounted(() => {
 					> .followed {
 						position: absolute;
 						top: 10px;
-						left: 120px;
+						inset-inline-start: 120px;
 						padding: 4px 8px;
 						color: #fff;
 						background: rgba(0, 0, 0, 0.7);
@@ -553,7 +553,7 @@ onUnmounted(() => {
 					> .title {
 						position: absolute;
 						bottom: 0;
-						left: 0;
+						inset-inline-start: 0;
 						width: 100%;
 						padding: 0 0 8px 154px;
 						box-sizing: border-box;
@@ -572,7 +572,7 @@ onUnmounted(() => {
 							> .followed {
 								position: relative;
 								top: -4px;
-								left: 4px;
+								inset-inline-start: 4px;
 								padding: 4px 8px;
 								color: #fff;
 								background: rgba(0, 0, 0, 0.6);
@@ -589,7 +589,7 @@ onUnmounted(() => {
 						> .bottom {
 							> * {
 								display: inline-block;
-								margin-right: 16px;
+								margin-inline-end: 16px;
 								line-height: 20px;
 								opacity: 0.8;
 
@@ -612,7 +612,7 @@ onUnmounted(() => {
 					> .fade {
 						position: absolute;
 						bottom: 0;
-						left: 0;
+						inset-inline-start: 0;
 						width: 100%;
 						height: 78px;
 						background: linear-gradient(
@@ -624,7 +624,7 @@ onUnmounted(() => {
 					> .actions {
 						position: absolute;
 						top: 6px;
-						right: 12px;
+						inset-inline-end: 12px;
 						padding: 8px;
 						border-radius: 24px;
 						display: flex;
@@ -635,7 +635,7 @@ onUnmounted(() => {
 					> .title {
 						position: absolute;
 						bottom: 0;
-						left: 0;
+						inset-inline-start: 0;
 						width: 100%;
 						padding: 0 0 8px 154px;
 						box-sizing: border-box;
@@ -653,7 +653,7 @@ onUnmounted(() => {
 						> .bottom {
 							> * {
 								display: inline-block;
-								margin-right: 16px;
+								margin-inline-end: 16px;
 								line-height: 20px;
 								opacity: 0.8;
 
@@ -686,7 +686,7 @@ onUnmounted(() => {
 						> .followed {
 							position: relative;
 							top: -4px;
-							left: 4px;
+							inset-inline-start: 4px;
 							padding: 4px 8px;
 							color: #fff;
 							background: rgba(0, 0, 0, 0.6);
@@ -703,7 +703,7 @@ onUnmounted(() => {
 					> .followedWindow {
 						position: relative;
 						top: -25px;
-						left: 80px;
+						inset-inline-start: 80px;
 						padding: 4px 8px;
 						color: #fff;
 						background: rgba(0, 0, 0, 0.6);
@@ -714,7 +714,7 @@ onUnmounted(() => {
 					> .bottom {
 						> * {
 							display: inline-block;
-							margin-right: 8px;
+							margin-inline-end: 8px;
 							opacity: 0.8;
 						}
 					}
@@ -724,7 +724,7 @@ onUnmounted(() => {
 					display: block;
 					position: absolute;
 					top: 170px;
-					left: 16px;
+					inset-inline-start: 16px;
 					z-index: 2;
 					width: 120px;
 					height: 120px;
@@ -841,15 +841,15 @@ onUnmounted(() => {
 					padding-bottom: 0;
 					> .bottom {
 						> .username {
-							margin-right: 0;
+							margin-inline-end: 0;
 						}
 					}
 				}
 
 				> .avatar {
 					top: 90px;
-					left: 0;
-					right: 0;
+					inset-inline-start: 0;
+					inset-inline-end: 0;
 					width: 92px;
 					height: 92px;
 					margin: auto;
@@ -906,7 +906,7 @@ onUnmounted(() => {
 		> .sub {
 			max-width: 350px;
 			min-width: 350px;
-			margin-left: var(--margin);
+			margin-inline-start: var(--margin);
 		}
 	}
 }
diff --git a/packages/client/src/pages/user/index.photos.vue b/packages/client/src/pages/user/index.photos.vue
index a9859b07..dd3c3e5e 100644
--- a/packages/client/src/pages/user/index.photos.vue
+++ b/packages/client/src/pages/user/index.photos.vue
@@ -1,7 +1,7 @@
 <template>
 	<MkContainer id="photos-container" :max-height="300" :foldable="true">
 		<template #header
-			><i :class="icon('ph-image')" style="margin-right: 0.5em"></i
+			><i :class="icon('ph-image')" style="margin-inline-end: 0.5em"></i
 			>{{ i18n.ts.images }}</template
 		>
 		<div class="ujigsodd">
@@ -115,7 +115,7 @@ onMounted(() => {
 		text-align: center;
 
 		> i {
-			margin-right: 4px;
+			margin-inline-end: 4px;
 		}
 	}
 }
diff --git a/packages/client/src/pages/user/reactions.vue b/packages/client/src/pages/user/reactions.vue
index bed1ab55..de43f2a9 100644
--- a/packages/client/src/pages/user/reactions.vue
+++ b/packages/client/src/pages/user/reactions.vue
@@ -55,7 +55,7 @@ const pagination = {
 		> .avatar {
 			width: 24px;
 			height: 24px;
-			margin-right: 8px;
+			margin-inline-end: 8px;
 		}
 
 		> .reaction {
@@ -64,7 +64,7 @@ const pagination = {
 		}
 
 		> .createdAt {
-			margin-left: auto;
+			margin-inline-start: auto;
 		}
 	}
 }
diff --git a/packages/client/src/pages/welcome.entrance.a.vue b/packages/client/src/pages/welcome.entrance.a.vue
index 2c409a67..4cdc1094 100644
--- a/packages/client/src/pages/welcome.entrance.a.vue
+++ b/packages/client/src/pages/welcome.entrance.a.vue
@@ -51,7 +51,7 @@
 							rounded
 							gradate
 							data-cy-signup
-							style="margin-right: 12px"
+							style="margin-inline-end: 12px"
 							@click="signup()"
 							>{{ i18n.ts.signup }}</MkButton
 						>
@@ -65,7 +65,7 @@
 						<MkButton
 							inline
 							rounded
-							style="margin-left: 12px; margin-top: 12px"
+							style="margin-inline-start: 12px; margin-top: 12px"
 							onclick="window.location.href='/explore'"
 							>Explore</MkButton
 						>
@@ -208,7 +208,7 @@ function showMenu(ev) {
 		> .bg {
 			position: absolute;
 			top: 0;
-			right: 0;
+			inset-inline-end: 0;
 			width: 80%; // 100%からshapeの幅を引いている
 			height: 100%;
 		}
@@ -217,7 +217,7 @@ function showMenu(ev) {
 			position: absolute;
 			top: 0;
 			bottom: 0;
-			right: 64px;
+			inset-inline-end: 64px;
 			margin: auto;
 			width: 500px;
 			height: calc(100% - 128px);
@@ -245,7 +245,7 @@ function showMenu(ev) {
 		> .shape1 {
 			position: absolute;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: 100%;
 			background: var(--accent);
@@ -254,7 +254,7 @@ function showMenu(ev) {
 		> .shape2 {
 			position: absolute;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: 100%;
 			background: var(--accent);
@@ -265,7 +265,7 @@ function showMenu(ev) {
 		> .misskey {
 			position: absolute;
 			top: 42px;
-			left: 42px;
+			inset-inline-start: 42px;
 			width: 140px;
 
 			@media (max-width: 450px) {
@@ -276,11 +276,11 @@ function showMenu(ev) {
 		> .emojis {
 			position: absolute;
 			bottom: 32px;
-			left: 115px;
+			inset-inline-start: 115px;
 			transform: scale(1.5);
 
 			> * {
-				margin-right: 8px;
+				margin-inline-end: 8px;
 			}
 
 			@media (max-width: 1200px) {
@@ -309,7 +309,7 @@ function showMenu(ev) {
 			> .menu {
 				position: absolute;
 				top: 16px;
-				right: 16px;
+				inset-inline-end: 16px;
 				width: 32px;
 				height: 32px;
 				border-radius: 8px;
@@ -352,8 +352,8 @@ function showMenu(ev) {
 		> .federation {
 			position: absolute;
 			bottom: 16px;
-			left: 0;
-			right: 0;
+			inset-inline-start: 0;
+			inset-inline-end: 0;
 			margin: auto;
 			background: var(--acrylicPanel);
 			-webkit-backdrop-filter: var(--blur, blur(15px));
@@ -361,7 +361,7 @@ function showMenu(ev) {
 			border-radius: 999px;
 			overflow: clip;
 			width: 35%;
-			left: 50%;
+			inset-inline-start: 50%;
 			padding: 8px 0;
 
 			@media (max-width: 900px) {
@@ -386,7 +386,7 @@ function showMenu(ev) {
 		display: inline-block;
 		width: 20px;
 		height: 20px;
-		margin-right: 5px;
+		margin-inline-end: 5px;
 		border-radius: 999px;
 	}
 }
diff --git a/packages/client/src/pages/welcome.entrance.b.vue b/packages/client/src/pages/welcome.entrance.b.vue
index 2758f11c..fd498235 100644
--- a/packages/client/src/pages/welcome.entrance.b.vue
+++ b/packages/client/src/pages/welcome.entrance.b.vue
@@ -193,7 +193,7 @@ export default defineComponent({
 		> .bg {
 			position: absolute;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: 100%;
 		}
@@ -202,7 +202,7 @@ export default defineComponent({
 			position: absolute;
 			top: 0;
 			bottom: 0;
-			right: 64px;
+			inset-inline-end: 64px;
 			margin: auto;
 			width: 500px;
 			height: calc(100% - 128px);
@@ -226,7 +226,7 @@ export default defineComponent({
 		> .shape {
 			position: absolute;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: 100%;
 			background: var(--accent);
@@ -236,7 +236,7 @@ export default defineComponent({
 		> .misskey {
 			position: absolute;
 			bottom: 64px;
-			left: 64px;
+			inset-inline-start: 64px;
 			width: 160px;
 		}
 
@@ -293,9 +293,9 @@ export default defineComponent({
 					padding: 16px 0;
 
 					> span:not(:last-child) {
-						padding-right: 1em;
-						margin-right: 1em;
-						border-right: solid 1px rgba(255, 255, 255, 0.5);
+						padding-inline-end: 1em;
+						margin-inline-end: 1em;
+						border-inline-end: solid 1px rgba(255, 255, 255, 0.5);
 					}
 				}
 			}
diff --git a/packages/client/src/pages/welcome.entrance.c.vue b/packages/client/src/pages/welcome.entrance.c.vue
index d131bb94..ff4bb356 100644
--- a/packages/client/src/pages/welcome.entrance.c.vue
+++ b/packages/client/src/pages/welcome.entrance.c.vue
@@ -210,7 +210,7 @@ export default defineComponent({
 		> .bg {
 			position: absolute;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: 100%;
 		}
@@ -218,7 +218,7 @@ export default defineComponent({
 		> .fade {
 			position: absolute;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: 100%;
 			background: rgba(0, 0, 0, 0.25);
@@ -227,10 +227,10 @@ export default defineComponent({
 		> .emojis {
 			position: absolute;
 			bottom: 32px;
-			left: 35px;
+			inset-inline-start: 35px;
 
 			> * {
-				margin-right: 8px;
+				margin-inline-end: 8px;
 			}
 
 			@media (max-width: 1200px) {
@@ -259,7 +259,7 @@ export default defineComponent({
 				> .bg {
 					position: absolute;
 					top: 0;
-					left: 0;
+					inset-inline-start: 0;
 					width: 100%;
 					height: 128px;
 					background-position: center;
@@ -269,7 +269,7 @@ export default defineComponent({
 					> .fade {
 						position: absolute;
 						bottom: 0;
-						left: 0;
+						inset-inline-start: 0;
 						width: 100%;
 						height: 128px;
 						background: linear-gradient(
@@ -314,9 +314,9 @@ export default defineComponent({
 
 						> div {
 							> span:not(:last-child) {
-								padding-right: 1em;
-								margin-right: 1em;
-								border-right: solid 0.5px var(--divider);
+								padding-inline-end: 1em;
+								margin-inline-end: 1em;
+								border-inline-end: solid 0.5px var(--divider);
 							}
 						}
 
@@ -334,7 +334,7 @@ export default defineComponent({
 					> .menu {
 						position: absolute;
 						top: 16px;
-						right: 16px;
+						inset-inline-end: 16px;
 						width: 32px;
 						height: 32px;
 						border-radius: 8px;
@@ -351,7 +351,7 @@ export default defineComponent({
 				font-size: 0.9em;
 
 				> *:not(:last-child) {
-					margin-right: 1.5em;
+					margin-inline-end: 1.5em;
 				}
 			}
 		}
diff --git a/packages/client/src/scripts/langmap.ts b/packages/client/src/scripts/langmap.ts
index 0831aec0..1f8a1428 100644
--- a/packages/client/src/scripts/langmap.ts
+++ b/packages/client/src/scripts/langmap.ts
@@ -20,15 +20,19 @@ export const langmap = {
 	},
 	ar: {
 		nativeName: "العربية",
+		rtl: true,
 	},
 	"ar-AR": {
 		nativeName: "العربية",
+		rtl: true,
 	},
 	"ar-MA": {
 		nativeName: "العربية",
+		rtl: true,
 	},
 	"ar-SA": {
 		nativeName: "العربية (السعودية)",
+		rtl: true,
 	},
 	"ay-BO": {
 		nativeName: "Aymar aru",
@@ -206,9 +210,11 @@ export const langmap = {
 	},
 	fa: {
 		nativeName: "فارسی",
+		rtl: true,
 	},
 	"fa-IR": {
 		nativeName: "فارسی",
+		rtl: true,
 	},
 	"fb-LT": {
 		nativeName: "Leet Speak",
@@ -275,9 +281,11 @@ export const langmap = {
 	},
 	he: {
 		nativeName: "עברית‏",
+		rtl: true,
 	},
 	"he-IL": {
 		nativeName: "עברית‏",
+		rtl: true,
 	},
 	hi: {
 		nativeName: "हिन्दी",
@@ -485,6 +493,7 @@ export const langmap = {
 	},
 	"ps-AF": {
 		nativeName: "پښتو",
+		rtl: true,
 	},
 	pt: {
 		nativeName: "Português",
@@ -614,9 +623,11 @@ export const langmap = {
 	},
 	ur: {
 		nativeName: "اردو",
+		rtl: true,
 	},
 	"ur-PK": {
 		nativeName: "اردو",
+		rtl: true,
 	},
 	uz: {
 		nativeName: "O'zbek",
@@ -635,9 +646,11 @@ export const langmap = {
 	},
 	yi: {
 		nativeName: "ייִדיש",
+		rtl: true,
 	},
 	"yi-DE": {
 		nativeName: "ייִדיש (German)",
+		rtl: true,
 	},
 	zh: {
 		nativeName: "中文",
diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss
index bc28b436..f345297f 100644
--- a/packages/client/src/style.scss
+++ b/packages/client/src/style.scss
@@ -212,7 +212,7 @@ hr {
 ._modalBg {
 	position: fixed;
 	top: 0;
-	left: 0;
+	inset-inline-start: 0;
 	width: 100%;
 	height: 100%;
 	background: var(--modalBg);
@@ -389,11 +389,11 @@ hr {
 		margin: 0 !important;
 
 		&:not(:first-child) {
-			margin-left: 8px !important;
+			margin-inline-start: 8px !important;
 		}
 
 		&:not(:last-child) {
-			margin-right: 8px !important;
+			margin-inline-end: 8px !important;
 		}
 	}
 }
@@ -531,8 +531,8 @@ hr {
 			content: "";
 			position: absolute;
 			top: 0;
-			right: 0;
-			left: 0;
+			inset-inline-end: 0;
+			inset-inline-start: 0;
 			bottom: 0;
 			z-index: -1;
 			background: var(--bg);
@@ -582,7 +582,7 @@ hr {
 }
 
 ._beta {
-	margin-left: 0.7em;
+	margin-inline-start: 0.7em;
 	font-size: 65%;
 	padding: 2px 3px;
 	color: var(--accent);
@@ -611,7 +611,7 @@ hr {
 				opacity: 0.7;
 
 				> ._icon {
-					margin-right: 4px;
+					margin-inline-end: 4px;
 					display: none;
 				}
 			}
@@ -648,7 +648,7 @@ hr {
 	// 	content: "";
 	// 	position: absolute;
 	// 	bottom: 0;
-	// 	left: 0;
+	// 	inset-inline-start: 0;
 	// 	width: 0%;
 	// 	border-bottom: 1px solid currentColor;
 	// 	transition: 0.3s ease-in-out;
diff --git a/packages/client/src/ui/_common_/common.vue b/packages/client/src/ui/_common_/common.vue
index c11b528f..5fe30402 100644
--- a/packages/client/src/ui/_common_/common.vue
+++ b/packages/client/src/ui/_common_/common.vue
@@ -95,7 +95,7 @@ if ($i) {
 	position: fixed;
 	z-index: 4000000;
 	top: 15px;
-	right: 15px;
+	inset-inline-end: 15px;
 
 	&:before {
 		content: "";
@@ -114,7 +114,7 @@ if ($i) {
 #devTicker {
 	position: fixed;
 	top: 0;
-	left: 0;
+	inset-inline-start: 0;
 	z-index: 2147483647;
 	color: #f6c177;
 	background: #6e6a86;
diff --git a/packages/client/src/ui/_common_/navbar-for-mobile.vue b/packages/client/src/ui/_common_/navbar-for-mobile.vue
index f0f83b8d..54302683 100644
--- a/packages/client/src/ui/_common_/navbar-for-mobile.vue
+++ b/packages/client/src/ui/_common_/navbar-for-mobile.vue
@@ -197,7 +197,7 @@ function more() {
 			> .banner {
 				position: absolute;
 				top: 0;
-				left: 0;
+				inset-inline-start: 0;
 				width: 100%;
 				height: 100%;
 				background-size: cover;
@@ -244,7 +244,7 @@ function more() {
 				height: 40px;
 				color: var(--fgOnAccent);
 				font-weight: bold;
-				text-align: left;
+				text-align: initial;
 
 				&:before {
 					content: "";
@@ -254,8 +254,8 @@ function more() {
 					margin: auto;
 					position: absolute;
 					top: 0;
-					left: 0;
-					right: 0;
+					inset-inline-start: 0;
+					inset-inline-end: 0;
 					bottom: 0;
 					border-radius: 999px;
 					background: linear-gradient(
@@ -274,8 +274,8 @@ function more() {
 
 				> .icon {
 					position: relative;
-					margin-left: 30px;
-					margin-right: 8px;
+					margin-inline-start: 30px;
+					margin-inline-end: 8px;
 					width: 32px;
 				}
 
@@ -303,12 +303,12 @@ function more() {
 				position: relative;
 				display: flex;
 				align-items: center;
-				padding-left: 30px;
+				padding-inline-start: 30px;
 				text-overflow: ellipsis;
 				overflow: hidden;
 				white-space: nowrap;
 				width: 100%;
-				text-align: left;
+				text-align: initial;
 				box-sizing: border-box;
 				margin-top: 16px;
 
@@ -317,7 +317,7 @@ function more() {
 					width: 32px;
 					aspect-ratio: 1;
 					transform: translateX(-100%);
-					left: 50%;
+					inset-inline-start: 50%;
 				}
 			}
 		}
@@ -333,26 +333,26 @@ function more() {
 			> .item {
 				position: relative;
 				display: block;
-				padding-left: 24px;
+				padding-inline-start: 24px;
 				line-height: 2.85rem;
 				text-overflow: ellipsis;
 				overflow: hidden;
 				white-space: nowrap;
 				width: 100%;
-				text-align: left;
+				text-align: initial;
 				box-sizing: border-box;
 				color: var(--navFg);
 
 				> .icon {
 					position: relative;
 					width: 32px;
-					margin-right: 8px;
+					margin-inline-end: 8px;
 				}
 
 				> .indicator {
 					position: absolute;
 					top: 0;
-					left: 20px;
+					inset-inline-start: 20px;
 					color: var(--navIndicator);
 					font-size: 8px;
 				}
@@ -385,8 +385,8 @@ function more() {
 						margin: auto;
 						position: absolute;
 						top: 0;
-						left: 0;
-						right: 0;
+						inset-inline-start: 0;
+						inset-inline-end: 0;
 						bottom: 0;
 						border-radius: 999px;
 						background: var(--accentedBg);
diff --git a/packages/client/src/ui/_common_/navbar.vue b/packages/client/src/ui/_common_/navbar.vue
index d0bab518..05298b8b 100644
--- a/packages/client/src/ui/_common_/navbar.vue
+++ b/packages/client/src/ui/_common_/navbar.vue
@@ -268,7 +268,7 @@ function more(ev: MouseEvent) {
 			background: var(--navBg);
 		}
 		#firefish_app > .wallpaper:not(.centered) & {
-			border-right: 1px solid var(--divider);
+			border-inline-end: 1px solid var(--divider);
 		}
 		contain: strict;
 		display: flex;
@@ -277,8 +277,8 @@ function more(ev: MouseEvent) {
 
 	&:not(.iconOnly) {
 		> .body {
-			margin-left: -200px;
-			padding-left: 200px;
+			margin-inline-start: -200px;
+			padding-inline-start: 200px;
 			box-sizing: content-box;
 			width: $nav-width;
 
@@ -289,7 +289,7 @@ function more(ev: MouseEvent) {
 				> .banner {
 					position: absolute;
 					top: 0;
-					left: 0;
+					inset-inline-start: 0;
 					width: 100%;
 					height: 100%;
 					background-size: cover;
@@ -362,7 +362,7 @@ function more(ev: MouseEvent) {
 					}
 
 					> .text {
-						margin-left: 1rem;
+						margin-inline-start: 1rem;
 					}
 				}
 
@@ -420,7 +420,7 @@ function more(ev: MouseEvent) {
 					> .icon {
 						position: relative;
 						width: 32px;
-						margin-right: 8px;
+						margin-inline-end: 8px;
 					}
 
 					> .indicator {
@@ -609,7 +609,7 @@ function more(ev: MouseEvent) {
 					> .indicator {
 						position: absolute;
 						top: 6px;
-						left: 24px;
+						inset-inline-start: 24px;
 						color: var(--navIndicator);
 						font-size: 8px;
 						animation: blink 1s infinite;
diff --git a/packages/client/src/ui/_common_/statusbar-federation.vue b/packages/client/src/ui/_common_/statusbar-federation.vue
index f33561b1..a6fdb60c 100644
--- a/packages/client/src/ui/_common_/statusbar-federation.vue
+++ b/packages/client/src/ui/_common_/statusbar-federation.vue
@@ -107,14 +107,14 @@ function getInstanceIcon(instance): string {
 	::v-deep(.item) {
 		display: inline-block;
 		vertical-align: bottom;
-		margin-right: 5em;
+		margin-inline-end: 5em;
 
 		> .icon {
 			display: inline-block;
 			height: var(--height);
 			aspect-ratio: 1;
 			vertical-align: bottom;
-			margin-right: 1em;
+			margin-inline-end: 1em;
 		}
 
 		> .host {
@@ -122,7 +122,7 @@ function getInstanceIcon(instance): string {
 		}
 
 		&.colored {
-			padding-right: 1em;
+			padding-inline-end: 1em;
 			color: #fff;
 		}
 	}
diff --git a/packages/client/src/ui/_common_/statusbar-user-list.vue b/packages/client/src/ui/_common_/statusbar-user-list.vue
index 53dea3c2..60630d44 100644
--- a/packages/client/src/ui/_common_/statusbar-user-list.vue
+++ b/packages/client/src/ui/_common_/statusbar-user-list.vue
@@ -105,7 +105,7 @@ useInterval(tick, Math.max(5000, props.refreshIntervalSec * 1000), {
 			height: var(--height);
 			aspect-ratio: 1;
 			vertical-align: bottom;
-			margin-right: 8px;
+			margin-inline-end: 8px;
 		}
 
 		> .text {
diff --git a/packages/client/src/ui/_common_/stream-indicator.vue b/packages/client/src/ui/_common_/stream-indicator.vue
index 04b29e1a..cc444f5b 100644
--- a/packages/client/src/ui/_common_/stream-indicator.vue
+++ b/packages/client/src/ui/_common_/stream-indicator.vue
@@ -51,7 +51,7 @@ onUnmounted(() => {
 	position: fixed;
 	z-index: 16385;
 	bottom: 8px;
-	right: 8px;
+	inset-inline-end: 8px;
 	margin: 0;
 	padding: 6px 12px;
 	font-size: 0.9em;
diff --git a/packages/client/src/ui/_common_/upload.vue b/packages/client/src/ui/_common_/upload.vue
index b7ecc038..674ae27c 100644
--- a/packages/client/src/ui/_common_/upload.vue
+++ b/packages/client/src/ui/_common_/upload.vue
@@ -67,7 +67,7 @@ const zIndex = os.claimZIndex("high");
 <style lang="scss" scoped>
 .mk-uploader {
 	position: fixed;
-	right: 16px;
+	inset-inline-end: 16px;
 	width: 260px;
 	top: 32px;
 	padding: 16px 20px;
@@ -125,7 +125,7 @@ const zIndex = os.claimZIndex("high");
 	flex-shrink: 1;
 }
 .mk-uploader > ol > li > .top > .name > i {
-	margin-right: 4px;
+	margin-inline-end: 4px;
 }
 .mk-uploader > ol > li > .top > .status {
 	display: block;
diff --git a/packages/client/src/ui/deck.vue b/packages/client/src/ui/deck.vue
index 21901916..9d54d682 100644
--- a/packages/client/src/ui/deck.vue
+++ b/packages/client/src/ui/deck.vue
@@ -440,20 +440,21 @@ async function deleteProfile() {
 
 			&.center {
 				> .column:first-of-type {
-					margin-left: auto;
+					margin-inline-start: auto;
 				}
 
 				> .column:last-of-type {
-					margin-right: auto;
+					margin-inline-end: auto;
 				}
 			}
 
 			> .column {
 				flex-shrink: 0;
-				border-right: solid var(--deckDividerThickness) var(--bg);
+				border-inline-end: solid var(--deckDividerThickness) var(--bg);
 
 				&:first-of-type {
-					border-left: solid var(--deckDividerThickness) var(--bg);
+					border-inline-start: solid var(--deckDividerThickness)
+						var(--bg);
 				}
 
 				&.folder {
@@ -480,8 +481,8 @@ async function deleteProfile() {
 
 			> .sideMenu {
 				flex-shrink: 0;
-				margin-right: 0;
-				margin-left: auto;
+				margin-inline-end: 0;
+				margin-inline-start: auto;
 				display: flex;
 				flex-direction: column;
 				justify-content: center;
@@ -528,7 +529,7 @@ async function deleteProfile() {
 		position: fixed;
 		z-index: 1000;
 		bottom: 0;
-		left: 0;
+		inset-inline-start: 0;
 		padding: 16px;
 		display: flex;
 		width: 100%;
@@ -545,14 +546,14 @@ async function deleteProfile() {
 			color: var(--fg);
 
 			&:not(:last-child) {
-				margin-right: 12px;
+				margin-inline-end: 12px;
 			}
 
 			@media (max-width: 400px) {
 				height: 60px;
 
 				&:not(:last-child) {
-					margin-right: 8px;
+					margin-inline-end: 8px;
 				}
 			}
 
@@ -563,7 +564,7 @@ async function deleteProfile() {
 			> .indicator {
 				position: absolute;
 				top: 0;
-				left: 0;
+				inset-inline-start: 0;
 				color: var(--indicator);
 				font-size: 16px;
 			}
@@ -573,11 +574,11 @@ async function deleteProfile() {
 			}
 
 			&:first-child {
-				margin-left: 0;
+				margin-inline-start: 0;
 			}
 
 			&:last-child {
-				margin-right: 0;
+				margin-inline-end: 0;
 			}
 
 			> * {
@@ -601,7 +602,7 @@ async function deleteProfile() {
 	> .menu {
 		position: fixed;
 		top: 0;
-		left: 0;
+		inset-inline-start: 0;
 		z-index: 1001;
 		// ほんとは単に 100vh と書きたいところだが... https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
 		height: calc(var(--vh, 1vh) * 100);
diff --git a/packages/client/src/ui/deck/antenna-column.vue b/packages/client/src/ui/deck/antenna-column.vue
index 6a39cfcc..600e7861 100644
--- a/packages/client/src/ui/deck/antenna-column.vue
+++ b/packages/client/src/ui/deck/antenna-column.vue
@@ -7,7 +7,7 @@
 	>
 		<template #header>
 			<i :class="icon('ph-flying-saucer')"></i
-			><span style="margin-left: 8px">{{ column.name }}</span>
+			><span style="margin-inline-start: 8px">{{ column.name }}</span>
 		</template>
 
 		<XTimeline
diff --git a/packages/client/src/ui/deck/channel-column.vue b/packages/client/src/ui/deck/channel-column.vue
index af11c360..d7c9ac53 100644
--- a/packages/client/src/ui/deck/channel-column.vue
+++ b/packages/client/src/ui/deck/channel-column.vue
@@ -7,7 +7,7 @@
 	>
 		<template #header>
 			<i :class="icon('ph-television')"></i
-			><span style="margin-left: 8px">{{ column.name }}</span>
+			><span style="margin-inline-start: 8px">{{ column.name }}</span>
 		</template>
 
 		<XTimeline
diff --git a/packages/client/src/ui/deck/column.vue b/packages/client/src/ui/deck/column.vue
index ac99d6b8..e2a2d8d9 100644
--- a/packages/client/src/ui/deck/column.vue
+++ b/packages/client/src/ui/deck/column.vue
@@ -334,7 +334,7 @@ function onDrop(ev) {
 			position: absolute;
 			z-index: 1000;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: 100%;
 			background: var(--focus);
@@ -348,7 +348,7 @@ function onDrop(ev) {
 			position: absolute;
 			z-index: 1000;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: 100%;
 			background: var(--focus);
@@ -443,7 +443,7 @@ function onDrop(ev) {
 
 		> .toggleActive,
 		> .action {
-			margin-left: -16px;
+			margin-inline-start: -16px;
 		}
 
 		> .action {
@@ -455,8 +455,8 @@ function onDrop(ev) {
 		}
 
 		> .menu {
-			margin-left: auto;
-			margin-right: -16px;
+			margin-inline-start: auto;
+			margin-inline-end: -16px;
 		}
 	}
 
diff --git a/packages/client/src/ui/deck/direct-column.vue b/packages/client/src/ui/deck/direct-column.vue
index 33d0389c..b3c46f26 100644
--- a/packages/client/src/ui/deck/direct-column.vue
+++ b/packages/client/src/ui/deck/direct-column.vue
@@ -7,7 +7,7 @@
 		<template #header
 			><i
 				:class="icon('ph-envelope-simple-open')"
-				style="margin-right: 8px"
+				style="margin-inline-end: 8px"
 			></i
 			>{{ column.name }}</template
 		>
diff --git a/packages/client/src/ui/deck/list-column.vue b/packages/client/src/ui/deck/list-column.vue
index 761c62ab..60c2229e 100644
--- a/packages/client/src/ui/deck/list-column.vue
+++ b/packages/client/src/ui/deck/list-column.vue
@@ -7,7 +7,7 @@
 	>
 		<template #header>
 			<i :class="icon('ph-list-bullets')"></i
-			><span style="margin-left: 8px">{{ column.name }}</span>
+			><span style="margin-inline-start: 8px">{{ column.name }}</span>
 		</template>
 
 		<XTimeline
diff --git a/packages/client/src/ui/deck/mentions-column.vue b/packages/client/src/ui/deck/mentions-column.vue
index d2a49824..7ed8d4c9 100644
--- a/packages/client/src/ui/deck/mentions-column.vue
+++ b/packages/client/src/ui/deck/mentions-column.vue
@@ -5,7 +5,7 @@
 		@parent-focus="($event) => emit('parent-focus', $event)"
 	>
 		<template #header
-			><i :class="icon('ph-at')" style="margin-right: 8px"></i
+			><i :class="icon('ph-at')" style="margin-inline-end: 8px"></i
 			>{{ column.name }}</template
 		>
 
diff --git a/packages/client/src/ui/deck/notifications-column.vue b/packages/client/src/ui/deck/notifications-column.vue
index 2fdece9e..fc1792c9 100644
--- a/packages/client/src/ui/deck/notifications-column.vue
+++ b/packages/client/src/ui/deck/notifications-column.vue
@@ -6,7 +6,7 @@
 		@parent-focus="($event) => emit('parent-focus', $event)"
 	>
 		<template #header
-			><i :class="icon('ph-bell')" style="margin-right: 8px"></i
+			><i :class="icon('ph-bell')" style="margin-inline-end: 8px"></i
 			>{{ column.name }}</template
 		>
 
diff --git a/packages/client/src/ui/deck/tl-column.vue b/packages/client/src/ui/deck/tl-column.vue
index 9c7b4404..6465ff05 100644
--- a/packages/client/src/ui/deck/tl-column.vue
+++ b/packages/client/src/ui/deck/tl-column.vue
@@ -21,7 +21,7 @@
 				v-else-if="column.tl === 'global'"
 				:class="icon('ph-planet')"
 			></i>
-			<span style="margin-left: 8px">{{ column.name }}</span>
+			<span style="margin-inline-start: 8px">{{ column.name }}</span>
 		</template>
 
 		<div v-if="disabled" class="iwaalbte">
diff --git a/packages/client/src/ui/deck/widgets-column.vue b/packages/client/src/ui/deck/widgets-column.vue
index 45534dce..41435c0c 100644
--- a/packages/client/src/ui/deck/widgets-column.vue
+++ b/packages/client/src/ui/deck/widgets-column.vue
@@ -7,7 +7,7 @@
 		@parent-focus="($event) => emit('parent-focus', $event)"
 	>
 		<template #header
-			><i :class="icon('ph-browser')" style="margin-right: 8px"></i
+			><i :class="icon('ph-browser')" style="margin-inline-end: 8px"></i
 			>{{ column.name }}</template
 		>
 		<div class="wtdtxvec">
diff --git a/packages/client/src/ui/universal.vue b/packages/client/src/ui/universal.vue
index 01e50e7f..1bdd1285 100644
--- a/packages/client/src/ui/universal.vue
+++ b/packages/client/src/ui/universal.vue
@@ -539,7 +539,7 @@ console.log(mainRouter.currentRoute.value.name);
 	}
 	&:not(.isMobile) {
 		> .contents {
-			border-right: 0.5px solid var(--divider);
+			border-inline-end: 0.5px solid var(--divider);
 		}
 	}
 	&.wallpaper {
@@ -573,8 +573,8 @@ console.log(mainRouter.currentRoute.value.name);
 		}
 
 		> :deep(.sidebar:not(.iconOnly)) {
-			margin-left: -200px;
-			padding-left: 200px;
+			margin-inline-start: -200px;
+			padding-inline-start: 200px;
 			box-sizing: content-box;
 			.banner {
 				pointer-events: none;
@@ -618,7 +618,7 @@ console.log(mainRouter.currentRoute.value.name);
 					hsla(0, 0%, 0%, 0) 100%
 				) !important;
 				width: 125% !important;
-				left: -12.5% !important;
+				inset-inline-start: -12.5% !important;
 				height: 145% !important;
 			}
 		}
@@ -677,7 +677,7 @@ console.log(mainRouter.currentRoute.value.name);
 	> .widgetsDrawer {
 		position: fixed;
 		top: 0;
-		right: 0;
+		inset-inline-end: 0;
 		z-index: 1001;
 		// ほんとは単に 100vh と書きたいところだが... https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
 		height: calc(var(--vh, 1vh) * 100);
@@ -691,7 +691,7 @@ console.log(mainRouter.currentRoute.value.name);
 	> .postButton,
 	.widgetButton {
 		bottom: var(--stickyBottom);
-		right: 1.5rem;
+		inset-inline-end: 1.5rem;
 		height: 4rem;
 		width: 4rem;
 		background-position: center;
@@ -724,7 +724,7 @@ console.log(mainRouter.currentRoute.value.name);
 		position: fixed;
 		z-index: 1000;
 		bottom: 0;
-		left: 0;
+		inset-inline-start: 0;
 		padding: 12px 12px calc(env(safe-area-inset-bottom, 0px) + 12px) 12px;
 		display: flex;
 		width: 100%;
@@ -763,7 +763,7 @@ console.log(mainRouter.currentRoute.value.name);
 				> .indicator {
 					position: absolute;
 					top: 0;
-					left: 0;
+					inset-inline-start: 0;
 					color: var(--indicator);
 					font-size: 16px;
 				}
@@ -774,20 +774,20 @@ console.log(mainRouter.currentRoute.value.name);
 			}
 
 			&:not(:last-child) {
-				margin-right: 12px;
+				margin-inline-end: 12px;
 			}
 
 			@media (max-width: 400px) {
 				height: 60px;
 
 				&:not(:last-child) {
-					margin-right: 8px;
+					margin-inline-end: 8px;
 				}
 			}
 			> .indicator {
 				position: absolute;
 				top: 0;
-				left: 0;
+				inset-inline-start: 0;
 				color: var(--indicator);
 				font-size: 16px;
 			}
@@ -797,11 +797,11 @@ console.log(mainRouter.currentRoute.value.name);
 			}
 
 			&:first-child {
-				margin-left: 0;
+				margin-inline-start: 0;
 			}
 
 			&:last-child {
-				margin-right: 0;
+				margin-inline-end: 0;
 			}
 
 			> * {
@@ -825,7 +825,7 @@ console.log(mainRouter.currentRoute.value.name);
 	> .menuDrawer {
 		position: fixed;
 		top: 0;
-		left: 0;
+		inset-inline-start: 0;
 		z-index: 1001;
 		// ほんとは単に 100vh と書きたいところだが... https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
 		height: calc(var(--vh, 1vh) * 100);
@@ -843,6 +843,6 @@ console.log(mainRouter.currentRoute.value.name);
 .statusbars {
 	position: sticky;
 	top: 0;
-	left: 0;
+	inset-inline-start: 0;
 }
 </style>
diff --git a/packages/client/src/ui/visitor/a.vue b/packages/client/src/ui/visitor/a.vue
index 6006e407..1688b9be 100644
--- a/packages/client/src/ui/visitor/a.vue
+++ b/packages/client/src/ui/visitor/a.vue
@@ -230,7 +230,7 @@ export default defineComponent({
 					}
 
 					&:first-child {
-						margin-right: 16px;
+						margin-inline-end: 16px;
 					}
 				}
 			}
@@ -278,7 +278,7 @@ export default defineComponent({
 			> .header {
 				position: sticky;
 				top: 0;
-				left: 0;
+				inset-inline-start: 0;
 				z-index: 1000;
 			}
 
diff --git a/packages/client/src/ui/visitor/b.vue b/packages/client/src/ui/visitor/b.vue
index 4e7fbf2f..05b5a740 100644
--- a/packages/client/src/ui/visitor/b.vue
+++ b/packages/client/src/ui/visitor/b.vue
@@ -216,7 +216,7 @@ defineExpose({
 		> .kanban {
 			position: fixed;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 			width: 500px;
 			height: 100vh;
 			overflow: auto;
@@ -253,7 +253,7 @@ defineExpose({
 		position: fixed;
 		z-index: 1001;
 		top: 0;
-		left: 0;
+		inset-inline-start: 0;
 		width: 100vw;
 		height: 100vh;
 	}
@@ -262,7 +262,7 @@ defineExpose({
 		position: fixed;
 		z-index: 1001;
 		top: 0;
-		left: 0;
+		inset-inline-start: 0;
 		width: 240px;
 		height: 100vh;
 		background: var(--panel);
@@ -272,7 +272,7 @@ defineExpose({
 			padding: 16px;
 
 			> .icon {
-				margin-right: 1em;
+				margin-inline-end: 1em;
 			}
 		}
 
diff --git a/packages/client/src/ui/visitor/header.vue b/packages/client/src/ui/visitor/header.vue
index 5458efb6..f1ea238c 100644
--- a/packages/client/src/ui/visitor/header.vue
+++ b/packages/client/src/ui/visitor/header.vue
@@ -171,7 +171,7 @@ export default defineComponent({
 	$height: 60px;
 	position: sticky;
 	top: 0;
-	left: 0;
+	inset-inline-start: 0;
 	z-index: 1000;
 	line-height: $height;
 	-webkit-backdrop-filter: var(--blur, blur(32px));
@@ -194,7 +194,7 @@ export default defineComponent({
 				border-bottom: solid $line transparent;
 
 				> .icon {
-					margin-right: 0.5em;
+					margin-inline-end: 0.5em;
 				}
 
 				&.page {
@@ -212,7 +212,7 @@ export default defineComponent({
 					position: relative;
 
 					> .icon + .text {
-						margin-left: 8px;
+						margin-inline-start: 8px;
 					}
 
 					> .avatar {
@@ -221,7 +221,7 @@ export default defineComponent({
 						width: $size;
 						height: $size;
 						vertical-align: middle;
-						margin-right: 8px;
+						margin-inline-end: 8px;
 						pointer-events: none;
 					}
 
@@ -243,15 +243,15 @@ export default defineComponent({
 			}
 
 			> .right {
-				margin-left: auto;
+				margin-inline-start: auto;
 
 				> .search {
 					background: var(--bg);
 					border-radius: 999px;
 					width: 230px;
 					line-height: $height - 20px;
-					margin-right: 16px;
-					text-align: left;
+					margin-inline-end: 16px;
+					text-align: initial;
 
 					> * {
 						opacity: 0.7;
@@ -294,7 +294,7 @@ export default defineComponent({
 			text-align: center;
 
 			> .icon + .text {
-				margin-left: 8px;
+				margin-inline-start: 8px;
 			}
 
 			> .avatar {
@@ -303,7 +303,7 @@ export default defineComponent({
 				width: $size;
 				height: $size;
 				vertical-align: middle;
-				margin-right: 8px;
+				margin-inline-end: 8px;
 				pointer-events: none;
 			}
 		}
diff --git a/packages/client/src/ui/visitor/kanban.vue b/packages/client/src/ui/visitor/kanban.vue
index c92dc9fd..ccccbc6d 100644
--- a/packages/client/src/ui/visitor/kanban.vue
+++ b/packages/client/src/ui/visitor/kanban.vue
@@ -172,7 +172,7 @@ export default defineComponent({
 	> .back {
 		position: absolute;
 		top: 0;
-		left: 0;
+		inset-inline-start: 0;
 		width: 100%;
 		height: 100%;
 		background: rgba(0, 0, 0, 0.3);
@@ -263,7 +263,7 @@ export default defineComponent({
 
 			> .announcements {
 				margin: 32px 0;
-				text-align: left;
+				text-align: initial;
 
 				> header {
 					padding: 12px 16px;
diff --git a/packages/client/src/widgets/aiscript.vue b/packages/client/src/widgets/aiscript.vue
index a00f143d..5bbcc693 100644
--- a/packages/client/src/widgets/aiscript.vue
+++ b/packages/client/src/widgets/aiscript.vue
@@ -188,7 +188,7 @@ defineExpose<WidgetComponentExpose>({
 
 	> .logs {
 		border-top: solid 0.5px var(--divider);
-		text-align: left;
+		text-align: initial;
 		padding: 16px;
 
 		&:empty {
diff --git a/packages/client/src/widgets/calendar.vue b/packages/client/src/widgets/calendar.vue
index b37970eb..64565ed9 100644
--- a/packages/client/src/widgets/calendar.vue
+++ b/packages/client/src/widgets/calendar.vue
@@ -203,7 +203,7 @@ defineExpose<WidgetComponentExpose>({
 				opacity: 0.8;
 
 				> b {
-					margin-left: 2px;
+					margin-inline-start: 2px;
 				}
 			}
 
diff --git a/packages/client/src/widgets/clock.vue b/packages/client/src/widgets/clock.vue
index 6cdd520d..8a5e7b8f 100644
--- a/packages/client/src/widgets/clock.vue
+++ b/packages/client/src/widgets/clock.vue
@@ -246,22 +246,22 @@ defineExpose<WidgetComponentExpose>({
 
 		&.a {
 			top: 14px;
-			left: 14px;
+			inset-inline-start: 14px;
 		}
 
 		&.b {
 			top: 14px;
-			right: 14px;
+			inset-inline-end: 14px;
 		}
 
 		&.c {
 			bottom: 14px;
-			left: 14px;
+			inset-inline-start: 14px;
 		}
 
 		&.d {
 			bottom: 14px;
-			right: 14px;
+			inset-inline-end: 14px;
 		}
 	}
 
diff --git a/packages/client/src/widgets/federation.vue b/packages/client/src/widgets/federation.vue
index 79b5469c..3224a720 100644
--- a/packages/client/src/widgets/federation.vue
+++ b/packages/client/src/widgets/federation.vue
@@ -141,7 +141,7 @@ defineExpose<WidgetComponentExpose>({
 				height: ($bodyTitleHieght + $bodyInfoHieght);
 				object-fit: cover;
 				border-radius: 4px;
-				margin-right: 8px;
+				margin-inline-end: 8px;
 			}
 
 			> .body {
@@ -149,7 +149,7 @@ defineExpose<WidgetComponentExpose>({
 				overflow: hidden;
 				font-size: 0.9em;
 				color: var(--fg);
-				padding-right: 8px;
+				padding-inline-end: 8px;
 
 				> .a {
 					display: block;
diff --git a/packages/client/src/widgets/job-queue.vue b/packages/client/src/widgets/job-queue.vue
index 8e5cb860..bfce4755 100644
--- a/packages/client/src/widgets/job-queue.vue
+++ b/packages/client/src/widgets/job-queue.vue
@@ -254,7 +254,7 @@ defineExpose<WidgetComponentExpose>({
 
 			> .icon {
 				color: var(--warn);
-				margin-left: auto;
+				margin-inline-start: auto;
 				animation: warnBlink 1s infinite;
 			}
 		}
diff --git a/packages/client/src/widgets/memo.vue b/packages/client/src/widgets/memo.vue
index 7159b924..416e4934 100644
--- a/packages/client/src/widgets/memo.vue
+++ b/packages/client/src/widgets/memo.vue
@@ -113,7 +113,7 @@ defineExpose<WidgetComponentExpose>({
 		display: block;
 		position: absolute;
 		bottom: 8px;
-		right: 8px;
+		inset-inline-end: 8px;
 		margin: 0;
 		padding: 0 10px;
 		height: 28px;
diff --git a/packages/client/src/widgets/server-metric/cpu-mem.vue b/packages/client/src/widgets/server-metric/cpu-mem.vue
index df03b813..b9fede1d 100644
--- a/packages/client/src/widgets/server-metric/cpu-mem.vue
+++ b/packages/client/src/widgets/server-metric/cpu-mem.vue
@@ -179,11 +179,11 @@ function onStatsLog(statsLog) {
 		width: 50%;
 
 		&:first-child {
-			padding-right: 5px;
+			padding-inline-end: 5px;
 		}
 
 		&:last-child {
-			padding-left: 5px;
+			padding-inline-start: 5px;
 		}
 
 		> text {
diff --git a/packages/client/src/widgets/server-metric/cpu.vue b/packages/client/src/widgets/server-metric/cpu.vue
index 4a18098f..3997d629 100644
--- a/packages/client/src/widgets/server-metric/cpu.vue
+++ b/packages/client/src/widgets/server-metric/cpu.vue
@@ -42,7 +42,7 @@ onBeforeUnmount(() => {
 	> .pie {
 		height: 82px;
 		flex-shrink: 0;
-		margin-right: 16px;
+		margin-inline-end: 16px;
 	}
 
 	> div {
@@ -57,7 +57,7 @@ onBeforeUnmount(() => {
 				margin-bottom: 4px;
 
 				> i {
-					margin-right: 4px;
+					margin-inline-end: 4px;
 				}
 			}
 		}
diff --git a/packages/client/src/widgets/server-metric/disk.vue b/packages/client/src/widgets/server-metric/disk.vue
index 71ebd173..b2fef6ea 100644
--- a/packages/client/src/widgets/server-metric/disk.vue
+++ b/packages/client/src/widgets/server-metric/disk.vue
@@ -35,7 +35,7 @@ const available = computed(() => props.meta.fs.total - props.meta.fs.used);
 	> .pie {
 		height: 82px;
 		flex-shrink: 0;
-		margin-right: 16px;
+		margin-inline-end: 16px;
 	}
 
 	> div {
@@ -50,7 +50,7 @@ const available = computed(() => props.meta.fs.total - props.meta.fs.used);
 				margin-bottom: 4px;
 
 				> i {
-					margin-right: 4px;
+					margin-inline-end: 4px;
 				}
 			}
 		}
diff --git a/packages/client/src/widgets/server-metric/meilisearch.vue b/packages/client/src/widgets/server-metric/meilisearch.vue
index ea9d1120..44d8c110 100644
--- a/packages/client/src/widgets/server-metric/meilisearch.vue
+++ b/packages/client/src/widgets/server-metric/meilisearch.vue
@@ -62,7 +62,7 @@ onBeforeUnmount(() => {
 	> .pie {
 		height: 82px;
 		flex-shrink: 0;
-		margin-right: 16px;
+		margin-inline-end: 16px;
 	}
 
 	> div {
@@ -77,7 +77,7 @@ onBeforeUnmount(() => {
 				margin-bottom: 4px;
 
 				> i {
-					margin-right: 4px;
+					margin-inline-end: 4px;
 				}
 			}
 		}
diff --git a/packages/client/src/widgets/server-metric/mem.vue b/packages/client/src/widgets/server-metric/mem.vue
index b5ea5fd1..481bf18b 100644
--- a/packages/client/src/widgets/server-metric/mem.vue
+++ b/packages/client/src/widgets/server-metric/mem.vue
@@ -50,7 +50,7 @@ onBeforeUnmount(() => {
 	> .pie {
 		height: 82px;
 		flex-shrink: 0;
-		margin-right: 16px;
+		margin-inline-end: 16px;
 	}
 
 	> div {
@@ -65,7 +65,7 @@ onBeforeUnmount(() => {
 				margin-bottom: 4px;
 
 				> i {
-					margin-right: 4px;
+					margin-inline-end: 4px;
 				}
 			}
 		}
diff --git a/packages/client/src/widgets/server-metric/net.vue b/packages/client/src/widgets/server-metric/net.vue
index 592604c5..633ac5e8 100644
--- a/packages/client/src/widgets/server-metric/net.vue
+++ b/packages/client/src/widgets/server-metric/net.vue
@@ -138,11 +138,11 @@ function onStatsLog(statsLog) {
 		width: 50%;
 
 		&:first-child {
-			padding-right: 5px;
+			padding-inline-end: 5px;
 		}
 
 		&:last-child {
-			padding-left: 5px;
+			padding-inline-start: 5px;
 		}
 
 		> text {
diff --git a/packages/client/src/widgets/slideshow.vue b/packages/client/src/widgets/slideshow.vue
index 6a7ec6c5..e47e75f8 100644
--- a/packages/client/src/widgets/slideshow.vue
+++ b/packages/client/src/widgets/slideshow.vue
@@ -152,7 +152,7 @@ defineExpose<WidgetComponentExpose>({
 		> .slide {
 			position: absolute;
 			top: 0;
-			left: 0;
+			inset-inline-start: 0;
 			width: 100%;
 			height: 100%;
 			background-size: cover;
diff --git a/packages/client/src/widgets/timeline.vue b/packages/client/src/widgets/timeline.vue
index a51ff32c..c429a460 100644
--- a/packages/client/src/widgets/timeline.vue
+++ b/packages/client/src/widgets/timeline.vue
@@ -31,7 +31,7 @@
 					v-else-if="widgetProps.src === 'antenna'"
 					:class="icon('ph-television')"
 				></i>
-				<span style="margin-left: 8px">{{
+				<span style="margin-inline-start: 8px">{{
 					widgetProps.src === "list"
 						? widgetProps.list.name
 						: widgetProps.src === "antenna"
@@ -46,7 +46,7 @@
 								: 'ph-caret-down ph-lg',
 						)
 					"
-					style="margin-left: 8px"
+					style="margin-inline-start: 8px"
 				></i>
 			</button>
 		</template>