From 36c2d0082f7c54d9fb99069aa60b8a8d67630ad3 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 24 May 2019 19:19:43 +0900
Subject: [PATCH] =?UTF-8?q?MisskeyPages=E3=82=92=E3=83=9B=E3=83=BC?=
 =?UTF-8?q?=E3=83=A0UI=E3=81=AB=E7=B5=B1=E5=90=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/client/app/common/views/components/mfm.ts |  6 +-
 .../common/views/components/url-preview.vue   | 11 +--
 .../app/common/views/components/url.vue       | 12 ++--
 .../page-editor/els/page-editor.el.button.vue |  0
 .../els/page-editor.el.counter.vue            |  0
 .../page-editor/els/page-editor.el.if.vue     |  0
 .../page-editor/els/page-editor.el.image.vue  |  2 +-
 .../els/page-editor.el.number-input.vue       |  0
 .../page-editor/els/page-editor.el.post.vue   |  0
 .../els/page-editor.el.section.vue            |  0
 .../page-editor/els/page-editor.el.switch.vue |  0
 .../els/page-editor.el.text-input.vue         |  0
 .../page-editor/els/page-editor.el.text.vue   |  0
 .../els/page-editor.el.textarea-input.vue     |  0
 .../els/page-editor.el.textarea.vue           |  0
 .../page-editor/page-editor.blocks.vue        |  0
 .../page-editor/page-editor.container.vue     |  0
 .../page-editor/page-editor.script-block.vue  |  0
 .../page-editor/page-editor.vue               | 33 ++++++---
 .../app/common/views/pages/page/page.vue      | 10 +--
 src/client/app/desktop/script.ts              |  8 +--
 .../app/desktop/views/pages/page-editor.vue   | 67 -------------------
 src/client/app/desktop/views/pages/page.vue   | 36 ----------
 src/client/app/mobile/script.ts               |  8 +--
 .../app/mobile/views/pages/page-editor.vue    | 67 -------------------
 src/client/app/mobile/views/pages/page.vue    | 39 -----------
 26 files changed, 58 insertions(+), 241 deletions(-)
 rename src/client/app/common/views/{components => pages}/page-editor/els/page-editor.el.button.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/els/page-editor.el.counter.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/els/page-editor.el.if.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/els/page-editor.el.image.vue (95%)
 rename src/client/app/common/views/{components => pages}/page-editor/els/page-editor.el.number-input.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/els/page-editor.el.post.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/els/page-editor.el.section.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/els/page-editor.el.switch.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/els/page-editor.el.text-input.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/els/page-editor.el.text.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/els/page-editor.el.textarea-input.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/els/page-editor.el.textarea.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/page-editor.blocks.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/page-editor.container.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/page-editor.script-block.vue (100%)
 rename src/client/app/common/views/{components => pages}/page-editor/page-editor.vue (94%)
 delete mode 100644 src/client/app/desktop/views/pages/page-editor.vue
 delete mode 100644 src/client/app/desktop/views/pages/page.vue
 delete mode 100644 src/client/app/mobile/views/pages/page-editor.vue
 delete mode 100644 src/client/app/mobile/views/pages/page.vue

diff --git a/src/client/app/common/views/components/mfm.ts b/src/client/app/common/views/components/mfm.ts
index 9459172881..7de29b2aad 100644
--- a/src/client/app/common/views/components/mfm.ts
+++ b/src/client/app/common/views/components/mfm.ts
@@ -8,7 +8,7 @@ import { concat, sum } from '../../../../../prelude/array';
 import MkFormula from './formula.vue';
 import MkCode from './code.vue';
 import MkGoogle from './google.vue';
-import { host } from '../../../config';
+import { host, url } from '../../../config';
 import { preorderF, countNodesF } from '../../../../../prelude/tree';
 
 function sumTextsLength(ts: MfmForest): number {
@@ -175,7 +175,9 @@ export default Vue.component('misskey-flavored-markdown', {
 						props: {
 							url: token.node.props.url,
 							rel: 'nofollow noopener',
-							target: '_blank'
+							...(token.node.props.url.startsWith(url) ? {} : {
+								target: '_blank'
+							})
 						},
 						attrs: {
 							style: 'color:var(--mfmUrl);'
diff --git a/src/client/app/common/views/components/url-preview.vue b/src/client/app/common/views/components/url-preview.vue
index 9ca4497ad8..6e0d73eef5 100644
--- a/src/client/app/common/views/components/url-preview.vue
+++ b/src/client/app/common/views/components/url-preview.vue
@@ -9,7 +9,7 @@
 	</blockquote>
 </div>
 <div v-else class="mk-url-preview">
-	<a :class="{ mini: narrow, compact }" :href="url" rel="nofollow noopener" target="_blank" :title="url" v-if="!fetching">
+	<component :is="self ? 'router-link' : 'a'" :class="{ mini: narrow, compact }" :[attr]="self ? url.substr(local.length) : url" rel="nofollow noopener" :target="self ? null : '_blank'" :title="url" v-if="!fetching">
 		<div class="thumbnail" v-if="thumbnail" :style="`background-image: url('${thumbnail}')`">
 			<button v-if="!playerEnabled && player.url" @click.prevent="playerEnabled = true" :title="$t('enable-player')"><fa :icon="['far', 'play-circle']"/></button>
 		</div>
@@ -23,17 +23,18 @@
 				<p :title="sitename">{{ sitename }}</p>
 			</footer>
 		</article>
-	</a>
+	</component>
 </div>
 </template>
 
 <script lang="ts">
 import Vue from 'vue';
 import i18n from '../../../i18n';
-import { url as misskeyUrl } from '../../../config';
+import { url as local } from '../../../config';
 
 export default Vue.extend({
 	i18n: i18n('common/views/components/url-preview.vue'),
+
 	props: {
 		url: {
 			type: String,
@@ -74,7 +75,9 @@ export default Vue.extend({
 			},
 			tweetUrl: null,
 			playerEnabled: false,
-			misskeyUrl,
+			local,
+			self: this.url.startsWith(local),
+			attr: this.url.startsWith(local) ? 'to' : 'href'
 		};
 	},
 
diff --git a/src/client/app/common/views/components/url.vue b/src/client/app/common/views/components/url.vue
index faf439814d..840535514d 100644
--- a/src/client/app/common/views/components/url.vue
+++ b/src/client/app/common/views/components/url.vue
@@ -1,29 +1,33 @@
 <template>
-<a class="mk-url" :href="url" :rel="rel" :target="target">
+<component :is="self ? 'router-link' : 'a'" class="mk-url" :[attr]="self ? url.substr(local.length) : url" :rel="rel" :target="target">
 	<span class="schema">{{ schema }}//</span>
 	<span class="hostname">{{ hostname }}</span>
 	<span class="port" v-if="port != ''">:{{ port }}</span>
 	<span class="pathname" v-if="pathname != ''">{{ pathname }}</span>
 	<span class="query">{{ query }}</span>
 	<span class="hash">{{ hash }}</span>
-	<fa icon="external-link-square-alt"/>
-</a>
+	<fa icon="external-link-square-alt" v-if="!self"/>
+</component>
 </template>
 
 <script lang="ts">
 import Vue from 'vue';
 import { toUnicode as decodePunycode } from 'punycode';
+import { url as local } from '../../../config';
 
 export default Vue.extend({
 	props: ['url', 'rel', 'target'],
 	data() {
 		return {
+			local,
 			schema: null,
 			hostname: null,
 			port: null,
 			pathname: null,
 			query: null,
-			hash: null
+			hash: null,
+			self: this.url.startsWith(local),
+			attr: this.url.startsWith(local) ? 'to' : 'href'
 		};
 	},
 	created() {
diff --git a/src/client/app/common/views/components/page-editor/els/page-editor.el.button.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.button.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/els/page-editor.el.button.vue
rename to src/client/app/common/views/pages/page-editor/els/page-editor.el.button.vue
diff --git a/src/client/app/common/views/components/page-editor/els/page-editor.el.counter.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.counter.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/els/page-editor.el.counter.vue
rename to src/client/app/common/views/pages/page-editor/els/page-editor.el.counter.vue
diff --git a/src/client/app/common/views/components/page-editor/els/page-editor.el.if.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.if.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/els/page-editor.el.if.vue
rename to src/client/app/common/views/pages/page-editor/els/page-editor.el.if.vue
diff --git a/src/client/app/common/views/components/page-editor/els/page-editor.el.image.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.image.vue
similarity index 95%
rename from src/client/app/common/views/components/page-editor/els/page-editor.el.image.vue
rename to src/client/app/common/views/pages/page-editor/els/page-editor.el.image.vue
index 98ec39a512..e2e72b04c2 100644
--- a/src/client/app/common/views/components/page-editor/els/page-editor.el.image.vue
+++ b/src/client/app/common/views/pages/page-editor/els/page-editor.el.image.vue
@@ -19,7 +19,7 @@ import { faPencilAlt } from '@fortawesome/free-solid-svg-icons';
 import { faImage, faFolderOpen } from '@fortawesome/free-regular-svg-icons';
 import i18n from '../../../../../i18n';
 import XContainer from '../page-editor.container.vue';
-import XFileThumbnail from '../../drive-file-thumbnail.vue';
+import XFileThumbnail from '../../../components/drive-file-thumbnail.vue';
 
 export default Vue.extend({
 	i18n: i18n('pages'),
diff --git a/src/client/app/common/views/components/page-editor/els/page-editor.el.number-input.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.number-input.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/els/page-editor.el.number-input.vue
rename to src/client/app/common/views/pages/page-editor/els/page-editor.el.number-input.vue
diff --git a/src/client/app/common/views/components/page-editor/els/page-editor.el.post.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.post.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/els/page-editor.el.post.vue
rename to src/client/app/common/views/pages/page-editor/els/page-editor.el.post.vue
diff --git a/src/client/app/common/views/components/page-editor/els/page-editor.el.section.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.section.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/els/page-editor.el.section.vue
rename to src/client/app/common/views/pages/page-editor/els/page-editor.el.section.vue
diff --git a/src/client/app/common/views/components/page-editor/els/page-editor.el.switch.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.switch.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/els/page-editor.el.switch.vue
rename to src/client/app/common/views/pages/page-editor/els/page-editor.el.switch.vue
diff --git a/src/client/app/common/views/components/page-editor/els/page-editor.el.text-input.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.text-input.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/els/page-editor.el.text-input.vue
rename to src/client/app/common/views/pages/page-editor/els/page-editor.el.text-input.vue
diff --git a/src/client/app/common/views/components/page-editor/els/page-editor.el.text.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.text.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/els/page-editor.el.text.vue
rename to src/client/app/common/views/pages/page-editor/els/page-editor.el.text.vue
diff --git a/src/client/app/common/views/components/page-editor/els/page-editor.el.textarea-input.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.textarea-input.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/els/page-editor.el.textarea-input.vue
rename to src/client/app/common/views/pages/page-editor/els/page-editor.el.textarea-input.vue
diff --git a/src/client/app/common/views/components/page-editor/els/page-editor.el.textarea.vue b/src/client/app/common/views/pages/page-editor/els/page-editor.el.textarea.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/els/page-editor.el.textarea.vue
rename to src/client/app/common/views/pages/page-editor/els/page-editor.el.textarea.vue
diff --git a/src/client/app/common/views/components/page-editor/page-editor.blocks.vue b/src/client/app/common/views/pages/page-editor/page-editor.blocks.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/page-editor.blocks.vue
rename to src/client/app/common/views/pages/page-editor/page-editor.blocks.vue
diff --git a/src/client/app/common/views/components/page-editor/page-editor.container.vue b/src/client/app/common/views/pages/page-editor/page-editor.container.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/page-editor.container.vue
rename to src/client/app/common/views/pages/page-editor/page-editor.container.vue
diff --git a/src/client/app/common/views/components/page-editor/page-editor.script-block.vue b/src/client/app/common/views/pages/page-editor/page-editor.script-block.vue
similarity index 100%
rename from src/client/app/common/views/components/page-editor/page-editor.script-block.vue
rename to src/client/app/common/views/pages/page-editor/page-editor.script-block.vue
diff --git a/src/client/app/common/views/components/page-editor/page-editor.vue b/src/client/app/common/views/pages/page-editor/page-editor.vue
similarity index 94%
rename from src/client/app/common/views/components/page-editor/page-editor.vue
rename to src/client/app/common/views/pages/page-editor/page-editor.vue
index 6f4cf9b6b5..ebe0f4688d 100644
--- a/src/client/app/common/views/components/page-editor/page-editor.vue
+++ b/src/client/app/common/views/pages/page-editor/page-editor.vue
@@ -11,7 +11,7 @@
 		</header>
 
 		<section>
-			<a class="view" v-if="pageId" :href="`/@${ author.username }/pages/${ currentName }`"><fa :icon="faExternalLinkSquareAlt"/> {{ $t('view-page') }}</a>
+			<router-link class="view" v-if="pageId" :to="`/@${ author.username }/pages/${ currentName }`"><fa :icon="faExternalLinkSquareAlt"/> {{ $t('view-page') }}</router-link>
 
 			<ui-input v-model="title">
 				<span>{{ $t('title') }}</span>
@@ -111,20 +111,25 @@ export default Vue.extend({
 	},
 
 	props: {
-		page: {
-			type: Object,
+		initPageId: {
+			type: String,
 			required: false
 		},
-		readonly: {
-			type: Boolean,
-			required: false,
-			default: false
+		initPageName: {
+			type: String,
+			required: false
+		},
+		initUser: {
+			type: String,
+			required: false
 		},
 	},
 
 	data() {
 		return {
 			author: this.$store.state.i,
+			readonly: false,
+			page: null,
 			pageId: null,
 			currentName: null,
 			title: '',
@@ -156,7 +161,7 @@ export default Vue.extend({
 		},
 	},
 
-	created() {
+	async created() {
 		this.aiScript = new ASTypeChecker();
 
 		this.$watch('variables', () => {
@@ -167,6 +172,18 @@ export default Vue.extend({
 			this.aiScript.pageVars = collectPageVars(this.content);
 		}, { deep: true });
 
+		if (this.initPageId) {
+			this.page = await this.$root.api('pages/show', {
+				pageId: this.initPageId,
+			});
+		} else if (this.initPageName && this.initUser) {
+			this.page = await this.$root.api('pages/show', {
+				name: this.initPageName,
+				username: this.initUser,
+			});
+			this.readonly = true;
+		}
+
 		if (this.page) {
 			this.author = this.page.user;
 			this.pageId = this.page.id;
diff --git a/src/client/app/common/views/pages/page/page.vue b/src/client/app/common/views/pages/page/page.vue
index d3fb948c85..649bc1e17d 100644
--- a/src/client/app/common/views/pages/page/page.vue
+++ b/src/client/app/common/views/pages/page/page.vue
@@ -148,8 +148,8 @@ export default Vue.extend({
 		> .title
 			z-index 1
 			margin 0
-			padding 32px 64px
-			font-size 24px
+			padding 16px 32px
+			font-size 20px
 			font-weight bold
 			color var(--text)
 			box-shadow 0 var(--lineWidth) rgba(#000, 0.07)
@@ -160,8 +160,8 @@ export default Vue.extend({
 
 	> div
 		color var(--text)
-		padding 48px 64px
-		font-size 18px
+		padding 24px 32px
+		font-size 16px
 
 		@media (max-width 600px)
 			padding 24px 32px
@@ -169,7 +169,7 @@ export default Vue.extend({
 
 	> footer
 		color var(--text)
-		padding 0 64px 38px 64px
+		padding 0 32px 28px 32px
 
 		@media (max-width 600px)
 			padding 0 32px 28px 32px
diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts
index b283ab2075..1ec7f1cfbf 100644
--- a/src/client/app/desktop/script.ts
+++ b/src/client/app/desktop/script.ts
@@ -168,11 +168,11 @@ init(async (launch, os) => {
 					{ path: '/i/groups', component: () => import('../common/views/pages/user-groups.vue').then(m => m.default) },
 					{ path: '/i/groups/:groupId', props: true, component: () => import('../common/views/pages/user-group-editor.vue').then(m => m.default) },
 					{ path: '/i/follow-requests', component: () => import('../common/views/pages/follow-requests.vue').then(m => m.default) },
+					{ path: '/i/pages/new', component: () => import('../common/views/pages/page-editor/page-editor.vue').then(m => m.default) },
+					{ path: '/i/pages/edit/:pageId', component: () => import('../common/views/pages/page-editor/page-editor.vue').then(m => m.default), props: route => ({ initPageId: route.params.pageId }) },
+					{ path: '/@:user/pages/:page', component: () => import('../common/views/pages/page/page.vue').then(m => m.default), props: route => ({ pageName: route.params.page, username: route.params.user }) },
+					{ path: '/@:user/pages/:pageName/view-source', component: () => import('../common/views/pages/page-editor/page-editor.vue').then(m => m.default), props: route => ({ initUser: route.params.user, initPageName: route.params.pageName }) },
 				]},
-			{ path: '/@:user/pages/:page', props: true, component: () => import('./views/pages/page.vue').then(m => m.default) },
-			{ path: '/@:user/pages/:pageName/view-source', props: true, component: () => import('./views/pages/page-editor.vue').then(m => m.default) },
-			{ path: '/i/pages/new', component: () => import('./views/pages/page-editor.vue').then(m => m.default) },
-			{ path: '/i/pages/edit/:pageId', props: true, component: () => import('./views/pages/page-editor.vue').then(m => m.default) },
 			{ path: '/i/messaging/group/:group', component: MkMessagingRoom },
 			{ path: '/i/messaging/:user', component: MkMessagingRoom },
 			{ path: '/i/drive', component: MkDrive },
diff --git a/src/client/app/desktop/views/pages/page-editor.vue b/src/client/app/desktop/views/pages/page-editor.vue
deleted file mode 100644
index 35b4008e4f..0000000000
--- a/src/client/app/desktop/views/pages/page-editor.vue
+++ /dev/null
@@ -1,67 +0,0 @@
-<template>
-<mk-ui>
-	<main>
-		<x-page-editor v-if="page !== undefined" :page="page" :readonly="readonly"/>
-	</main>
-</mk-ui>
-</template>
-
-<script lang="ts">
-import Vue from 'vue';
-
-export default Vue.extend({
-	components: {
-		XPageEditor: () => import('../../../common/views/components/page-editor/page-editor.vue').then(m => m.default)
-	},
-
-	props: {
-		pageId: {
-			type: String,
-			required: false
-		},
-		pageName: {
-			type: String,
-			required: false
-		},
-		user: {
-			type: String,
-			required: false
-		}
-	},
-
-	data() {
-		return {
-			page: undefined,
-			readonly: false
-		};
-	},
-
-	created() {
-		if (this.pageId) {
-			this.$root.api('pages/show', {
-				pageId: this.pageId,
-			}).then(page => {
-				this.page = page;
-			});
-		} else if (this.pageName && this.user) {
-			this.$root.api('pages/show', {
-				name: this.pageName,
-				username: this.user,
-			}).then(page => {
-				this.readonly = true;
-				this.page = page;
-			});
-		} else {
-			this.page = null;
-		}
-	}
-});
-</script>
-
-<style lang="stylus" scoped>
-main
-	margin 0 auto
-	padding 16px
-	max-width 900px
-
-</style>
diff --git a/src/client/app/desktop/views/pages/page.vue b/src/client/app/desktop/views/pages/page.vue
deleted file mode 100644
index 1ddff08c76..0000000000
--- a/src/client/app/desktop/views/pages/page.vue
+++ /dev/null
@@ -1,36 +0,0 @@
-<template>
-<mk-ui>
-	<main>
-		<x-page :page-name="page" :username="user"/>
-	</main>
-</mk-ui>
-</template>
-
-<script lang="ts">
-import Vue from 'vue';
-
-export default Vue.extend({
-	components: {
-		XPage: () => import('../../../common/views/pages/page/page.vue').then(m => m.default)
-	},
-
-	props: {
-		page: {
-			type: String,
-			required: true
-		},
-		user: {
-			type: String,
-			required: true
-		},
-	}
-});
-</script>
-
-<style lang="stylus" scoped>
-main
-	margin 0 auto
-	padding 16px
-	max-width 950px
-
-</style>
diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts
index 106e843ca8..d04662cc1f 100644
--- a/src/client/app/mobile/script.ts
+++ b/src/client/app/mobile/script.ts
@@ -149,8 +149,8 @@ init((launch, os) => {
 			{ path: '/i/drive', name: 'drive', component: MkDrive },
 			{ path: '/i/drive/folder/:folder', component: MkDrive },
 			{ path: '/i/drive/file/:file', component: MkDrive },
-			{ path: '/i/pages/new', component: () => import('./views/pages/page-editor.vue').then(m => m.default) },
-			{ path: '/i/pages/edit/:pageId', props: true, component: () => import('./views/pages/page-editor.vue').then(m => m.default) },
+			{ path: '/i/pages/new', component: UI, props: route => ({ component: () => import('../common/views/pages/page-editor/page-editor.vue').then(m => m.default) }) },
+			{ path: '/i/pages/edit/:pageId', component: UI, props: route => ({ component: () => import('../common/views/pages/page-editor/page-editor.vue').then(m => m.default), initPageId: route.params.pageId }) },
 			{ path: '/selectdrive', component: MkSelectDrive },
 			{ path: '/search', component: MkSearch },
 			{ path: '/tags/:tag', component: MkTag },
@@ -163,8 +163,8 @@ init((launch, os) => {
 				{ path: 'following', component: () => import('../common/views/pages/following.vue').then(m => m.default) },
 				{ path: 'followers', component: () => import('../common/views/pages/followers.vue').then(m => m.default) },
 			]},
-			{ path: '/@:user/pages/:page', props: true, component: () => import('./views/pages/page.vue').then(m => m.default) },
-			{ path: '/@:user/pages/:pageName/view-source', props: true, component: () => import('./views/pages/page-editor.vue').then(m => m.default) },
+			{ path: '/@:user/pages/:page', component: UI, props: route => ({ component: () => import('../common/views/pages/page/page.vue').then(m => m.default), pageName: route.params.page, username: route.params.user }) },
+			{ path: '/@:user/pages/:pageName/view-source', component: UI, props: route => ({ component: () => import('../common/views/pages/page-editor/page-editor.vue').then(m => m.default), initUser: route.params.user, initPageName: route.params.pageName }) },
 			{ path: '/notes/:note', component: MkNote },
 			{ path: '/authorize-follow', component: MkFollow },
 			{ path: '*', component: MkNotFound }
diff --git a/src/client/app/mobile/views/pages/page-editor.vue b/src/client/app/mobile/views/pages/page-editor.vue
deleted file mode 100644
index 0b04f25802..0000000000
--- a/src/client/app/mobile/views/pages/page-editor.vue
+++ /dev/null
@@ -1,67 +0,0 @@
-<template>
-<mk-ui>
-	<main>
-		<x-page-editor v-if="page !== undefined" :page="page" :readonly="readonly"/>
-	</main>
-</mk-ui>
-</template>
-
-<script lang="ts">
-import Vue from 'vue';
-
-export default Vue.extend({
-	components: {
-		XPageEditor: () => import('../../../common/views/components/page-editor/page-editor.vue').then(m => m.default)
-	},
-
-	props: {
-		pageId: {
-			type: String,
-			required: false
-		},
-		pageName: {
-			type: String,
-			required: false
-		},
-		user: {
-			type: String,
-			required: false
-		}
-	},
-
-	data() {
-		return {
-			page: undefined,
-			readonly: false
-		};
-	},
-
-	created() {
-		if (this.pageId) {
-			this.$root.api('pages/show', {
-				pageId: this.pageId,
-			}).then(page => {
-				this.page = page;
-			});
-		} else if (this.pageName && this.user) {
-			this.$root.api('pages/show', {
-				name: this.pageName,
-				username: this.user,
-			}).then(page => {
-				this.readonly = true;
-				this.page = page;
-			});
-		} else {
-			this.page = null;
-		}
-	}
-});
-</script>
-
-<style lang="stylus" scoped>
-main
-	margin 0 auto
-	padding 16px
-	max-width 1000px
-
-</style>
diff --git a/src/client/app/mobile/views/pages/page.vue b/src/client/app/mobile/views/pages/page.vue
deleted file mode 100644
index f494abffd7..0000000000
--- a/src/client/app/mobile/views/pages/page.vue
+++ /dev/null
@@ -1,39 +0,0 @@
-<template>
-<mk-ui>
-	<main>
-		<x-page :page-name="page" :username="user"/>
-	</main>
-</mk-ui>
-</template>
-
-<script lang="ts">
-import Vue from 'vue';
-
-export default Vue.extend({
-	components: {
-		XPage: () => import('../../../common/views/pages/page/page.vue').then(m => m.default)
-	},
-
-	props: {
-		page: {
-			type: String,
-			required: true
-		},
-		user: {
-			type: String,
-			required: true
-		},
-	}
-});
-</script>
-
-<style lang="stylus" scoped>
-main
-	margin 0 auto
-	padding 16px
-	max-width 1000px
-
-	@media (min-width 600px)
-		padding 32px
-
-</style>