chore(client): tweak ui
This commit is contained in:
		
							parent
							
								
									113df68843
								
							
						
					
					
						commit
						92e8a5dbd6
					
				
					 5 changed files with 609 additions and 353 deletions
				
			
		|  | @ -889,6 +889,7 @@ enableAutoSensitiveDescription: "利用可能な場合は、機械学習を利 | ||||||
| activeEmailValidationDescription: "ユーザーのメールアドレスのバリデーションを、捨てアドかどうかや実際に通信可能かどうかなどを判定しより積極的に行います。オフにすると単に文字列として正しいかどうかのみチェックされます。" | activeEmailValidationDescription: "ユーザーのメールアドレスのバリデーションを、捨てアドかどうかや実際に通信可能かどうかなどを判定しより積極的に行います。オフにすると単に文字列として正しいかどうかのみチェックされます。" | ||||||
| navbar: "ナビゲーションバー" | navbar: "ナビゲーションバー" | ||||||
| shuffle: "シャッフル" | shuffle: "シャッフル" | ||||||
|  | account: "アカウント" | ||||||
| 
 | 
 | ||||||
| _sensitiveMediaDetection: | _sensitiveMediaDetection: | ||||||
|   description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てることができます。サーバーの負荷が少し増えます。" |   description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てることができます。サーバーの負荷が少し増えます。" | ||||||
|  |  | ||||||
|  | @ -1,9 +1,13 @@ | ||||||
| <template> | <template> | ||||||
| <div class="kmwsukvl"> | <div class="kmwsukvl"> | ||||||
| 	<div class="body"> | 	<div class="body"> | ||||||
| 		<button v-click-anime class="item _button account" @click="openAccountMenu"> | 		<div class="top"> | ||||||
| 			<MkAvatar :user="$i" class="avatar"/><MkAcct class="text" :user="$i"/> | 			<div class="banner" :style="{ backgroundImage: `url(${ $instance.bannerUrl })` }"></div> | ||||||
|  | 			<button v-click-anime v-tooltip.right="$instance.name ?? i18n.ts.instance" class="item _button instance" @click="openInstanceMenu"> | ||||||
|  | 				<img :src="$instance.iconUrl || $instance.faviconUrl || '/favicon.ico'" alt="" class="icon"/> | ||||||
| 			</button> | 			</button> | ||||||
|  | 		</div> | ||||||
|  | 		<div class="middle"> | ||||||
| 			<MkA v-click-anime class="item index" active-class="active" to="/" exact> | 			<MkA v-click-anime class="item index" active-class="active" to="/" exact> | ||||||
| 				<i class="icon fas fa-home fa-fw"></i><span class="text">{{ $ts.timeline }}</span> | 				<i class="icon fas fa-home fa-fw"></i><span class="text">{{ $ts.timeline }}</span> | ||||||
| 			</MkA> | 			</MkA> | ||||||
|  | @ -25,24 +29,30 @@ | ||||||
| 			<MkA v-click-anime class="item" active-class="active" to="/settings"> | 			<MkA v-click-anime class="item" active-class="active" to="/settings"> | ||||||
| 				<i class="icon fas fa-cog fa-fw"></i><span class="text">{{ $ts.settings }}</span> | 				<i class="icon fas fa-cog fa-fw"></i><span class="text">{{ $ts.settings }}</span> | ||||||
| 			</MkA> | 			</MkA> | ||||||
| 		<button class="item _button post" data-cy-open-post-form @click="post"> | 		</div> | ||||||
|  | 		<div class="bottom"> | ||||||
|  | 			<button class="item _button post" data-cy-open-post-form @click="os.post"> | ||||||
| 				<i class="icon fas fa-pencil-alt fa-fw"></i><span class="text">{{ $ts.note }}</span> | 				<i class="icon fas fa-pencil-alt fa-fw"></i><span class="text">{{ $ts.note }}</span> | ||||||
| 			</button> | 			</button> | ||||||
|  | 			<button v-click-anime class="item _button account" @click="openAccountMenu"> | ||||||
|  | 				<MkAvatar :user="$i" class="avatar"/><MkAcct class="text" :user="$i"/> | ||||||
|  | 			</button> | ||||||
|  | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <script lang="ts"> | <script lang="ts" setup> | ||||||
| import { computed, defineAsyncComponent, defineComponent, ref, toRef, watch } from 'vue'; | import { computed, defineAsyncComponent, defineComponent, ref, toRef, watch } from 'vue'; | ||||||
| import { host } from '@/config'; | import { host } from '@/config'; | ||||||
| import { search } from '@/scripts/search'; | import { search } from '@/scripts/search'; | ||||||
| import * as os from '@/os'; | import * as os from '@/os'; | ||||||
| import { navbarItemDef } from '@/navbar'; | import { navbarItemDef } from '@/navbar'; | ||||||
| import { openAccountMenu } from '@/account'; | import { openAccountMenu as openAccountMenu_ } from '@/account'; | ||||||
| import { defaultStore } from '@/store'; | import { defaultStore } from '@/store'; | ||||||
|  | import { instance } from '@/instance'; | ||||||
|  | import { i18n } from '@/i18n'; | ||||||
| 
 | 
 | ||||||
