forked from DebaucheryLibrarian/traxxx
				
			
		
			
				
	
	
		
			282 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
			
		
		
	
	
			282 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
| <template>
 | |
| 	<div
 | |
| 		v-if="actor"
 | |
| 		class="actor"
 | |
| 	>
 | |
| 		<router-link
 | |
| 			:to="{ name: 'actor', params: { actorId: actor.id, actorSlug: actor.slug } }"
 | |
| 			class="link"
 | |
| 		>
 | |
| 			<span
 | |
| 				class="handle"
 | |
| 			>
 | |
| 				<span
 | |
| 					v-tooltip.top="actor.name"
 | |
| 					class="name"
 | |
| 				>{{ actor.name }}</span>
 | |
| 
 | |
| 				<router-link
 | |
| 					v-if="actor.network"
 | |
| 					v-tooltip="actor.network.name"
 | |
| 					:to="{ name: 'network', params: { networkSlug: actor.network.slug } }"
 | |
| 					class="favicon"
 | |
| 				>
 | |
| 					<img
 | |
| 						:src="`/img/logos/${actor.network.slug}/favicon.png`"
 | |
| 						class="favicon-icon"
 | |
| 					>
 | |
| 				</router-link>
 | |
| 
 | |
| 				<Icon
 | |
| 					v-if="alias"
 | |
| 					v-tooltip="`Alias of ${alias.name}`"
 | |
| 					icon="users3"
 | |
| 					class="favicon alias"
 | |
| 				/>
 | |
| 
 | |
| 				<Icon
 | |
| 					v-if="actor.dateOfDeath"
 | |
| 					v-tooltip="`Died ${formatDate(actor.dateOfDeath, 'MMMM D, YYYY')}`"
 | |
| 					icon="tombstone"
 | |
| 					class="favicon died"
 | |
| 				/>
 | |
| 			</span>
 | |
| 
 | |
| 			<div class="avatar-container">
 | |
| 				<img
 | |
| 					v-if="actor.avatar"
 | |
| 					:data-src="sfw ? `/img/${actor.avatar.sfw.thumbnail}` : `/media/${actor.avatar.thumbnail}`"
 | |
| 					:data-loading="sfw ? `/img/${actor.avatar.sfw.lazy}` : `/media/${actor.avatar.lazy}`"
 | |
| 					class="avatar lazy"
 | |
| 				>
 | |
| 
 | |
| 				<span
 | |
| 					v-else
 | |
| 					class="avatar"
 | |
| 				><img
 | |
| 					:src="`/img/avatar_${actor.gender || 'female'}.svg`"
 | |
| 					class="avatar-fallback"
 | |
| 				></span>
 | |
| 
 | |
| 				<span
 | |
| 					class="details"
 | |
| 				>
 | |
| 					<span class="gender-age">
 | |
| 						<Gender :gender="actor.gender" />
 | |
| 
 | |
| 						<span
 | |
| 							v-if="actor.ageAtDeath"
 | |
| 							v-tooltip="`Born ${formatDate(actor.dateOfBirth, 'MMMM D, YYYY')}<br>Died ${formatDate(actor.dateOfDeath, 'MMMM D, YYYY')}`"
 | |
| 							class="age-death"
 | |
| 						>{{ actor.ageAtDeath }}</span>
 | |
| 
 | |
| 						<span
 | |
| 							v-else-if="actor.age"
 | |
| 							v-tooltip="`Born on ${formatDate(actor.dateOfBirth, 'MMMM D, YYYY')}`"
 | |
| 							class="age-now"
 | |
| 						>{{ actor.age }}</span>
 | |
| 
 | |
| 						<span
 | |
| 							v-if="actor.ageThen && actor.ageThen < actor.age"
 | |
| 							v-tooltip="`${actor.ageThen} years old on release date`"
 | |
| 							class="age-then"
 | |
| 						>{{ actor.ageThen }}</span>
 | |
| 					</span>
 | |
| 
 | |
| 					<span
 | |
| 						v-if="actor.origin"
 | |
| 						v-tooltip="`Born in ${actor.origin.country.alias || actor.origin.country.name}`"
 | |
| 						class="country"
 | |
| 					>
 | |
| 						{{ actor.origin.country.alpha2 }}
 | |
| 						<img
 | |
| 							class="flag"
 | |
| 							:src="`/img/flags/${actor.origin.country.alpha2.toLowerCase()}.svg`"
 | |
| 						>
 | |
| 					</span>
 | |
| 
 | |
| 					<span
 | |
| 						v-else
 | |
| 						class="country"
 | |
| 					/>
 | |
| 				</span>
 | |
| 			</div>
 | |
| 		</router-link>
 | |
| 	</div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import Gender from './gender.vue';
 | |
| 
 | |
| function sfw() {
 | |
| 	return this.$store.state.ui.sfw;
 | |
| }
 | |
| 
 | |
| export default {
 | |
| 	components: {
 | |
| 		Gender,
 | |
| 	},
 | |
| 	props: {
 | |
| 		actor: {
 | |
| 			type: Object,
 | |
| 			default: null,
 | |
| 		},
 | |
| 		alias: {
 | |
| 			type: Object,
 | |
| 			default: null,
 | |
| 		},
 | |
| 	},
 | |
| 	computed: {
 | |
| 		sfw,
 | |
| 	},
 | |
| };
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| @import 'theme';
 | |
| 
 | |
| .actor {
 | |
|     width: 100%;
 | |
|     display: inline-block;
 | |
|     position: relative;
 | |
|     box-shadow: 0 0 3px var(--darken-weak);
 | |
|     background: var(--background);
 | |
| 	overflow: hidden;
 | |
| 
 | |
|     &::before {
 | |
|         content: '';
 | |
|         display: inline-block;
 | |
|         padding-bottom: 150%;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .link {
 | |
|     width: 100%;
 | |
|     height: 100%;
 | |
|     display: flex;
 | |
|     flex-direction: column;
 | |
|     position: absolute;
 | |
|     top: 0;
 | |
|     left: 0;
 | |
|     color: var(--text);
 | |
|     text-decoration: none;
 | |
| 
 | |
|     &:hover {
 | |
|         color: var(--primary);
 | |
|     }
 | |
| }
 | |
| 
 | |
| .handle {
 | |
|     display: flex;
 | |
|     align-items: center;
 | |
|     justify-content: center;
 | |
|     font-weight: bold;
 | |
| 	box-shadow: 0 0 3px var(--shadow);
 | |
| 
 | |
| 	.name {
 | |
| 		padding: .5rem;
 | |
| 	}
 | |
| 
 | |
| 	.alias {
 | |
| 		fill: var(--shadow);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| .favicon {
 | |
| 	font-size: 0;
 | |
| 	padding: .5rem .25rem;
 | |
| 
 | |
| 	&:last-child {
 | |
| 		padding: .5rem;
 | |
| 	}
 | |
| 
 | |
| 	&.died {
 | |
| 		fill: var(--shadow);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| .favicon-icon {
 | |
|     width: 1rem;
 | |
|     height: 1rem;
 | |
| }
 | |
| 
 | |
| .name {
 | |
|     flex-grow: 1;
 | |
|     white-space: nowrap;
 | |
|     overflow: hidden;
 | |
|     text-overflow: ellipsis;
 | |
| }
 | |
| 
 | |
| .avatar-container {
 | |
|     display: flex;
 | |
|     flex-grow: 1;
 | |
|     position: relative;
 | |
| 	overflow: hidden;
 | |
| 	background: var(--profile);
 | |
| }
 | |
| 
 | |
| .avatar {
 | |
|     color: var(--darken-weak);
 | |
|     background: var(--darken-hint);
 | |
|     width: 100%;
 | |
|     height: 100%;
 | |
|     display: flex;
 | |
|     flex-direction: column;
 | |
|     align-items: center;
 | |
|     justify-content: center;
 | |
|     object-fit: cover;
 | |
|     object-position: 50% 0;
 | |
| }
 | |
| 
 | |
| .avatar-fallback {
 | |
|     max-height: 100%;
 | |
|     max-width: 100%;
 | |
|     opacity: .1;
 | |
| }
 | |
| 
 | |
| .details {
 | |
|     background: var(--darken);
 | |
|     color: var(--text-light);
 | |
|     width: 100%;
 | |
|     height: 1.75rem;
 | |
|     display: flex;
 | |
|     align-items: center;
 | |
| 	justify-content: space-between;
 | |
|     box-sizing: border-box;
 | |
|     padding: .5rem;
 | |
|     position: absolute;
 | |
|     bottom: 0;
 | |
|     font-size: .9rem;
 | |
|     font-weight: bold;
 | |
| }
 | |
| 
 | |
| .gender-age {
 | |
| 	display: flex;
 | |
| 	align-items: center;
 | |
| }
 | |
| 
 | |
| .gender {
 | |
| 	margin: .25rem .25rem 0 0;
 | |
| }
 | |
| 
 | |
| .country {
 | |
|     display: flex;
 | |
|     justify-content: flex-end;
 | |
|     align-items: center;
 | |
| }
 | |
| 
 | |
| .flag {
 | |
|     height: .75rem;
 | |
|     margin: 0 0 0 .5rem;
 | |
| }
 | |
| 
 | |
| .age-now,
 | |
| .age-death {
 | |
| 	margin: 0 .25rem 0 0;
 | |
| }
 | |
| 
 | |
| .age-then {
 | |
|     color: var(--lighten);
 | |
| }
 | |
| </style>
 |