Skip to content
Snippets Groups Projects
user.header.vue 4.63 KiB
Newer Older
syuilo's avatar
wip
syuilo committed
<template>
syuilo's avatar
syuilo committed
<div class="header" :data-is-dark-background="user.bannerUrl != null">
syuilo's avatar
syuilo committed
	<div class="is-suspended" v-if="user.isSuspended"><p>%fa:exclamation-triangle% %i18n:@is-suspended%</p></div>
syuilo's avatar
syuilo committed
	<div class="is-remote" v-if="user.host != null"><p>%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></p></div>
syuilo's avatar
syuilo committed
	<div class="banner-container" :style="style">
		<div class="banner" ref="banner" :style="style" @click="onBannerClick"></div>
syuilo's avatar
syuilo committed
		<div class="fade"></div>
syuilo's avatar
wip
syuilo committed
	</div>
	<div class="container">
syuilo's avatar
syuilo committed
		<mk-avatar class="avatar" :user="user" :disable-preview="true"/>
syuilo's avatar
wip
syuilo committed
		<div class="title">
syuilo's avatar
syuilo committed
			<p class="name">{{ user | userName }}</p>
			<p class="username">@{{ user | acct }}</p>
syuilo's avatar
syuilo committed
			<p class="location" v-if="user.host === null && user.profile.location">%fa:map-marker%{{ user.profile.location }}</p>
syuilo's avatar
wip
syuilo committed
		</div>
		<footer>
syuilo's avatar
syuilo committed
			<router-link :to="user | userPage" :data-active="$parent.page == 'home'">%fa:home%ホーム</router-link>
syuilo's avatar
wip
syuilo committed
		</footer>
	</div>
</div>
</template>

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
	props: ['user'],
syuilo's avatar
syuilo committed
	computed: {
		style(): any {
			if (this.user.bannerUrl == null) return {};
			return {
				backgroundColor: this.user.bannerColor ? `rgb(${ this.user.bannerColor.join(',') })` : null,
				backgroundImage: `url(${ this.user.bannerUrl })`
			};
		}
	},
syuilo's avatar
wip
syuilo committed
	mounted() {
syuilo's avatar
syuilo committed
		if (this.user.bannerUrl) {
			window.addEventListener('load', this.onScroll);
			window.addEventListener('scroll', this.onScroll);
			window.addEventListener('resize', this.onScroll);
		}
syuilo's avatar
wip
syuilo committed
	},
	beforeDestroy() {
syuilo's avatar
syuilo committed
		if (this.user.bannerUrl) {
			window.removeEventListener('load', this.onScroll);
			window.removeEventListener('scroll', this.onScroll);
			window.removeEventListener('resize', this.onScroll);
		}
syuilo's avatar
wip
syuilo committed
	},
	methods: {
		onScroll() {
			const banner = this.$refs.banner as any;

			const top = window.scrollY;

			const z = 1.25; // 奥行き(小さいほど奥)
			const pos = -(top / z);
			banner.style.backgroundPosition = `center calc(50% - ${pos}px)`;

			const blur = top / 32
			if (blur <= 10) banner.style.filter = `blur(${blur}px)`;
		},

		onBannerClick() {
syuilo's avatar
syuilo committed
			if (!(this as any).os.isSignedIn || (this as any).os.i.id != this.user.id) return;
syuilo's avatar
wip
syuilo committed

			(this as any).apis.updateBanner().then(i => {
syuilo's avatar
syuilo committed
				this.user.bannerUrl = i.bannerUrl;
syuilo's avatar
wip
syuilo committed
			});
		}
	}
});
</script>

<style lang="stylus" scoped>
syuilo's avatar
syuilo committed
@import '~const.styl'

syuilo's avatar
syuilo committed
.header
syuilo's avatar
wip
syuilo committed
	$footer-height = 58px

	overflow hidden
syuilo's avatar
syuilo committed
	background #f7f7f7
syuilo's avatar
syuilo committed
	box-shadow 0 1px 1px rgba(#000, 0.075)
syuilo's avatar
wip
syuilo committed

syuilo's avatar
syuilo committed
	> .is-suspended
syuilo's avatar
syuilo committed
	> .is-remote
syuilo's avatar
syuilo committed
		&.is-suspended
			color #570808
			background #ffdbdb

		&.is-remote
			color #573c08
			background #fff0db
syuilo's avatar
syuilo committed

		> p
			margin 0 auto
syuilo's avatar
syuilo committed
			padding 14px 16px
			max-width 1200px
			font-size 14px
syuilo's avatar
syuilo committed

			> a
				font-weight bold

syuilo's avatar
wip
syuilo committed
	&[data-is-dark-background]
		> .banner-container
			> .banner
				background-color #383838

syuilo's avatar
syuilo committed
			> .fade
syuilo's avatar
syuilo committed
				background linear-gradient(transparent, rgba(#000, 0.7))
syuilo's avatar
wip
syuilo committed

		> .container
			> .title
				color #fff

				> .name
					text-shadow 0 0 8px #000

	> .banner-container
syuilo's avatar
syuilo committed
		height 320px
syuilo's avatar
wip
syuilo committed
		overflow hidden
		background-size cover
		background-position center

		> .banner
			height 100%
syuilo's avatar
syuilo committed
			background-color #bfccd0
syuilo's avatar
wip
syuilo committed
			background-size cover
			background-position center

syuilo's avatar
syuilo committed
		> .fade
			position absolute
			bottom 0
			left 0
			width 100%
			height 78px
syuilo's avatar
wip
syuilo committed

	> .container
		max-width 1200px
		margin 0 auto

		> .avatar
			display block
			position absolute
			bottom 16px
			left 16px
			z-index 2
			width 160px
			height 160px
			border solid 3px #fff
			border-radius 8px
syuilo's avatar
syuilo committed
			box-shadow 1px 1px 3px rgba(#000, 0.2)
syuilo's avatar
wip
syuilo committed

		> .title
			position absolute
			bottom $footer-height
			left 0
			width 100%
			padding 0 0 8px 195px
syuilo's avatar
syuilo committed
			color #5e6367
syuilo's avatar
wip
syuilo committed
			font-family '游ゴシック', 'YuGothic', 'ヒラギノ角ゴ ProN W3', 'Hiragino Kaku Gothic ProN', 'Meiryo', 'メイリオ', sans-serif

			> .name
				display block
				margin 0
				line-height 40px
				font-weight bold
				font-size 2em

			> .username
			> .location
				display inline-block
				margin 0 16px 0 0
				line-height 20px
				opacity 0.8

				> i
					margin-right 4px

		> footer
			z-index 1
			height $footer-height
			padding-left 195px

			> a
				display inline-block
				margin 0
				padding 0 16px
				height $footer-height
				line-height $footer-height
				color #555

				&[data-active]
					border-bottom solid 4px $theme-color

				> i
					margin-right 6px

			> button
				display block
				position absolute
				top 0
				right 0
				margin 8px
				padding 0
				width $footer-height - 16px
				line-height $footer-height - 16px - 2px
				font-size 1.2em
				color #777
				border solid 1px #eee
				border-radius 4px

				&:hover
					color #555
					border solid 1px #ddd

</style>