mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-10-31 13:34:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			127 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <!--
 | |
| SPDX-FileCopyrightText: syuilo and misskey-project
 | |
| SPDX-License-Identifier: AGPL-3.0-only
 | |
| -->
 | |
| 
 | |
| <template>
 | |
| <header :class="$style.root">
 | |
| 	<component :is="defaultStore.state.enableCondensedLine ? 'MkCondensedLine' : 'div'" :minScale="0.5" style="min-width: 0;">
 | |
| 		<div style="display: flex; white-space: nowrap; align-items: baseline;">
 | |
| 			<div v-if="mock" :class="$style.name">
 | |
| 				<MkUserName :user="note.user"/>
 | |
| 			</div>
 | |
| 			<MkA v-else v-user-preview="note.user.id" :class="$style.name" :to="userPage(note.user)">
 | |
| 				<MkUserName :user="note.user"/>
 | |
| 			</MkA>
 | |
| 			<div v-if="note.user.isBot" :class="$style.isBot">bot</div>
 | |
| 			<div :class="$style.username"><MkAcct :user="note.user"/></div>
 | |
| 		</div>
 | |
| 	</component>
 | |
| 	<div v-if="note.user.badgeRoles" :class="$style.badgeRoles">
 | |
| 		<img v-for="(role, i) in note.user.badgeRoles" :key="i" v-tooltip="role.name" :class="$style.badgeRole" :src="role.iconUrl!"/>
 | |
| 	</div>
 | |
| 	<div :class="$style.info">
 | |
| 		<div v-if="mock">
 | |
| 			<MkTime :time="note.createdAt" colored/>
 | |
| 		</div>
 | |
| 		<MkA v-else :to="notePage(note)">
 | |
| 			<MkTime :time="note.createdAt" colored/>
 | |
| 		</MkA>
 | |
| 		<span v-if="note.visibility !== 'public'" style="margin-left: 0.5em;" :title="i18n.ts._visibility[note.visibility]">
 | |
| 			<i v-if="note.visibility === 'home'" class="ti ti-home"></i>
 | |
| 			<i v-else-if="note.visibility === 'followers'" class="ti ti-lock"></i>
 | |
| 			<i v-else-if="note.visibility === 'specified'" ref="specified" class="ti ti-mail"></i>
 | |
| 		</span>
 | |
| 		<span v-if="note.updatedAt" ref="menuVersionsButton" style="margin-left: 0.5em; cursor: pointer;" title="Edited" @mousedown="menuVersions()"><i class="ph-pencil-simple ph-bold ph-lg"></i></span>
 | |
| 		<span v-if="note.localOnly" style="margin-left: 0.5em;" :title="i18n.ts._visibility['disableFederation']"><i class="ti ti-rocket-off"></i></span>
 | |
| 		<span v-if="note.channel" style="margin-left: 0.5em;" :title="note.channel.name"><i class="ti ti-device-tv"></i></span>
 | |
| 	</div>
 | |
| </header>
 | |
| </template>
 | |
| 
 | |
| <script lang="ts" setup>
 | |
| import { inject, shallowRef } from 'vue';
 | |
| import * as Misskey from 'misskey-js';
 | |
| import { i18n } from '@/i18n.js';
 | |
| import { notePage } from '@/filters/note.js';
 | |
| import { userPage } from '@/filters/user.js';
 | |
| import { getNoteVersionsMenu } from '@/scripts/get-note-versions-menu.js';
 | |
| import { popupMenu } from '@/os.js';
 | |
| import { defaultStore } from '@/store.js';
 | |
| 
 | |
| const props = defineProps<{
 | |
| 	note: Misskey.entities.Note;
 | |
| }>();
 | |
| 
 | |
| const menuVersionsButton = shallowRef<HTMLElement>();
 | |
| 
 | |
| async function menuVersions(viaKeyboard = false): Promise<void> {
 | |
| 	const { menu, cleanup } = await getNoteVersionsMenu({ note: props.note, menuVersionsButton });
 | |
| 	popupMenu(menu, menuVersionsButton.value, {
 | |
| 		viaKeyboard,
 | |
| 	}).then(focus).finally(cleanup);
 | |
| }
 | |
| 
 | |
| const mock = inject<boolean>('mock', false);
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" module>
 | |
| .root {
 | |
| 	display: flex;
 | |
| 	align-items: baseline;
 | |
| 	white-space: nowrap;
 | |
| 	cursor: auto; /* not clickToOpen-able */
 | |
| }
 | |
| 
 | |
| .name {
 | |
| 	flex-shrink: 1;
 | |
| 	display: block;
 | |
| 	margin: 0 .5em 0 0;
 | |
| 	padding: 0;
 | |
| 	overflow: hidden;
 | |
| 	font-size: 1em;
 | |
| 	font-weight: bold;
 | |
| 	text-decoration: none;
 | |
| 	text-overflow: ellipsis;
 | |
| 
 | |
| 	&:hover {
 | |
| 		text-decoration: underline;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| .isBot {
 | |
| 	flex-shrink: 0;
 | |
| 	align-self: center;
 | |
| 	margin: 0 .5em 0 0;
 | |
| 	padding: 1px 6px;
 | |
| 	font-size: 80%;
 | |
| 	border: solid 0.5px var(--divider);
 | |
| 	border-radius: var(--radius-xs);
 | |
| }
 | |
| 
 | |
| .username {
 | |
| 	flex-shrink: 9999999;
 | |
| 	margin: 0 .5em 0 0;
 | |
| 	overflow: hidden;
 | |
| 	text-overflow: ellipsis;
 | |
| }
 | |
| 
 | |
| .info {
 | |
| 	flex-shrink: 0;
 | |
| 	margin-left: auto;
 | |
| 	font-size: 0.9em;
 | |
| }
 | |
| 
 | |
| .badgeRoles {
 | |
| 	margin: 0 .5em 0 0;
 | |
| }
 | |
| 
 | |
| .badgeRole {
 | |
| 	height: 1.3em;
 | |
| 	vertical-align: -20%;
 | |
| 
 | |
| 	& + .badgeRole {
 | |
| 		margin-left: 0.2em;
 | |
| 	}
 | |
| }
 | |
| </style>
 |