| 
									
										
										
										
											2025-03-26 16:59:39 +01:00
										 |  |  | /* | 
					
						
							|  |  |  | 	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; | 
					
						
							| 
									
										
										
										
											2025-04-11 15:50:14 +02:00
										 |  |  | 	margin-bottom: 1rem; | 
					
						
							|  |  |  | 	padding-bottom: 1rem; | 
					
						
							| 
									
										
										
										
											2025-04-11 12:05:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 		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; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2025-03-26 16:59:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.moved-to { | 
					
						
							|  |  |  | 		padding: 1rem; | 
					
						
							|  |  |  | 		text-align: center; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.header-image-wrapper { | 
					
						
							|  |  |  | 		position: relative; | 
					
						
							| 
									
										
										
										
											2025-04-11 12:05:26 +02:00
										 |  |  | 		aspect-ratio: 3; | 
					
						
							|  |  |  | 		height: 100%; | 
					
						
							|  |  |  | 		width: 100%; | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2025-03-26 16:59:39 +01:00
										 |  |  | 		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; | 
					
						
							| 
									
										
										
										
											2025-04-11 15:50:14 +02:00
										 |  |  | 		gap: 0 1rem; | 
					
						
							| 
									
										
										
										
											2025-03-26 16:59:39 +01:00
										 |  |  | 		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"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-11 15:50:14 +02:00
										 |  |  | 		/* | 
					
						
							|  |  |  | 			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; | 
					
						
							| 
									
										
										
										
											2025-03-26 16:59:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		.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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-09 14:14:20 +02:00
										 |  |  | 			/* | 
					
						
							| 
									
										
										
										
											2025-04-11 12:05:26 +02:00
										 |  |  | 				Offset to avoid clashing with | 
					
						
							|  |  |  | 				thick border around avatars. | 
					
						
							| 
									
										
										
										
											2025-04-09 14:14:20 +02:00
										 |  |  | 			*/ | 
					
						
							| 
									
										
										
										
											2025-04-11 12:05:26 +02:00
										 |  |  | 			a.photoswipe-slide:focus-visible { | 
					
						
							|  |  |  | 				outline-offset: 0.25rem; | 
					
						
							| 
									
										
										
										
											2025-04-09 14:14:20 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-26 16:59:39 +01:00
										 |  |  | 			.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; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |