enhance(client): プロフィールが長い場合は折りたたむ
This commit is contained in:
		
							parent
							
								
									a5b1fe5d16
								
							
						
					
					
						commit
						39349dcba5
					
				
					 2 changed files with 77 additions and 2 deletions
				
			
		
							
								
								
									
										72
									
								
								packages/frontend/src/components/MkOmit.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								packages/frontend/src/components/MkOmit.vue
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,72 @@ | ||||||
|  | <template> | ||||||
|  | <div ref="content" :class="[$style.content, { [$style.omitted]: omitted }]"> | ||||||
|  | 	<slot></slot> | ||||||
|  | 	<button v-if="omitted" :class="$style.fade" class="_button" @click="() => { ignoreOmit = true; omitted = false; }"> | ||||||
|  | 		<span :class="$style.fadeLabel">{{ $ts.showMore }}</span> | ||||||
|  | 	</button> | ||||||
|  | </div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script lang="ts" setup> | ||||||
|  | import { nextTick, onMounted } from 'vue'; | ||||||
|  | 
 | ||||||
|  | const props = withDefaults(defineProps<{ | ||||||
|  | 	maxHeight: number; | ||||||
|  | }>(), { | ||||||
|  | 	maxHeight: 200, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | let content = $ref<HTMLElement>(); | ||||||
|  | let omitted = $ref(false); | ||||||
|  | let ignoreOmit = $ref(false); | ||||||
|  | 
 | ||||||
|  | onMounted(() => { | ||||||
|  | 	const calcOmit = () => { | ||||||
|  | 		if (omitted || ignoreOmit) return; | ||||||
|  | 		omitted = content.offsetHeight > props.maxHeight; | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 	calcOmit(); | ||||||
|  | 	new ResizeObserver((entries, observer) => { | ||||||
|  | 		calcOmit(); | ||||||
|  | 	}).observe(content); | ||||||
|  | }); | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style lang="scss" module> | ||||||
|  | .content { | ||||||
|  | 	--stickyTop: 0px; | ||||||
|  | 
 | ||||||
|  | 	&.omitted { | ||||||
|  | 		position: relative; | ||||||
|  | 		max-height: v-bind("props.maxHeight + 'px'"); | ||||||
|  | 		overflow: hidden; | ||||||
|  | 
 | ||||||
|  | 		> .fade { | ||||||
|  | 			display: block; | ||||||
|  | 			position: absolute; | ||||||
|  | 			z-index: 10; | ||||||
|  | 			bottom: 0; | ||||||
|  | 			left: 0; | ||||||
|  | 			width: 100%; | ||||||
|  | 			height: 64px; | ||||||
|  | 			background: linear-gradient(0deg, var(--panel), var(--X15)); | ||||||
|  | 
 | ||||||
|  | 			> .fadeLabel { | ||||||
|  | 				display: inline-block; | ||||||
|  | 				background: var(--panel); | ||||||
|  | 				padding: 6px 10px; | ||||||
|  | 				font-size: 0.8em; | ||||||
|  | 				border-radius: 999px; | ||||||
|  | 				box-shadow: 0 2px 6px rgb(0 0 0 / 20%); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			&:hover { | ||||||
|  | 				> .fadeLabel { | ||||||
|  | 					background: var(--panelHighlight); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | </style> | ||||||
|  | @ -42,8 +42,10 @@ | ||||||
| 						<span v-for="role in user.roles" :key="role.id" v-tooltip="role.description" class="role" :style="{ '--color': role.color }">{{ role.name }}</span> | 						<span v-for="role in user.roles" :key="role.id" v-tooltip="role.description" class="role" :style="{ '--color': role.color }">{{ role.name }}</span> | ||||||
| 					</div> | 					</div> | ||||||
| 					<div class="description"> | 					<div class="description"> | ||||||
|  | 						<MkOmit> | ||||||
| 							<Mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$i"/> | 							<Mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$i"/> | ||||||
| 							<p v-else class="empty">{{ i18n.ts.noAccountDescription }}</p> | 							<p v-else class="empty">{{ i18n.ts.noAccountDescription }}</p> | ||||||
|  | 						</MkOmit> | ||||||
| 					</div> | 					</div> | ||||||
| 					<div class="fields system"> | 					<div class="fields system"> | ||||||
| 						<dl v-if="user.location" class="field"> | 						<dl v-if="user.location" class="field"> | ||||||
|  | @ -119,6 +121,7 @@ import MkContainer from '@/components/MkContainer.vue'; | ||||||
| import MkFoldableSection from '@/components/MkFoldableSection.vue'; | import MkFoldableSection from '@/components/MkFoldableSection.vue'; | ||||||
| import MkRemoteCaution from '@/components/MkRemoteCaution.vue'; | import MkRemoteCaution from '@/components/MkRemoteCaution.vue'; | ||||||
| import MkTab from '@/components/MkTab.vue'; | import MkTab from '@/components/MkTab.vue'; | ||||||
|  | import MkOmit from '@/components/MkOmit.vue'; | ||||||
| import MkInfo from '@/components/MkInfo.vue'; | import MkInfo from '@/components/MkInfo.vue'; | ||||||
| import { getScrollPosition } from '@/scripts/scroll'; | import { getScrollPosition } from '@/scripts/scroll'; | ||||||
| import { getUserMenu } from '@/scripts/get-user-menu'; | import { getUserMenu } from '@/scripts/get-user-menu'; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue