wip
This commit is contained in:
		
							parent
							
								
									7664354187
								
							
						
					
					
						commit
						92826c406a
					
				
					 12 changed files with 113 additions and 74 deletions
				
			
		|  | @ -11,7 +11,7 @@ const loadLang = lang => yaml.safeLoad( | |||
| const native = loadLang('ja'); | ||||
| 
 | ||||
| const langs = { | ||||
| 	'en': loadLang('en'), | ||||
| 	//'en': loadLang('en'),
 | ||||
| 	'ja': native | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,40 +0,0 @@ | |||
| <mk-forkit><a href="https://github.com/syuilo/misskey" target="_blank" title="%i18n:common.tags.mk-forkit.open-github-link%" aria-label="%i18n:common.tags.mk-forkit.open-github-link%"> | ||||
| 		<svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden"> | ||||
| 			<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path> | ||||
| 			<path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path> | ||||
| 			<path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor"></path> | ||||
| 		</svg></a> | ||||
| 	<style lang="stylus" scoped> | ||||
| 		:scope | ||||
| 			display block | ||||
| 			position absolute | ||||
| 			top 0 | ||||
| 			right 0 | ||||
| 
 | ||||
| 			> a | ||||
| 				display block | ||||
| 
 | ||||
| 				> svg | ||||
| 					display block | ||||
| 					//fill #151513 | ||||
| 					//color #fff | ||||
| 					fill $theme-color | ||||
| 					color $theme-color-foreground | ||||
| 
 | ||||
| 			.octo-arm | ||||
| 				transform-origin 130px 106px | ||||
| 
 | ||||
| 			&:hover | ||||
| 				.octo-arm | ||||
| 					animation octocat-wave 560ms ease-in-out | ||||
| 
 | ||||
| 			@keyframes octocat-wave | ||||
| 				0%, 100% | ||||
| 					transform rotate(0) | ||||
| 				20%, 60% | ||||
| 					transform rotate(-25deg) | ||||
| 				40%, 80% | ||||
| 					transform rotate(10deg) | ||||
| 
 | ||||
| 	</style> | ||||
| </mk-forkit> | ||||
							
								
								
									
										40
									
								
								src/web/app/common/views/components/forkit.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/web/app/common/views/components/forkit.vue
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,40 @@ | |||
| <template> | ||||
| <a class="a" href="https://github.com/syuilo/misskey" target="_blank" title="%i18n:common.tags.mk-forkit.open-github-link%" aria-label="%i18n:common.tags.mk-forkit.open-github-link%"> | ||||
| 	<svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden"> | ||||
| 		<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path> | ||||
| 		<path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path> | ||||
| 		<path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor"></path> | ||||
| 	</svg> | ||||
| </a> | ||||
| </template> | ||||
| 
 | ||||
| <style lang="stylus" scoped> | ||||
| 	.a | ||||
| 		display block | ||||
| 		position absolute | ||||
| 		top 0 | ||||
| 		right 0 | ||||
| 
 | ||||
| 		> svg | ||||
| 			display block | ||||
| 			//fill #151513 | ||||
| 			//color #fff | ||||
| 			fill $theme-color | ||||
| 			color $theme-color-foreground | ||||
| 
 | ||||
| 			.octo-arm | ||||
| 				transform-origin 130px 106px | ||||
| 
 | ||||
| 		&:hover | ||||
| 			.octo-arm | ||||
| 				animation octocat-wave 560ms ease-in-out | ||||
| 
 | ||||
| 		@keyframes octocat-wave | ||||
| 			0%, 100% | ||||
| 				transform rotate(0) | ||||
| 			20%, 60% | ||||
| 				transform rotate(-25deg) | ||||
| 			40%, 80% | ||||
| 				transform rotate(10deg) | ||||
| 
 | ||||
| </style> | ||||
|  | @ -2,6 +2,8 @@ import Vue from 'vue'; | |||
| 
 | ||||
| import signin from './signin.vue'; | ||||
| import signup from './signup.vue'; | ||||
| import forkit from './forkit.vue'; | ||||
| 
 | ||||
| Vue.component('mk-signin', signin); | ||||
| Vue.component('mk-signup', signup); | ||||
| Vue.component('mk-forkit', forkit); | ||||
|  |  | |||
|  | @ -13,20 +13,22 @@ | |||
| </form> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| <script lang="ts"> | ||||
| import Vue from 'vue'; | ||||
| 
 | ||||
| export default Vue.extend({ | ||||
| 	props: ['os'], | ||||
| 	data() { | ||||
| 		return { | ||||
| 			signing: false, | ||||
| 			user: null | ||||
| 			user: null, | ||||
| 			username: '', | ||||
| 			password: '', | ||||
| 			token: '' | ||||
| 		}; | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		onUsernameChange() { | ||||
| 			this.os.api('users/show', { | ||||
| 			this.$root.$data.os.api('users/show', { | ||||
| 				username: this.username | ||||
| 			}).then(user => { | ||||
| 				this.user = user; | ||||
|  | @ -35,7 +37,7 @@ export default Vue.extend({ | |||
| 		onSubmit() { | ||||
| 			this.signing = true; | ||||
| 
 | ||||
| 			this.os.api('signin', { | ||||
| 			this.$root.$data.os.api('signin', { | ||||
| 				username: this.username, | ||||
| 				password: this.password, | ||||
| 				token: this.user && this.user.two_factor_enabled ? this.token : undefined | ||||
|  |  | |||
|  | @ -2,8 +2,8 @@ | |||
| <form class="mk-signup" @submit.prevent="onSubmit" autocomplete="off"> | ||||
| 	<label class="username"> | ||||
| 		<p class="caption">%fa:at%%i18n:common.tags.mk-signup.username%</p> | ||||
| 		<input v-model="username" type="text" pattern="^[a-zA-Z0-9-]{3,20}$" placeholder="a~z、A~Z、0~9、-" autocomplete="off" required @keyup="onChangeUsername"/> | ||||
| 		<p class="profile-page-url-preview" v-if="username != '' && username-state != 'invalidFormat' && username-state != 'minRange' && username-state != 'maxRange'">{ _URL_ + '/' + refs.username.value }</p> | ||||
| 		<input v-model="username" type="text" pattern="^[a-zA-Z0-9-]{3,20}$" placeholder="a~z、A~Z、0~9、-" autocomplete="off" required @input="onChangeUsername"/> | ||||
| 		<p class="profile-page-url-preview" v-if="shouldShowProfileUrl">{{ `${url}/${username}` }}</p> | ||||
| 		<p class="info" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%%i18n:common.tags.mk-signup.checking%</p> | ||||
| 		<p class="info" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw%%i18n:common.tags.mk-signup.available%</p> | ||||
| 		<p class="info" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:common.tags.mk-signup.unavailable%</p> | ||||
|  | @ -14,8 +14,8 @@ | |||
| 	</label> | ||||
| 	<label class="password"> | ||||
| 		<p class="caption">%fa:lock%%i18n:common.tags.mk-signup.password%</p> | ||||
| 		<input v-model="password" type="password" placeholder="%i18n:common.tags.mk-signup.password-placeholder%" autocomplete="off" required @keyup="onChangePassword"/> | ||||
| 		<div class="meter" v-if="passwordStrength != ''" :data-strength="passwordStrength"> | ||||
| 		<input v-model="password" type="password" placeholder="%i18n:common.tags.mk-signup.password-placeholder%" autocomplete="off" required @input="onChangePassword"/> | ||||
| 		<div class="meter" v-show="passwordStrength != ''" :data-strength="passwordStrength"> | ||||
| 			<div class="value" ref="passwordMetar"></div> | ||||
| 		</div> | ||||
| 		<p class="info" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:common.tags.mk-signup.weak-password%</p> | ||||
|  | @ -24,13 +24,13 @@ | |||
| 	</label> | ||||
| 	<label class="retype-password"> | ||||
| 		<p class="caption">%fa:lock%%i18n:common.tags.mk-signup.password%(%i18n:common.tags.mk-signup.retype%)</p> | ||||
| 		<input v-model="retypedPassword" type="password" placeholder="%i18n:common.tags.mk-signup.retype-placeholder%" autocomplete="off" required @keyup="onChangePasswordRetype"/> | ||||
| 		<input v-model="retypedPassword" type="password" placeholder="%i18n:common.tags.mk-signup.retype-placeholder%" autocomplete="off" required @input="onChangePasswordRetype"/> | ||||
| 		<p class="info" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw%%i18n:common.tags.mk-signup.password-matched%</p> | ||||
| 		<p class="info" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:common.tags.mk-signup.password-not-matched%</p> | ||||
| 	</label> | ||||
| 	<label class="recaptcha"> | ||||
| 		<p class="caption"><template v-if="recaptchaed">%fa:toggle-on%</template><template v-if="!recaptchaed">%fa:toggle-off%</template>%i18n:common.tags.mk-signup.recaptcha%</p> | ||||
| 		<div v-if="recaptcha" class="g-recaptcha" data-callback="onRecaptchaed" data-expired-callback="onRecaptchaExpired" :data-sitekey="recaptchaSitekey"></div> | ||||
| 		<div class="g-recaptcha" data-callback="onRecaptchaed" data-expired-callback="onRecaptchaExpired" :data-sitekey="recaptchaSitekey"></div> | ||||
| 	</label> | ||||
| 	<label class="agree-tou"> | ||||
| 		<input name="agree-tou" type="checkbox" autocomplete="off" required/> | ||||
|  | @ -43,15 +43,15 @@ | |||
| <script lang="ts"> | ||||
| import Vue from 'vue'; | ||||
| const getPasswordStrength = require('syuilo-password-strength'); | ||||
| import { docsUrl, lang, recaptchaSitekey } from '../../../config'; | ||||
| import { url, docsUrl, lang, recaptchaSitekey } from '../../../config'; | ||||
| 
 | ||||
| export default Vue.extend({ | ||||
| 	props: ['os'], | ||||
| 	data() { | ||||
| 		return { | ||||
| 			username: '', | ||||
| 			password: '', | ||||
| 			retypedPassword: '', | ||||
| 			url, | ||||
| 			touUrl: `${docsUrl}/${lang}/tou`, | ||||
| 			recaptchaSitekey, | ||||
| 			recaptchaed: false, | ||||
|  | @ -60,6 +60,14 @@ export default Vue.extend({ | |||
| 			passwordRetypeState: null | ||||
| 		} | ||||
| 	}, | ||||
| 	computed: { | ||||
| 		shouldShowProfileUrl(): boolean { | ||||
| 			return (this.username != '' && | ||||
| 				this.usernameState != 'invalid-format' && | ||||
| 				this.usernameState != 'min-range' && | ||||
| 				this.usernameState != 'max-range'); | ||||
| 		} | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		onChangeUsername() { | ||||
| 			if (this.username == '') { | ||||
|  | @ -80,7 +88,7 @@ export default Vue.extend({ | |||
| 
 | ||||
| 			this.usernameState = 'wait'; | ||||
| 
 | ||||
| 			this.os.api('username/available', { | ||||
| 			this.$root.$data.os.api('username/available', { | ||||
| 				username: this.username | ||||
| 			}).then(result => { | ||||
| 				this.usernameState = result.available ? 'ok' : 'unavailable'; | ||||
|  | @ -107,12 +115,12 @@ export default Vue.extend({ | |||
| 			this.passwordRetypeState = this.password == this.retypedPassword ? 'match' : 'not-match'; | ||||
| 		}, | ||||
| 		onSubmit() { | ||||
| 			this.os.api('signup', { | ||||
| 			this.$root.$data.os.api('signup', { | ||||
| 				username: this.username, | ||||
| 				password: this.password, | ||||
| 				'g-recaptcha-response': (window as any).grecaptcha.getResponse() | ||||
| 			}).then(() => { | ||||
| 				this.os.api('signin', { | ||||
| 				this.$root.$data.os.api('signin', { | ||||
| 					username: this.username, | ||||
| 					password: this.password | ||||
| 				}).then(() => { | ||||
|  |  | |||
|  | @ -1,11 +1,21 @@ | |||
| declare const _HOST_: string; | ||||
| declare const _URL_: string; | ||||
| declare const _API_URL_: string; | ||||
| declare const _DOCS_URL_: string; | ||||
| declare const _LANG_: string; | ||||
| declare const _RECAPTCHA_SITEKEY_: string; | ||||
| declare const _SW_PUBLICKEY_: string; | ||||
| declare const _THEME_COLOR_: string; | ||||
| declare const _COPYRIGHT_: string; | ||||
| declare const _VERSION_: string; | ||||
| 
 | ||||
| export const host = _HOST_; | ||||
| export const url = _URL_; | ||||
| export const apiUrl = _API_URL_; | ||||
| export const docsUrl = _DOCS_URL_; | ||||
| export const lang = _LANG_; | ||||
| export const recaptchaSitekey = _RECAPTCHA_SITEKEY_; | ||||
| export const swPublickey = _SW_PUBLICKEY_; | ||||
| export const themeColor = _THEME_COLOR_; | ||||
| export const copyright = _COPYRIGHT_; | ||||
| export const version = _VERSION_; | ||||
|  |  | |||
|  | @ -15,12 +15,17 @@ import MkIndex from './views/pages/index.vue'; | |||
| /** | ||||
|  * init | ||||
|  */ | ||||
| init(async (os, launch) => { | ||||
| init(async (launch) => { | ||||
| 	/** | ||||
| 	 * Fuck AD Block | ||||
| 	 */ | ||||
| 	fuckAdBlock(); | ||||
| 
 | ||||
| 	// Register components
 | ||||
| 	require('./views/components'); | ||||
| 
 | ||||
| 	const app = launch(); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Init Notification | ||||
| 	 */ | ||||
|  | @ -31,17 +36,12 @@ init(async (os, launch) => { | |||
| 		} | ||||
| 
 | ||||
| 		if ((Notification as any).permission == 'granted') { | ||||
| 			registerNotifications(os.stream); | ||||
| 			registerNotifications(app.$data.os.stream); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Register components
 | ||||
| 	require('./views/components'); | ||||
| 
 | ||||
| 	const app = launch(); | ||||
| 
 | ||||
| 	app.$router.addRoutes([{ | ||||
| 		path: '/', component: MkIndex, props: { os } | ||||
| 		path: '/', component: MkIndex | ||||
| 	}]); | ||||
| }, true); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <template> | ||||
| 	<component v-bind:is="os.isSignedIn ? 'home' : 'welcome'"></component> | ||||
| 	<component v-bind:is="$root.$data.os.isSignedIn ? 'home' : 'welcome'"></component> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
|  | @ -8,7 +8,6 @@ import HomeView from './home.vue'; | |||
| import WelcomeView from './welcome.vue'; | ||||
| 
 | ||||
| export default Vue.extend({ | ||||
| 	props: ['os'], | ||||
| 	components: { | ||||
| 		home: HomeView, | ||||
| 		welcome: WelcomeView | ||||
|  |  | |||
|  | @ -19,7 +19,11 @@ | |||
| 	</footer> | ||||
| 	<modal name="signup" width="500px" height="auto" scrollable> | ||||
| 		<header :class="$style.signupFormHeader">新規登録</header> | ||||
| 		<mk-signup :class="$style.signupForm"></mk-signup> | ||||
| 		<mk-signup :class="$style.signupForm"/> | ||||
| 	</modal> | ||||
| 	<modal name="signin" width="500px" height="auto" scrollable> | ||||
| 		<header :class="$style.signinFormHeader">ログイン</header> | ||||
| 		<mk-signin :class="$style.signinForm"/> | ||||
| 	</modal> | ||||
| </div> | ||||
| </template> | ||||
|  | @ -31,6 +35,9 @@ export default Vue.extend({ | |||
| 	methods: { | ||||
| 		signup() { | ||||
| 			this.$modal.show('signup'); | ||||
| 		}, | ||||
| 		signin() { | ||||
| 			this.$modal.show('signin'); | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
|  | @ -139,4 +146,14 @@ export default Vue.extend({ | |||
| 	font-size 1.5em | ||||
| 	color #777 | ||||
| 	border-bottom solid 1px #eee | ||||
| 
 | ||||
| .signinForm | ||||
| 	padding 24px 48px 48px 48px | ||||
| 
 | ||||
| .signinFormHeader | ||||
| 	padding 48px 0 12px 0 | ||||
| 	margin: 0 48px | ||||
| 	font-size 1.5em | ||||
| 	color #777 | ||||
| 	border-bottom solid 1px #eee | ||||
| </style> | ||||
|  |  | |||
|  | @ -63,7 +63,7 @@ if (localStorage.getItem('should-refresh') == 'true') { | |||
| } | ||||
| 
 | ||||
| // MiOSを初期化してコールバックする
 | ||||
| export default (callback: (os: MiOS, launch: () => Vue) => void, sw = false) => { | ||||
| export default (callback: (launch: () => Vue) => void, sw = false) => { | ||||
| 	const mios = new MiOS(sw); | ||||
| 
 | ||||
| 	mios.init(() => { | ||||
|  | @ -75,6 +75,9 @@ export default (callback: (os: MiOS, launch: () => Vue) => void, sw = false) => | |||
| 
 | ||||
| 		const launch = () => { | ||||
| 			return new Vue({ | ||||
| 				data: { | ||||
| 					os: mios | ||||
| 				}, | ||||
| 				router: new VueRouter({ | ||||
| 					mode: 'history' | ||||
| 				}), | ||||
|  | @ -83,7 +86,7 @@ export default (callback: (os: MiOS, launch: () => Vue) => void, sw = false) => | |||
| 		}; | ||||
| 
 | ||||
| 		try { | ||||
| 			callback(mios, launch); | ||||
| 			callback(launch); | ||||
| 		} catch (e) { | ||||
| 			panic(e); | ||||
| 		} | ||||
|  |  | |||
|  | @ -7,16 +7,14 @@ import './style.styl'; | |||
| 
 | ||||
| require('./tags'); | ||||
| import init from '../init'; | ||||
| import route from './router'; | ||||
| import MiOS from '../common/mios'; | ||||
| 
 | ||||
| /** | ||||
|  * init | ||||
|  */ | ||||
| init((mios: MiOS) => { | ||||
| init((launch) => { | ||||
| 	// http://qiita.com/junya/items/3ff380878f26ca447f85
 | ||||
| 	document.body.setAttribute('ontouchstart', ''); | ||||
| 
 | ||||
| 	// Start routing
 | ||||
| 	route(mios); | ||||
| 	//route(mios);
 | ||||
| }, true); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue