misskey-awawa/packages/frontend/src/ui/classic.header.vue

250 lines
5.5 KiB
Vue
Raw Normal View History

2021-07-19 02:36:35 +00:00
<template>
<div class="azykntjl">
<div class="body">
<div class="left">
2022-12-28 05:44:53 +00:00
<button v-click-anime class="item _button instance" @click="openInstanceMenu">
2023-04-01 04:46:04 +00:00
<img :src="instance.iconUrl ?? instance.faviconUrl ?? '/favicon.ico'" class="_ghost"/>
2022-12-28 05:44:53 +00:00
</button>
2023-04-01 05:01:57 +00:00
<MkA v-click-anime v-tooltip="i18n.ts.timeline" class="item index" active-class="active" to="/" exact>
<i class="ti ti-home ti-fw"></i>
2021-07-19 02:36:35 +00:00
</MkA>
<template v-for="item in menu">
<div v-if="item === '-'" class="divider"></div>
<component :is="navbarItemDef[item].to ? 'MkA' : 'button'" v-else-if="navbarItemDef[item] && (navbarItemDef[item].show !== false)" v-click-anime v-tooltip="navbarItemDef[item].title" class="item _button" :class="item" active-class="active" :to="navbarItemDef[item].to" v-on="navbarItemDef[item].action ? { click: navbarItemDef[item].action } : {}">
<i class="ti-fw" :class="navbarItemDef[item].icon"></i>
<span v-if="navbarItemDef[item].indicated" class="indicator"><i class="_indicatorCircle"></i></span>
2021-07-19 02:36:35 +00:00
</component>
</template>
<div class="divider"></div>
2023-04-01 05:01:57 +00:00
<MkA v-if="$i.isAdmin || $i.isModerator" v-click-anime v-tooltip="i18n.ts.controlPanel" class="item" active-class="active" to="/admin" :behavior="settingsWindowed ? 'modalWindow' : null">
<i class="ti ti-dashboard ti-fw"></i>
2021-07-19 02:36:35 +00:00
</MkA>
2021-11-19 10:36:12 +00:00
<button v-click-anime class="item _button" @click="more">
<i class="ti ti-dots ti-fw"></i>
<span v-if="otherNavItemIndicated" class="indicator"><i class="_indicatorCircle"></i></span>
2021-07-19 02:36:35 +00:00
</button>
</div>
<div class="right">
2023-04-01 05:01:57 +00:00
<MkA v-click-anime v-tooltip="i18n.ts.settings" class="item" active-class="active" to="/settings" :behavior="settingsWindowed ? 'modalWindow' : null">
<i class="ti ti-settings ti-fw"></i>
2021-07-19 02:36:35 +00:00
</MkA>
2021-11-19 10:36:12 +00:00
<button v-click-anime class="item _button account" @click="openAccountMenu">
2023-01-16 05:18:11 +00:00
<MkAvatar :user="$i" class="avatar"/><MkAcct class="acct" :user="$i"/>
2021-07-19 02:36:35 +00:00
</button>
<div class="post" @click="post">
2021-10-16 10:38:51 +00:00
<MkButton class="button" gradate full rounded>
<i class="ti ti-pencil ti-fw"></i>
2021-07-19 02:36:35 +00:00
</MkButton>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
refactor: use Vite to build instead of webpack (#8575) * update stream.ts * https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 * fix lint * clean up? * add app * fix * nanka iroiro * wip * wip * fix lint * fix loginId * fix * refactor * refactor * remove follow action * clean up * Revert "remove follow action" This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. * Revert "clean up" This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. * remove fetch specification * renoteの条件追加 * apiFetch => cli * bypass fetch? * fix * refactor: use path alias * temp: add submodule * remove submodule * enhane: unison-reloadに指定したパスに移動できるように * null * null * feat: ログインするアカウントのIDをクエリ文字列で指定する機能 * null * await? * rename * rename * Update read.ts * merge * get-note-summary * fix * swパッケージに * add missing packages * fix getNoteSummary * add webpack-cli * :v: * remove plugins * sw-inject分離したがテストしてない * fix notification.vue * remove a blank line * disconnect intersection observer * disconnect2 * fix notification.vue * remove a blank line * disconnect intersection observer * disconnect2 * fix * :v: * clean up config * typesを戻した * Update packages/client/src/components/notification.vue Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> * disconnect * oops * Failed to load the script unexpectedly回避 sw.jsとlib.tsを分離してみた * truncate notification * Update packages/client/src/ui/_common_/common.vue Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> * clean up * clean up * キャッシュ対策 * Truncate push notification message * クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 * components/drive-file-thumbnail.vue * components/drive-select-dialog.vue * components/drive-window.vue * merge * fix * Service Workerのビルドにesbuildを使うようにする * return createEmptyNotification() * fix * i18n.ts * update * :v: * remove ts-loader * fix * fix * enhance: Service Workerを常に登録するように * pollEnded * URLをsw.jsに戻す * clean up * wip * wip * wip * wip * wip * wip * :v: * use import * fix * install rollup * use defineAsyncComponent. * fix emojilist * wip use defineAsyncComponent * popup(import -> popup(defineAsyncComponent(() => import * draggable? * fix init import * clean up * fix router * add comment * :v: * :v: * :v: * remove webpack * update vite * fix boot sequence * Revert "fix boot sequence" This reverts commit e893dbf37aed83bf9f12e427d98c78a7065b4a39. * revert boot import * never make two app div * ; * remove console.log * change clientEntry sequence * fix * Revert "fix" This reverts commit 12741b3d89950a31dbb1bb81477ddb27b0e9951a. * fix * add comment https://github.com/misskey-dev/misskey/pull/8575#issuecomment-1114239210 * add log * add comment Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2022-05-01 13:51:07 +00:00
import { defineAsyncComponent, defineComponent } from 'vue';
2022-12-28 05:44:53 +00:00
import { openInstanceMenu } from './_common_/common';
2021-11-11 17:02:25 +00:00
import { host } from '@/config';
import * as os from '@/os';
import { navbarItemDef } from '@/navbar';
2023-04-01 04:52:07 +00:00
import { openAccountMenu, $i } from '@/account';
import MkButton from '@/components/MkButton.vue';
import { mainRouter } from '@/router';
2023-04-01 04:42:40 +00:00
import { defaultStore } from '@/store';
2023-04-01 04:46:04 +00:00
import { instance } from '@/instance';
2023-04-01 05:01:57 +00:00
import { i18n } from '@/i18n';
2021-07-19 02:36:35 +00:00
export default defineComponent({
components: {
MkButton,
},
data() {
return {
host: host,
accounts: [],
connection: null,
navbarItemDef: navbarItemDef,
2021-07-19 02:36:35 +00:00
settingsWindowed: false,
2023-04-01 04:42:40 +00:00
defaultStore,
2023-04-01 04:46:04 +00:00
instance,
2023-04-01 04:52:07 +00:00
$i,
2023-04-01 05:01:57 +00:00
i18n,
2021-07-19 02:36:35 +00:00
};
},
computed: {
menu(): string[] {
2023-04-01 04:42:40 +00:00
return defaultStore.state.menu;
2021-07-19 02:36:35 +00:00
},
otherNavItemIndicated(): boolean {
for (const def in this.navbarItemDef) {
2021-07-19 02:36:35 +00:00
if (this.menu.includes(def)) continue;
if (this.navbarItemDef[def].indicated) return true;
2021-07-19 02:36:35 +00:00
}
return false;
},
},
watch: {
2023-04-01 04:42:40 +00:00
'defaultStore.reactiveState.menuDisplay.value'() {
2021-07-19 02:36:35 +00:00
this.calcViewState();
},
},
created() {
window.addEventListener('resize', this.calcViewState);
this.calcViewState();
},
methods: {
2022-12-28 05:44:53 +00:00
openInstanceMenu,
2021-07-19 02:36:35 +00:00
calcViewState() {
this.settingsWindowed = (window.innerWidth > 1400);
},
post() {
os.post();
},
search() {
mainRouter.push('/search');
2021-07-19 02:36:35 +00:00
},
more(ev) {
os.popup(defineAsyncComponent(() => import('@/components/MkLaunchPad.vue')), {
src: ev.currentTarget ?? ev.target,
2022-03-27 07:28:25 +00:00
anchor: { x: 'center', y: 'bottom' },
}, {
2021-07-19 02:36:35 +00:00
}, 'closed');
},
openAccountMenu: (ev) => {
openAccountMenu({
withExtraOperation: true,
}, ev);
},
},
2021-07-19 02:36:35 +00:00
});
</script>
<style lang="scss" scoped>
2021-07-19 02:36:35 +00:00
.azykntjl {
$height: 60px;
$avatar-size: 32px;
$avatar-margin: 8px;
position: sticky;
top: 0;
z-index: 1000;
width: 100%;
height: $height;
background-color: var(--bg);
> .body {
max-width: 1380px;
margin: 0 auto;
display: flex;
> .right,
> .left {
> .item {
position: relative;
font-size: 0.9em;
display: inline-block;
padding: 0 12px;
line-height: $height;
> i,
> .avatar {
margin-right: 0;
}
> i {
left: 10px;
}
> .avatar {
width: $avatar-size;
height: $avatar-size;
vertical-align: middle;
}
> .indicator {
position: absolute;
top: 0;
left: 0;
color: var(--navIndicator);
font-size: 8px;
animation: blink 1s infinite;
}
&:hover {
text-decoration: none;
color: var(--navHoverFg);
}
&.active {
color: var(--navActive);
}
}
> .divider {
display: inline-block;
height: 16px;
margin: 0 10px;
border-right: solid 0.5px var(--divider);
}
2022-12-28 05:44:53 +00:00
> .instance {
display: inline-block;
position: relative;
width: 56px;
height: 100%;
vertical-align: bottom;
> img {
display: inline-block;
width: 24px;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
}
}
2021-07-19 02:36:35 +00:00
> .post {
display: inline-block;
> .button {
width: 40px;
height: 40px;
padding: 0;
min-width: 0;
}
}
> .account {
display: inline-flex;
align-items: center;
vertical-align: top;
margin-right: 8px;
> .acct {
margin-left: 8px;
}
}
}
> .right {
margin-left: auto;
}
}
}
</style>