| export default defineComponent({ |  | ||||||
| 	setup(props, context) { |  | ||||||
| const menu = toRef(defaultStore.state, 'menu'); | const menu = toRef(defaultStore.state, 'menu'); | ||||||
| const otherMenuItemIndicated = computed(() => { | const otherMenuItemIndicated = computed(() => { | ||||||
| 	for (const def in navbarItemDef) { | 	for (const def in navbarItemDef) { | ||||||
|  | @ -52,36 +62,157 @@ export default defineComponent({ | ||||||
| 	return false; | 	return false; | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| 		return { | function openAccountMenu(ev: MouseEvent) { | ||||||
| 			host: host, | 	openAccountMenu_({ | ||||||
| 			accounts: [], |  | ||||||
| 			connection: null, |  | ||||||
| 			menu, |  | ||||||
| 			navbarItemDef: navbarItemDef, |  | ||||||
| 			otherMenuItemIndicated, |  | ||||||
| 			post: os.post, |  | ||||||
| 			search, |  | ||||||
| 			openAccountMenu: (ev) => { |  | ||||||
| 				openAccountMenu({ |  | ||||||
| 		withExtraOperation: true, | 		withExtraOperation: true, | ||||||
| 	}, ev); | 	}, ev); | ||||||
| 			}, | } | ||||||
| 			more: () => { | 
 | ||||||
|  | function openInstanceMenu(ev: MouseEvent) { | ||||||
|  | 	os.popupMenu([{ | ||||||
|  | 		text: instance.name ?? host, | ||||||
|  | 		type: 'label', | ||||||
|  | 	}, { | ||||||
|  | 		type: 'link', | ||||||
|  | 		text: i18n.ts.instanceInfo, | ||||||
|  | 		icon: 'fas fa-info-circle', | ||||||
|  | 		to: '/about', | ||||||
|  | 	}, { | ||||||
|  | 		type: 'link', | ||||||
|  | 		text: i18n.ts.customEmojis, | ||||||
|  | 		icon: 'fas fa-laugh', | ||||||
|  | 		to: '/about#emojis', | ||||||
|  | 	}, { | ||||||
|  | 		type: 'link', | ||||||
|  | 		text: i18n.ts.federation, | ||||||
|  | 		icon: 'fas fa-globe', | ||||||
|  | 		to: '/about#federation', | ||||||
|  | 	}], ev.currentTarget ?? ev.target, { | ||||||
|  | 		align: 'left', | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function more() { | ||||||
| 	os.popup(defineAsyncComponent(() => import('@/components/launch-pad.vue')), {}, { | 	os.popup(defineAsyncComponent(() => import('@/components/launch-pad.vue')), {}, { | ||||||
| 	}, 'closed'); | 	}, 'closed'); | ||||||
| 			}, | } | ||||||
| 		}; |  | ||||||
| 	}, |  | ||||||
| }); |  | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" scoped> | ||||||
| .kmwsukvl { | .kmwsukvl { | ||||||
| 	$ui-font-size: 1em; // TODO: どこかに集約したい |  | ||||||
| 	$avatar-size: 32px; |  | ||||||
| 	$avatar-margin: 8px; |  | ||||||
| 
 |  | ||||||
| 	> .body { | 	> .body { | ||||||
|  | 		display: flex; | ||||||
|  | 		flex-direction: column; | ||||||
|  | 
 | ||||||
|  | 		> .top { | ||||||
|  | 			position: sticky; | ||||||
|  | 			top: 0; | ||||||
|  | 			z-index: 1; | ||||||
|  | 			padding: 20px 0; | ||||||
|  | 			background: var(--X14); | ||||||
|  | 			-webkit-backdrop-filter: var(--blur, blur(8px)); | ||||||
|  | 			backdrop-filter: var(--blur, blur(8px)); | ||||||
|  | 
 | ||||||
|  | 			> .banner { | ||||||
|  | 				position: absolute; | ||||||
|  | 				top: 0; | ||||||
|  | 				left: 0; | ||||||
|  | 				width: 100%; | ||||||
|  | 				height: 100%; | ||||||
|  | 				background-size: cover; | ||||||
|  | 				background-position: center center; | ||||||
|  | 				-webkit-mask-image: linear-gradient(0deg, rgba(0,0,0,0) 15%, rgba(0,0,0,0.75) 100%); | ||||||
|  | 				mask-image: linear-gradient(0deg, rgba(0,0,0,0) 15%, rgba(0,0,0,0.75) 100%); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			> .instance { | ||||||
|  | 				position: relative; | ||||||
|  | 				display: block; | ||||||
|  | 				text-align: center; | ||||||
|  | 				width: 100%; | ||||||
|  | 
 | ||||||
|  | 				> .icon { | ||||||
|  | 					display: inline-block; | ||||||
|  | 					width: 38px; | ||||||
|  | 					aspect-ratio: 1; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		> .bottom { | ||||||
|  | 			position: sticky; | ||||||
|  | 			bottom: 0; | ||||||
|  | 			padding: 20px 0; | ||||||
|  | 			background: var(--X14); | ||||||
|  | 			-webkit-backdrop-filter: var(--blur, blur(8px)); | ||||||
|  | 			backdrop-filter: var(--blur, blur(8px)); | ||||||
|  | 
 | ||||||
|  | 			> .post { | ||||||
|  | 				position: relative; | ||||||
|  | 				display: block; | ||||||
|  | 				width: 100%; | ||||||
|  | 				height: 40px; | ||||||
|  | 				color: var(--fgOnAccent); | ||||||
|  | 				font-weight: bold; | ||||||
|  | 				text-align: left; | ||||||
|  | 
 | ||||||
|  | 				&:before { | ||||||
|  | 					content: ""; | ||||||
|  | 					display: block; | ||||||
|  | 					width: calc(100% - 38px); | ||||||
|  | 					height: 100%; | ||||||
|  | 					margin: auto; | ||||||
|  | 					position: absolute; | ||||||
|  | 					top: 0; | ||||||
|  | 					left: 0; | ||||||
|  | 					right: 0; | ||||||
|  | 					bottom: 0; | ||||||
|  | 					border-radius: 999px; | ||||||
|  | 					background: linear-gradient(90deg, var(--buttonGradateA), var(--buttonGradateB)); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				&:hover, &.active { | ||||||
|  | 					&:before { | ||||||
|  | 						background: var(--accentLighten); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				> .icon { | ||||||
|  | 					position: relative; | ||||||
|  | 					margin-left: 30px; | ||||||
|  | 					margin-right: 8px; | ||||||
|  | 					width: 32px; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				> .text { | ||||||
|  | 					position: relative; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			> .account { | ||||||
|  | 				position: relative; | ||||||
|  | 				display: flex; | ||||||
|  | 				align-items: center; | ||||||
|  | 				padding-left: 30px; | ||||||
|  | 				text-overflow: ellipsis; | ||||||
|  | 				overflow: hidden; | ||||||
|  | 				white-space: nowrap; | ||||||
|  | 				width: 100%; | ||||||
|  | 				text-align: left; | ||||||
|  | 				box-sizing: border-box; | ||||||
|  | 				margin-top: 16px; | ||||||
|  | 
 | ||||||
|  | 				> .avatar { | ||||||
|  | 					position: relative; | ||||||
|  | 					width: 32px; | ||||||
|  | 					aspect-ratio: 1; | ||||||
|  | 					margin-right: 8px; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		> .middle { | ||||||
|  | 			flex: 1; | ||||||
| 
 | 
 | ||||||
| 			> .divider { | 			> .divider { | ||||||
| 				margin: 16px 16px; | 				margin: 16px 16px; | ||||||
|  | @ -92,7 +223,6 @@ export default defineComponent({ | ||||||
| 				position: relative; | 				position: relative; | ||||||
| 				display: block; | 				display: block; | ||||||
| 				padding-left: 24px; | 				padding-left: 24px; | ||||||
| 			font-size: $ui-font-size; |  | ||||||
| 				line-height: 2.85rem; | 				line-height: 2.85rem; | ||||||
| 				text-overflow: ellipsis; | 				text-overflow: ellipsis; | ||||||
| 				overflow: hidden; | 				overflow: hidden; | ||||||
|  | @ -105,17 +235,7 @@ export default defineComponent({ | ||||||
| 				> .icon { | 				> .icon { | ||||||
| 					position: relative; | 					position: relative; | ||||||
| 					width: 32px; | 					width: 32px; | ||||||
| 			} | 					margin-right: 8px; | ||||||
| 
 |  | ||||||
| 			> .icon, |  | ||||||
| 			> .avatar { |  | ||||||
| 				margin-right: $avatar-margin; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			> .avatar { |  | ||||||
| 				width: $avatar-size; |  | ||||||
| 				height: $avatar-size; |  | ||||||
| 				vertical-align: middle; |  | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				> .indicator { | 				> .indicator { | ||||||
|  | @ -157,51 +277,6 @@ export default defineComponent({ | ||||||
| 						background: var(--accentedBg); | 						background: var(--accentedBg); | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 
 |  | ||||||
| 			&:first-child, &:last-child { |  | ||||||
| 				position: sticky; |  | ||||||
| 				z-index: 1; |  | ||||||
| 				padding-top: 8px; |  | ||||||
| 				padding-bottom: 8px; |  | ||||||
| 				background: var(--X14); |  | ||||||
| 				-webkit-backdrop-filter: var(--blur, blur(8px)); |  | ||||||
| 				backdrop-filter: var(--blur, blur(8px)); |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			&:first-child { |  | ||||||
| 				top: 0; |  | ||||||
| 
 |  | ||||||
| 				&:hover, &.active { |  | ||||||
| 					&:before { |  | ||||||
| 						content: none; |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			&:last-child { |  | ||||||
| 				bottom: 0; |  | ||||||
| 				color: var(--fgOnAccent); |  | ||||||
| 
 |  | ||||||
| 				&:before { |  | ||||||
| 					content: ""; |  | ||||||
| 					display: block; |  | ||||||
| 					width: calc(100% - 20px); |  | ||||||
| 					height: calc(100% - 20px); |  | ||||||
| 					margin: auto; |  | ||||||
| 					position: absolute; |  | ||||||
| 					top: 0; |  | ||||||
| 					left: 0; |  | ||||||
| 					right: 0; |  | ||||||
| 					bottom: 0; |  | ||||||
| 					border-radius: 999px; |  | ||||||
| 					background: linear-gradient(90deg, var(--buttonGradateA), var(--buttonGradateB)); |  | ||||||
| 				} |  | ||||||
| 				 |  | ||||||
| 				&:hover, &.active { |  | ||||||
| 					&:before { |  | ||||||
| 						background: var(--accentLighten); |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,9 +1,13 @@ | ||||||
| <template> | <template> | ||||||
| <div class="mvcprjjd" :class="{ iconOnly }"> | <div class="mvcprjjd" :class="{ iconOnly }"> | ||||||
| 	<div class="body"> | 	<div class="body"> | ||||||
| 		<button v-click-anime class="item _button account" @click="openAccountMenu"> | 		<div class="top"> | ||||||
| 			<MkAvatar :user="$i" class="avatar"/><MkAcct class="text" :user="$i"/> | 			<div class="banner" :style="{ backgroundImage: `url(${ $instance.bannerUrl })` }"></div> | ||||||
|  | 			<button v-click-anime v-tooltip.right="$instance.name ?? i18n.ts.instance" class="item _button instance" @click="openInstanceMenu"> | ||||||
|  | 				<img :src="$instance.iconUrl || $instance.faviconUrl || '/favicon.ico'" alt="" class="icon"/> | ||||||
| 			</button> | 			</button> | ||||||
|  | 		</div> | ||||||
|  | 		<div class="middle"> | ||||||
| 			<MkA v-click-anime v-tooltip.right="i18n.ts.timeline" class="item index" active-class="active" to="/" exact> | 			<MkA v-click-anime v-tooltip.right="i18n.ts.timeline" class="item index" active-class="active" to="/" exact> | ||||||
| 				<i class="icon fas fa-home fa-fw"></i><span class="text">{{ i18n.ts.timeline }}</span> | 				<i class="icon fas fa-home fa-fw"></i><span class="text">{{ i18n.ts.timeline }}</span> | ||||||
| 			</MkA> | 			</MkA> | ||||||
|  | @ -12,7 +16,8 @@ | ||||||
| 				<component | 				<component | ||||||
| 					:is="navbarItemDef[item].to ? 'MkA' : 'button'" | 					:is="navbarItemDef[item].to ? 'MkA' : 'button'" | ||||||
| 					v-else-if="navbarItemDef[item] && (navbarItemDef[item].show !== false)" | 					v-else-if="navbarItemDef[item] && (navbarItemDef[item].show !== false)" | ||||||
| 				v-click-anime v-tooltip.right="i18n.ts[navbarItemDef[item].title]" | 					v-click-anime | ||||||
|  | 					v-tooltip.right="i18n.ts[navbarItemDef[item].title]" | ||||||
| 					class="item _button" | 					class="item _button" | ||||||
| 					:class="[item, { active: navbarItemDef[item].active }]" | 					:class="[item, { active: navbarItemDef[item].active }]" | ||||||
| 					active-class="active" | 					active-class="active" | ||||||
|  | @ -34,9 +39,15 @@ | ||||||
| 			<MkA v-click-anime v-tooltip.right="i18n.ts.settings" class="item" active-class="active" to="/settings"> | 			<MkA v-click-anime v-tooltip.right="i18n.ts.settings" class="item" active-class="active" to="/settings"> | ||||||
| 				<i class="icon fas fa-cog fa-fw"></i><span class="text">{{ i18n.ts.settings }}</span> | 				<i class="icon fas fa-cog fa-fw"></i><span class="text">{{ i18n.ts.settings }}</span> | ||||||
| 			</MkA> | 			</MkA> | ||||||
| 		<button class="item _button post" data-cy-open-post-form @click="os.post"> | 		</div> | ||||||
|  | 		<div class="bottom"> | ||||||
|  | 			<button v-tooltip.right="i18n.ts.note" class="item _button post" data-cy-open-post-form @click="os.post"> | ||||||
| 				<i class="icon fas fa-pencil-alt fa-fw"></i><span class="text">{{ i18n.ts.note }}</span> | 				<i class="icon fas fa-pencil-alt fa-fw"></i><span class="text">{{ i18n.ts.note }}</span> | ||||||
| 			</button> | 			</button> | ||||||
|  | 			<button v-click-anime v-tooltip.right="i18n.ts.account" class="item _button account" @click="openAccountMenu"> | ||||||
|  | 				<MkAvatar :user="$i" class="avatar"/><MkAcct class="text" :user="$i"/> | ||||||
|  | 			</button> | ||||||
|  | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
|  | @ -48,6 +59,8 @@ import { navbarItemDef } from '@/navbar'; | ||||||
| import { $i, openAccountMenu as openAccountMenu_ } from '@/account'; | import { $i, openAccountMenu as openAccountMenu_ } from '@/account'; | ||||||
| import { defaultStore } from '@/store'; | import { defaultStore } from '@/store'; | ||||||
| import { i18n } from '@/i18n'; | import { i18n } from '@/i18n'; | ||||||
|  | import { instance } from '@/instance'; | ||||||
|  | import { host } from '@/config'; | ||||||
| 
 | 
 | ||||||
| const iconOnly = ref(false); | const iconOnly = ref(false); | ||||||
| 
 | 
 | ||||||
|  | @ -78,6 +91,30 @@ function openAccountMenu(ev: MouseEvent) { | ||||||
| 	}, ev); | 	}, ev); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | function openInstanceMenu(ev: MouseEvent) { | ||||||
|  | 	os.popupMenu([{ | ||||||
|  | 		text: instance.name ?? host, | ||||||
|  | 		type: 'label', | ||||||
|  | 	}, { | ||||||
|  | 		type: 'link', | ||||||
|  | 		text: i18n.ts.instanceInfo, | ||||||
|  | 		icon: 'fas fa-info-circle', | ||||||
|  | 		to: '/about', | ||||||
|  | 	}, { | ||||||
|  | 		type: 'link', | ||||||
|  | 		text: i18n.ts.customEmojis, | ||||||
|  | 		icon: 'fas fa-laugh', | ||||||
|  | 		to: '/about#emojis', | ||||||
|  | 	}, { | ||||||
|  | 		type: 'link', | ||||||
|  | 		text: i18n.ts.federation, | ||||||
|  | 		icon: 'fas fa-globe', | ||||||
|  | 		to: '/about#federation', | ||||||
|  | 	}], ev.currentTarget ?? ev.target, { | ||||||
|  | 		align: 'left', | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| function more(ev: MouseEvent) { | function more(ev: MouseEvent) { | ||||||
| 	os.popup(defineAsyncComponent(() => import('@/components/launch-pad.vue')), { | 	os.popup(defineAsyncComponent(() => import('@/components/launch-pad.vue')), { | ||||||
| 		src: ev.currentTarget ?? ev.target, | 		src: ev.currentTarget ?? ev.target, | ||||||
|  | @ -88,11 +125,8 @@ function more(ev: MouseEvent) { | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" scoped> | ||||||
| .mvcprjjd { | .mvcprjjd { | ||||||
| 	$ui-font-size: 1em; // TODO: どこかに集約したい |  | ||||||
| 	$nav-width: 250px; | 	$nav-width: 250px; | ||||||
| 	$nav-icon-only-width: 86px; | 	$nav-icon-only-width: 86px; | ||||||
| 	$avatar-size: 32px; |  | ||||||
| 	$avatar-margin: 8px; |  | ||||||
| 
 | 
 | ||||||
| 	flex: 0 0 $nav-width; | 	flex: 0 0 $nav-width; | ||||||
| 	width: $nav-width; | 	width: $nav-width; | ||||||
|  | @ -103,7 +137,7 @@ function more(ev: MouseEvent) { | ||||||
| 		top: 0; | 		top: 0; | ||||||
| 		left: 0; | 		left: 0; | ||||||
| 		z-index: 1001; | 		z-index: 1001; | ||||||
| 		width: $nav-width; | 		width: $nav-icon-only-width; | ||||||
| 		// ほんとは単に 100vh と書きたいところだが... https://css-tricks.com/the-trick-to-viewport-units-on-mobile/ | 		// ほんとは単に 100vh と書きたいところだが... https://css-tricks.com/the-trick-to-viewport-units-on-mobile/ | ||||||
| 		height: calc(var(--vh, 1vh) * 100); | 		height: calc(var(--vh, 1vh) * 100); | ||||||
| 		box-sizing: border-box; | 		box-sizing: border-box; | ||||||
|  | @ -111,6 +145,123 @@ function more(ev: MouseEvent) { | ||||||
| 		overflow-x: clip; | 		overflow-x: clip; | ||||||
| 		background: var(--navBg); | 		background: var(--navBg); | ||||||
| 		contain: strict; | 		contain: strict; | ||||||
|  | 		display: flex; | ||||||
|  | 		flex-direction: column; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	&:not(.iconOnly) { | ||||||
|  | 		> .body { | ||||||
|  | 			width: $nav-width; | ||||||
|  | 
 | ||||||
|  | 			> .top { | ||||||
|  | 				position: sticky; | ||||||
|  | 				top: 0; | ||||||
|  | 				z-index: 1; | ||||||
|  | 				padding: 20px 0; | ||||||
|  | 				background: var(--X14); | ||||||
|  | 				-webkit-backdrop-filter: var(--blur, blur(8px)); | ||||||
|  | 				backdrop-filter: var(--blur, blur(8px)); | ||||||
|  | 
 | ||||||
|  | 				> .banner { | ||||||
|  | 					position: absolute; | ||||||
|  | 					top: 0; | ||||||
|  | 					left: 0; | ||||||
|  | 					width: 100%; | ||||||
|  | 					height: 100%; | ||||||
|  | 					background-size: cover; | ||||||
|  | 					background-position: center center; | ||||||
|  | 					-webkit-mask-image: linear-gradient(0deg, rgba(0,0,0,0) 15%, rgba(0,0,0,0.75) 100%); | ||||||
|  | 					mask-image: linear-gradient(0deg, rgba(0,0,0,0) 15%, rgba(0,0,0,0.75) 100%); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				> .instance { | ||||||
|  | 					position: relative; | ||||||
|  | 					display: block; | ||||||
|  | 					text-align: center; | ||||||
|  | 					width: 100%; | ||||||
|  | 
 | ||||||
|  | 					> .icon { | ||||||
|  | 						display: inline-block; | ||||||
|  | 						width: 38px; | ||||||
|  | 						aspect-ratio: 1; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			> .bottom { | ||||||
|  | 				position: sticky; | ||||||
|  | 				bottom: 0; | ||||||
|  | 				padding: 20px 0; | ||||||
|  | 				background: var(--X14); | ||||||
|  | 				-webkit-backdrop-filter: var(--blur, blur(8px)); | ||||||
|  | 				backdrop-filter: var(--blur, blur(8px)); | ||||||
|  | 
 | ||||||
|  | 				> .post { | ||||||
|  | 					position: relative; | ||||||
|  | 					display: block; | ||||||
|  | 					width: 100%; | ||||||
|  | 					height: 40px; | ||||||
|  | 					color: var(--fgOnAccent); | ||||||
|  | 					font-weight: bold; | ||||||
|  | 					text-align: left; | ||||||
|  | 
 | ||||||
|  | 					&:before { | ||||||
|  | 						content: ""; | ||||||
|  | 						display: block; | ||||||
|  | 						width: calc(100% - 38px); | ||||||
|  | 						height: 100%; | ||||||
|  | 						margin: auto; | ||||||
|  | 						position: absolute; | ||||||
|  | 						top: 0; | ||||||
|  | 						left: 0; | ||||||
|  | 						right: 0; | ||||||
|  | 						bottom: 0; | ||||||
|  | 						border-radius: 999px; | ||||||
|  | 						background: linear-gradient(90deg, var(--buttonGradateA), var(--buttonGradateB)); | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					&:hover, &.active { | ||||||
|  | 						&:before { | ||||||
|  | 							background: var(--accentLighten); | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					> .icon { | ||||||
|  | 						position: relative; | ||||||
|  | 						margin-left: 30px; | ||||||
|  | 						margin-right: 8px; | ||||||
|  | 						width: 32px; | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					> .text { | ||||||
|  | 						position: relative; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				> .account { | ||||||
|  | 					position: relative; | ||||||
|  | 					display: flex; | ||||||
|  | 					align-items: center; | ||||||
|  | 					padding-left: 30px; | ||||||
|  | 					text-overflow: ellipsis; | ||||||
|  | 					overflow: hidden; | ||||||
|  | 					white-space: nowrap; | ||||||
|  | 					width: 100%; | ||||||
|  | 					text-align: left; | ||||||
|  | 					box-sizing: border-box; | ||||||
|  | 					margin-top: 16px; | ||||||
|  | 
 | ||||||
|  | 					> .avatar { | ||||||
|  | 						position: relative; | ||||||
|  | 						width: 32px; | ||||||
|  | 						aspect-ratio: 1; | ||||||
|  | 						margin-right: 8px; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			> .middle { | ||||||
|  | 				flex: 1; | ||||||
| 
 | 
 | ||||||
| 				> .divider { | 				> .divider { | ||||||
| 					margin: 16px 16px; | 					margin: 16px 16px; | ||||||
|  | @ -120,8 +271,7 @@ function more(ev: MouseEvent) { | ||||||
| 				> .item { | 				> .item { | ||||||
| 					position: relative; | 					position: relative; | ||||||
| 					display: block; | 					display: block; | ||||||
| 			padding-left: 24px; | 					padding-left: 30px; | ||||||
| 			font-size: $ui-font-size; |  | ||||||
| 					line-height: 2.85rem; | 					line-height: 2.85rem; | ||||||
| 					text-overflow: ellipsis; | 					text-overflow: ellipsis; | ||||||
| 					overflow: hidden; | 					overflow: hidden; | ||||||
|  | @ -134,17 +284,7 @@ function more(ev: MouseEvent) { | ||||||
| 					> .icon { | 					> .icon { | ||||||
| 						position: relative; | 						position: relative; | ||||||
| 						width: 32px; | 						width: 32px; | ||||||
| 			} | 						margin-right: 8px; | ||||||
| 
 |  | ||||||
| 			> .icon, |  | ||||||
| 			> .avatar { |  | ||||||
| 				margin-right: $avatar-margin; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			> .avatar { |  | ||||||
| 				width: $avatar-size; |  | ||||||
| 				height: $avatar-size; |  | ||||||
| 				vertical-align: middle; |  | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					> .indicator { | 					> .indicator { | ||||||
|  | @ -176,7 +316,7 @@ function more(ev: MouseEvent) { | ||||||
| 						&:before { | 						&:before { | ||||||
| 							content: ""; | 							content: ""; | ||||||
| 							display: block; | 							display: block; | ||||||
| 					width: calc(100% - 24px); | 							width: calc(100% - 34px); | ||||||
| 							height: 100%; | 							height: 100%; | ||||||
| 							margin: auto; | 							margin: auto; | ||||||
| 							position: absolute; | 							position: absolute; | ||||||
|  | @ -188,50 +328,6 @@ function more(ev: MouseEvent) { | ||||||
| 							background: var(--accentedBg); | 							background: var(--accentedBg); | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 
 |  | ||||||
| 			&:first-child, &:last-child { |  | ||||||
| 				position: sticky; |  | ||||||
| 				z-index: 1; |  | ||||||
| 				padding-top: 8px; |  | ||||||
| 				padding-bottom: 8px; |  | ||||||
| 				background: var(--X14); |  | ||||||
| 				-webkit-backdrop-filter: var(--blur, blur(8px)); |  | ||||||
| 				backdrop-filter: var(--blur, blur(8px)); |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			&:first-child { |  | ||||||
| 				top: 0; |  | ||||||
| 
 |  | ||||||
| 				&:hover, &.active { |  | ||||||
| 					&:before { |  | ||||||
| 						content: none; |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			&:last-child { |  | ||||||
| 				bottom: 0; |  | ||||||
| 				color: var(--fgOnAccent); |  | ||||||
| 
 |  | ||||||
| 				&:before { |  | ||||||
| 					content: ""; |  | ||||||
| 					display: block; |  | ||||||
| 					width: calc(100% - 20px); |  | ||||||
| 					height: calc(100% - 20px); |  | ||||||
| 					margin: auto; |  | ||||||
| 					position: absolute; |  | ||||||
| 					top: 0; |  | ||||||
| 					left: 0; |  | ||||||
| 					right: 0; |  | ||||||
| 					bottom: 0; |  | ||||||
| 					border-radius: 999px; |  | ||||||
| 					background: linear-gradient(90deg, var(--buttonGradateA), var(--buttonGradateB)); |  | ||||||
| 				} |  | ||||||
| 				 |  | ||||||
| 				&:hover, &.active { |  | ||||||
| 					&:before { |  | ||||||
| 						background: var(--accentLighten); |  | ||||||
| 					} |  | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | @ -244,26 +340,111 @@ function more(ev: MouseEvent) { | ||||||
| 		> .body { | 		> .body { | ||||||
| 			width: $nav-icon-only-width; | 			width: $nav-icon-only-width; | ||||||
| 
 | 
 | ||||||
| 			> .divider { | 			> .top { | ||||||
| 				margin: 8px auto; | 				position: sticky; | ||||||
| 				width: calc(100% - 32px); | 				top: 0; | ||||||
|  | 				z-index: 1; | ||||||
|  | 				padding: 20px 0; | ||||||
|  | 				background: var(--X14); | ||||||
|  | 				-webkit-backdrop-filter: var(--blur, blur(8px)); | ||||||
|  | 				backdrop-filter: var(--blur, blur(8px)); | ||||||
|  | 
 | ||||||
|  | 				> .instance { | ||||||
|  | 					display: block; | ||||||
|  | 					text-align: center; | ||||||
|  | 					width: 100%; | ||||||
|  | 
 | ||||||
|  | 					> .icon { | ||||||
|  | 						display: inline-block; | ||||||
|  | 						width: 38px; | ||||||
|  | 						aspect-ratio: 1; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			> .item { | 			> .bottom { | ||||||
| 				padding-left: 0; | 				position: sticky; | ||||||
| 				padding: 18px 0; | 				bottom: 0; | ||||||
| 				width: 100%; | 				padding: 20px 0; | ||||||
| 				text-align: center; | 				background: var(--X14); | ||||||
| 				font-size: $ui-font-size; | 				-webkit-backdrop-filter: var(--blur, blur(8px)); | ||||||
| 				line-height: initial; | 				backdrop-filter: var(--blur, blur(8px)); | ||||||
| 
 | 
 | ||||||
| 				> .icon, | 				> .post { | ||||||
| 				> .avatar { |  | ||||||
| 					display: block; | 					display: block; | ||||||
| 					margin: 0 auto; | 					position: relative; | ||||||
|  | 					width: 100%; | ||||||
|  | 					height: 52px; | ||||||
|  | 					margin-bottom: 16px; | ||||||
|  | 					text-align: center; | ||||||
|  | 
 | ||||||
|  | 					&:before { | ||||||
|  | 						content: ""; | ||||||
|  | 						display: block; | ||||||
|  | 						position: absolute; | ||||||
|  | 						top: 0; | ||||||
|  | 						left: 0; | ||||||
|  | 						right: 0; | ||||||
|  | 						bottom: 0; | ||||||
|  | 						margin: auto; | ||||||
|  | 						width: 52px; | ||||||
|  | 						aspect-ratio: 1/1; | ||||||
|  | 						border-radius: 100%; | ||||||
|  | 						background: linear-gradient(90deg, var(--buttonGradateA), var(--buttonGradateB)); | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					&:hover, &.active { | ||||||
|  | 						&:before { | ||||||
|  | 							background: var(--accentLighten); | ||||||
|  | 						} | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					> .icon { | 					> .icon { | ||||||
|  | 						position: relative; | ||||||
|  | 						color: var(--fgOnAccent); | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					> .text { | ||||||
|  | 						display: none; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				> .account { | ||||||
|  | 					display: block; | ||||||
|  | 					text-align: center; | ||||||
|  | 					width: 100%; | ||||||
|  | 
 | ||||||
|  | 					> .avatar { | ||||||
|  | 						display: inline-block; | ||||||
|  | 						width: 38px; | ||||||
|  | 						aspect-ratio: 1; | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					> .text { | ||||||
|  | 						display: none; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			> .middle { | ||||||
|  | 				flex: 1; | ||||||
|  | 
 | ||||||
|  | 				> .divider { | ||||||
|  | 					margin: 8px auto; | ||||||
|  | 					width: calc(100% - 32px); | ||||||
|  | 					border-top: solid 0.5px var(--divider); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				> .item { | ||||||
|  | 					display: block; | ||||||
|  | 					position: relative; | ||||||
|  | 					padding: 18px 0; | ||||||
|  | 					width: 100%; | ||||||
|  | 					text-align: center; | ||||||
|  | 
 | ||||||
|  | 					> .icon { | ||||||
|  | 						display: block; | ||||||
|  | 						margin: 0 auto; | ||||||
| 						opacity: 0.7; | 						opacity: 0.7; | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
|  | @ -271,40 +452,38 @@ function more(ev: MouseEvent) { | ||||||
| 						display: none; | 						display: none; | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
|  | 					> .indicator { | ||||||
|  | 						position: absolute; | ||||||
|  | 						top: 6px; | ||||||
|  | 						left: 24px; | ||||||
|  | 						color: var(--navIndicator); | ||||||
|  | 						font-size: 8px; | ||||||
|  | 						animation: blink 1s infinite; | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
| 					&:hover, &.active { | 					&:hover, &.active { | ||||||
|  | 						text-decoration: none; | ||||||
|  | 						color: var(--accent); | ||||||
|  | 
 | ||||||
|  | 						&:before { | ||||||
|  | 							content: ""; | ||||||
|  | 							display: block; | ||||||
|  | 							height: 100%; | ||||||
|  | 							aspect-ratio: 1; | ||||||
|  | 							margin: auto; | ||||||
|  | 							position: absolute; | ||||||
|  | 							top: 0; | ||||||
|  | 							left: 0; | ||||||
|  | 							right: 0; | ||||||
|  | 							bottom: 0; | ||||||
|  | 							border-radius: 999px; | ||||||
|  | 							background: var(--accentedBg); | ||||||
|  | 						} | ||||||
|  | 
 | ||||||
| 						> .icon, > .text { | 						> .icon, > .text { | ||||||
| 							opacity: 1; | 							opacity: 1; | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 
 |  | ||||||
| 				&:first-child { |  | ||||||
| 					margin-bottom: 8px; |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				&:last-child { |  | ||||||
| 					margin-top: 8px; |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				&:before { |  | ||||||
| 					width: min-content; |  | ||||||
| 					height: 100%; |  | ||||||
| 					aspect-ratio: 1/1; |  | ||||||
| 					border-radius: 8px; |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				&.post { |  | ||||||
| 					height: $nav-icon-only-width; |  | ||||||
| 
 |  | ||||||
| 					> .icon { |  | ||||||
| 						opacity: 1; |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				&.post:before { |  | ||||||
| 					width: calc(100% - 28px); |  | ||||||
| 					height: auto; |  | ||||||
| 					aspect-ratio: 1/1; |  | ||||||
| 					border-radius: 100%; |  | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -359,9 +359,10 @@ function moveFocus(id: string, direction: 'up' | 'down' | 'left' | 'right') { | ||||||
| 		height: calc(var(--vh, 1vh) * 100); | 		height: calc(var(--vh, 1vh) * 100); | ||||||
| 		width: 240px; | 		width: 240px; | ||||||
| 		box-sizing: border-box; | 		box-sizing: border-box; | ||||||
|  | 		contain: strict; | ||||||
| 		overflow: auto; | 		overflow: auto; | ||||||
| 		overscroll-behavior: contain; | 		overscroll-behavior: contain; | ||||||
| 		background: var(--bg); | 		background: var(--navBg); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  |  | ||||||
|  | @ -365,11 +365,11 @@ const wallpaper = localStorage.getItem('wallpaper') != null; | ||||||
| 		height: calc(var(--vh, 1vh) * 100); | 		height: calc(var(--vh, 1vh) * 100); | ||||||
| 		width: 240px; | 		width: 240px; | ||||||
| 		box-sizing: border-box; | 		box-sizing: border-box; | ||||||
|  | 		contain: strict; | ||||||
| 		overflow: auto; | 		overflow: auto; | ||||||
| 		overscroll-behavior: contain; | 		overscroll-behavior: contain; | ||||||
| 		background: var(--bg); | 		background: var(--navBg); | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue