paricafe/packages/frontend/src/components/MkNoteHeader.vue

159 lines
3.8 KiB
Vue
Raw Normal View History

<!--
SPDX-FileCopyrightText: syuilo and misskey-project
SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<header :class="$style.root">
<div :class="$style.section">
<div style="display: flex;">
<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 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>
2024-09-27 19:52:40 -05:00
</div>
<div :class="$style.username"><MkAcct :user="note.user"/></div>
</div>
<!--<div :class="$style.section">-->
<div :class="$style.info">
<span v-if="note.updatedAt" style="margin-right: 0.5em;" :title="i18n.ts.edited"><i class="ti ti-pencil"></i></span>
<div v-if="mock">
<MkTime :time="note.createdAt" colored/>
</div>
2024-10-16 00:30:39 -05:00
<MkA v-else :to="notePage(note)" @mouseenter="setDetail(true)" @mouseleave="setDetail(false)" :style="{ textDecoration: 'none', userSelect: 'none' }">
2024-10-15 13:17:48 -05:00
<MkTime
:time="isDetail ? note.createdAt : note.createdAt"
:mode="isDetail ? 'detail' : undefined"
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.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>
<!--</div>-->
</header>
</template>
<script lang="ts" setup>
2024-10-15 13:17:48 -05:00
import { inject, ref } from 'vue';
import * as Misskey from 'misskey-js';
2023-09-19 02:37:43 -05:00
import { i18n } from '@/i18n.js';
import { notePage } from '@/filters/note.js';
import { userPage } from '@/filters/user.js';
2024-09-28 00:02:48 -05:00
import { defaultStore } from '@/store.js';
2024-10-15 13:17:48 -05:00
const isDetail = ref(false);
2024-10-16 00:30:39 -05:00
const setDetail = (value) => {
isDetail.value = value;
2024-10-15 13:17:48 -05:00
};
defineProps<{
note: Misskey.entities.Note;
}>();
const mock = inject<boolean>('mock', false);
</script>
2023-01-09 14:17:54 -06:00
<style lang="scss" module>
.root {
display: flex;
align-items: baseline;
white-space: nowrap;
2023-01-09 14:17:54 -06:00
}
.section {
align-items: flex-start;
white-space: nowrap;
flex-direction: column;
overflow: hidden;
&:last-child {
display: flex;
align-items: flex-end;
margin-left: auto;
margin-bottom: auto;
padding-left: 10px;
overflow: clip;
}
}
2023-01-09 14:17:54 -06:00
.name {
flex-shrink: 1;
display: block;
2024-10-15 11:03:17 -05:00
margin: .3em .5em 0 0;
2023-01-09 14:17:54 -06:00
padding: 0;
overflow: hidden;
font-size: 1em;
font-weight: bold;
text-decoration: none;
text-overflow: ellipsis;
2023-01-09 14:17:54 -06:00
&:hover {
2024-10-16 00:30:39 -05:00
text-decoration: none;
opacity: 0.8;
}
2023-01-09 14:17:54 -06:00
}
2023-01-09 14:17:54 -06:00
.isBot {
flex-shrink: 0;
align-self: center;
margin: 0 .5em 0 0;
padding: 1px 6px;
font-size: 80%;
border: solid 0.5px var(--MI_THEME-divider);
2023-01-09 14:17:54 -06:00
border-radius: 3px;
}
2023-01-09 14:17:54 -06:00
.username {
flex-shrink: 9999999;
2024-10-01 02:24:32 -05:00
margin: -.3em .5em .3em 0;
2023-01-09 14:17:54 -06:00
overflow: hidden;
text-overflow: ellipsis;
2024-09-30 13:58:18 -05:00
font-size: 95%;
opacity: 0.8;
&::-webkit-scrollbar {
display: none;
}
2023-01-09 14:17:54 -06:00
}
2023-01-09 14:17:54 -06:00
.info {
flex-shrink: 0;
margin-left: auto;
font-size: 0.9em;
2024-10-16 00:30:39 -05:00
text-decoration: none;
}
.badgeRoles {
margin: 0 .5em 0 0;
}
.badgeRole {
height: 1.3em;
vertical-align: -20%;
& + .badgeRole {
2023-02-10 20:08:50 -06:00
margin-left: 0.2em;
}
}
2024-10-16 00:30:39 -05:00
.no-underline {
text-decoration: none;
}
.no-select {
user-select: none;
}
2024-10-02 07:34:53 -05:00
</style>