mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-04 08:42:24 -06:00 
			
		
		
		
	
		
			
				
	
	
		
			371 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			CSS
		
	
	
	
	
	
			
		
		
	
	
			371 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			CSS
		
	
	
	
	
	
/*
 | 
						|
	GoToSocial
 | 
						|
	Copyright (C) GoToSocial Authors admin@gotosocial.org
 | 
						|
	SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
 | 
						|
	This program is free software: you can redistribute it and/or modify
 | 
						|
	it under the terms of the GNU Affero General Public License as published by
 | 
						|
	the Free Software Foundation, either version 3 of the License, or
 | 
						|
	(at your option) any later version.
 | 
						|
 | 
						|
	This program is distributed in the hope that it will be useful,
 | 
						|
	but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
	GNU Affero General Public License for more details.
 | 
						|
 | 
						|
	You should have received a copy of the GNU Affero General Public License
 | 
						|
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
*/
 | 
						|
 | 
						|
.profile .profile-header {
 | 
						|
	background: $profile-bg;
 | 
						|
	border-radius: $br;
 | 
						|
	margin-bottom: 1rem;
 | 
						|
	padding-bottom: 1rem;
 | 
						|
 | 
						|
	/*
 | 
						|
		Link to open media in slide
 | 
						|
		should fill entire media wrapper.
 | 
						|
	*/
 | 
						|
	a.photoswipe-slide {
 | 
						|
		display: inline-block;
 | 
						|
		height: 100%;
 | 
						|
		width: 100%;
 | 
						|
		
 | 
						|
		&:focus-visible {
 | 
						|
			outline: $button-focus-outline;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	.moved-to {
 | 
						|
		padding: 1rem;
 | 
						|
		text-align: center;
 | 
						|
	}
 | 
						|
 | 
						|
	.header-image-wrapper {
 | 
						|
		position: relative;
 | 
						|
		aspect-ratio: 3;
 | 
						|
		height: 100%;
 | 
						|
		width: 100%;
 | 
						|
		
 | 
						|
		img {
 | 
						|
			position: absolute;
 | 
						|
			top: 0;
 | 
						|
			left: 0;
 | 
						|
			right: 0;
 | 
						|
			width: 100%;
 | 
						|
			height: 100%;
 | 
						|
			object-fit: cover;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/* 
 | 
						|
		Basic info container has the user's avatar, display- and username, and role
 | 
						|
		It's partially overlapped over the header image, by a negative margin-top.
 | 
						|
	*/
 | 
						|
	$avatar-size: 8.5rem;
 | 
						|
	$name-size: 3rem;
 | 
						|
	$username-size: 2rem;
 | 
						|
	$overlap: calc($avatar-size - $name-size - $username-size);
 | 
						|
 | 
						|
	.basic-info {
 | 
						|
		position: relative;
 | 
						|
		display: grid;
 | 
						|
		gap: 0 1rem;
 | 
						|
		box-sizing: border-box;
 | 
						|
		grid-template-columns: $avatar-size auto 1fr;
 | 
						|
		grid-template-rows: $overlap $name-size auto;
 | 
						|
		grid-template-areas:
 | 
						|
			"avatar . ."
 | 
						|
			"avatar namerole namerole"
 | 
						|
			"avatar namerole namerole";
 | 
						|
 | 
						|
		/*
 | 
						|
			Margin top to inset profile pic into
 | 
						|
			header image, margin sides to inset
 | 
						|
			basic info from header wrapper.
 | 
						|
		*/
 | 
						|
		margin: calc(-1 * $overlap) 1rem 0 1rem;
 | 
						|
 | 
						|
		.avatar-image-wrapper {
 | 
						|
			grid-area: avatar;
 | 
						|
			
 | 
						|
			border: 0.2rem solid $avatar-border;
 | 
						|
			border-radius: $br;
 | 
						|
			
 | 
						|
			/*
 | 
						|
				Wrapper always same
 | 
						|
				size + proportions no
 | 
						|
				matter image inside.
 | 
						|
			*/
 | 
						|
			height: $avatar-size;
 | 
						|
			width: $avatar-size;
 | 
						|
 | 
						|
			/*
 | 
						|
				Offset to avoid clashing with
 | 
						|
				thick border around avatars.
 | 
						|
			*/
 | 
						|
			a.photoswipe-slide:focus-visible {
 | 
						|
				outline-offset: 0.25rem;
 | 
						|
			}
 | 
						|
 | 
						|
			.avatar {
 | 
						|
				/*
 | 
						|
					Fit 100% of the wrapper.
 | 
						|
				*/
 | 
						|
				height: 100%;
 | 
						|
				width: 100%;
 | 
						|
 | 
						|
				/*
 | 
						|
					Normalize non-square images.
 | 
						|
				*/
 | 
						|
				object-fit: cover;
 | 
						|
 | 
						|
				/*
 | 
						|
					Prevent image extending
 | 
						|
					beyond rounded borders.
 | 
						|
				*/
 | 
						|
				border-radius: $br-inner;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		.namerole {
 | 
						|
			grid-area: namerole;
 | 
						|
 | 
						|
			display: grid;
 | 
						|
			gap: 0 1rem;
 | 
						|
			box-sizing: border-box;
 | 
						|
			grid-template-columns: 1fr auto;
 | 
						|
			grid-template-rows: $name-size auto;
 | 
						|
			grid-template-areas:
 | 
						|
				"displayname displayname"
 | 
						|
				"username role";
 | 
						|
 | 
						|
			.displayname {
 | 
						|
				grid-area: displayname;
 | 
						|
				line-height: $name-size;
 | 
						|
				font-size: 1.5rem;
 | 
						|
				font-weight: bold;
 | 
						|
			}
 | 
						|
 | 
						|
			.bot-username-wrapper {
 | 
						|
				display: flex;
 | 
						|
				gap: 0.5rem;
 | 
						|
				grid-area: username;
 | 
						|
				align-items: center;
 | 
						|
				
 | 
						|
				.bot-legend-wrapper {
 | 
						|
					display: flex;
 | 
						|
					gap: 0.25rem;
 | 
						|
					align-items: center;
 | 
						|
					
 | 
						|
					background: $bg;
 | 
						|
					color: $fg;
 | 
						|
		
 | 
						|
					border-radius: $br;
 | 
						|
					padding: 0.1rem 0.4rem 0.2rem 0.4rem;
 | 
						|
					
 | 
						|
					font-variant: small-caps;
 | 
						|
					font-weight: bold;
 | 
						|
 | 
						|
					cursor: default;
 | 
						|
 | 
						|
					.bot-icon {
 | 
						|
						/*
 | 
						|
							FA icon is weirdly
 | 
						|
							aligned so tweak it
 | 
						|
						*/
 | 
						|
						margin-top: 0.25rem;
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
				.username {
 | 
						|
					min-width: 0;
 | 
						|
					line-height: $username-size;
 | 
						|
		
 | 
						|
					font-size: 1rem;
 | 
						|
					font-weight: bold;
 | 
						|
					color: $fg-accent;
 | 
						|
					user-select: all;
 | 
						|
				}
 | 
						|
			}
 | 
						|
	
 | 
						|
			.role {
 | 
						|
				background: $bg;
 | 
						|
				color: $fg;
 | 
						|
				border: 0.13rem solid $bg;
 | 
						|
	
 | 
						|
				grid-area: role;
 | 
						|
				align-self: center;
 | 
						|
				justify-self: start;
 | 
						|
				border-radius: $br;
 | 
						|
				padding: 0.3rem;
 | 
						|
				
 | 
						|
				line-height: 1.1rem;
 | 
						|
				font-size: 0.9rem;
 | 
						|
				font-variant: small-caps;
 | 
						|
				font-weight: bold;
 | 
						|
	
 | 
						|
				&.admin {
 | 
						|
					color: $role-admin;
 | 
						|
					border-color: $role-admin;
 | 
						|
				}
 | 
						|
	
 | 
						|
				&.moderator {
 | 
						|
					color: $role-mod;
 | 
						|
					border-color: $role-mod;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
.profile .about-user {
 | 
						|
	flex: 35 14rem;
 | 
						|
	border-radius: $br;
 | 
						|
	overflow: hidden;
 | 
						|
 | 
						|
	.col-header {
 | 
						|
		margin-bottom: -0.25rem;
 | 
						|
	}
 | 
						|
 | 
						|
	dt {
 | 
						|
		font-weight: bold;
 | 
						|
	}
 | 
						|
 | 
						|
	.fields {
 | 
						|
		background: $profile-bg;
 | 
						|
		display: flex;
 | 
						|
		flex-direction: column;
 | 
						|
		padding: 0 0.5rem;
 | 
						|
		padding-top: 0.25rem;
 | 
						|
 | 
						|
		.field {
 | 
						|
			padding: 0.25rem;
 | 
						|
			display: flex;
 | 
						|
			flex-direction: column;
 | 
						|
			border-bottom: 0.1rem solid $gray2;
 | 
						|
 | 
						|
			> dt, > dd {
 | 
						|
				word-break: break-word;
 | 
						|
			}
 | 
						|
 | 
						|
			&:first-child {
 | 
						|
				border-top: 0.1rem solid $gray2;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	.bio {
 | 
						|
		background: $profile-bg;
 | 
						|
		padding: 1rem 0.75rem;
 | 
						|
		padding-bottom: 1.25rem;
 | 
						|
	}
 | 
						|
 | 
						|
	.accountstats {
 | 
						|
		background: $bg-accent;
 | 
						|
		padding: 0.75rem;
 | 
						|
		
 | 
						|
		display: flex;
 | 
						|
		flex-direction: column;
 | 
						|
		gap: 0.25rem;
 | 
						|
 | 
						|
		.stats-item {
 | 
						|
			display: flex;
 | 
						|
			dt {
 | 
						|
				width: 7rem;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
	RSS icon isn't really part of the profile header exactly,
 | 
						|
	but also it sort of is, and we want it styled the same for
 | 
						|
	both microblog and gallery view anyway, so include it here.
 | 
						|
*/
 | 
						|
.rss-icon {
 | 
						|
	display: block;
 | 
						|
	margin: -0.25rem 0;
 | 
						|
	
 | 
						|
	.fa {
 | 
						|
		font-size: 2rem;
 | 
						|
		object-fit: contain;
 | 
						|
		vertical-align: middle;
 | 
						|
		color: $orange2;
 | 
						|
		/*
 | 
						|
			Can't size a single-color background, so we use
 | 
						|
			a linear-gradient that's effectively white.
 | 
						|
		*/
 | 
						|
		background: linear-gradient(to right, $white1 100%, transparent 0) no-repeat center center;
 | 
						|
		background-size: 1.2rem 1.4rem;
 | 
						|
		/* light mode */
 | 
						|
		@media (prefers-color-scheme: light) {
 | 
						|
			background: linear-gradient(to right, $white 100%, transparent 0) no-repeat center center;
 | 
						|
			background-size: 1.2rem 1.4rem;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
	Tablet-ish-kinda size.
 | 
						|
*/
 | 
						|
@media screen and (max-width: 750px) {
 | 
						|
	.profile .profile-header {
 | 
						|
		.basic-info {
 | 
						|
			grid-template-columns: auto 1fr;
 | 
						|
			grid-template-rows: $avatar-size $name-size auto;
 | 
						|
			grid-template-areas:
 | 
						|
				"avatar avatar"
 | 
						|
				"namerole namerole"
 | 
						|
				"namerole namerole";
 | 
						|
			
 | 
						|
			/*
 | 
						|
				Make display name a bit smaller
 | 
						|
				so there's more chance of being
 | 
						|
				able to read everything.
 | 
						|
			*/
 | 
						|
			.namerole {
 | 
						|
				.displayname {
 | 
						|
					font-size: 1.2rem;
 | 
						|
					line-height: 2rem;
 | 
						|
					margin-top: 0.5rem;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
	Phone-ish-kinda size.
 | 
						|
*/
 | 
						|
@media screen and (max-width: 500px) {
 | 
						|
	.profile
 | 
						|
	.profile-header
 | 
						|
	.basic-info
 | 
						|
	.namerole {
 | 
						|
		/*
 | 
						|
			Line up in smallest possible
 | 
						|
			horizontal space to avoid overflow.
 | 
						|
		*/
 | 
						|
		display: flex;
 | 
						|
		flex-direction: column;
 | 
						|
		gap: 0.5rem;
 | 
						|
 | 
						|
		/*
 | 
						|
			Don't hug the right anymore
 | 
						|
			(good life advice in general).
 | 
						|
		*/
 | 
						|
		.role {
 | 
						|
			align-self: flex-start;
 | 
						|
		}
 | 
						|
 | 
						|
		/*
 | 
						|
			Allow this to wrap in case
 | 
						|
			of a really skinny screen.
 | 
						|
		*/
 | 
						|
		.bot-username-wrapper {
 | 
						|
			flex-wrap: wrap;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |