mirror of
https://git.joinsharkey.org/Sharkey/Sharkey.git
synced 2024-11-23 23:53:09 +02:00
🎨
This commit is contained in:
parent
676f026085
commit
63f7941073
2 changed files with 129 additions and 37 deletions
|
@ -23,28 +23,43 @@
|
||||||
<div>
|
<div>
|
||||||
<a @click="drive">%fa:cloud%</a>
|
<a @click="drive">%fa:cloud%</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div ref="notificationsButton" :class="{ active: showNotifications }" style="z-index:1;">
|
||||||
<router-link to="/i/favorites">%fa:star%</router-link>
|
<a @click="notifications">%fa:R bell%</a>
|
||||||
</div>
|
|
||||||
<div v-if="($store.state.i.isLocked || $store.state.i.carefulBot)">
|
|
||||||
<a @click="followRequests">%fa:envelope R%<i v-if="$store.state.i.pendingReceivedFollowRequestsCount">{{ $store.state.i.pendingReceivedFollowRequestsCount }}</i></a>
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a @click="settings">%fa:cog%</a>
|
<a @click="settings">%fa:cog%</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<a @click="dark"><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template></a>
|
|
||||||
</div>
|
|
||||||
<div class="signout">
|
|
||||||
<a @click="signout">%fa:power-off%</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="account">
|
<div class="account">
|
||||||
<router-link :to="`/@${ $store.state.i.username }`">
|
<router-link :to="`/@${ $store.state.i.username }`">
|
||||||
<mk-avatar class="avatar" :user="$store.state.i"/>
|
<mk-avatar class="avatar" :user="$store.state.i"/>
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
||||||
|
<div class="nav menu">
|
||||||
|
<div class="signout">
|
||||||
|
<a @click="signout">%fa:power-off%</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div>
|
||||||
|
<router-link to="/i/favorites">%fa:star%</router-link>
|
||||||
|
</div>
|
||||||
|
<div v-if="($store.state.i.isLocked || $store.state.i.carefulBot)">
|
||||||
|
<a @click="followRequests">%fa:envelope R%<i v-if="$store.state.i.pendingReceivedFollowRequestsCount">{{ $store.state.i.pendingReceivedFollowRequestsCount }}</i></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="nav dark">
|
||||||
|
<div>
|
||||||
|
<a @click="dark"><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<transition name="slide">
|
||||||
|
<div class="notifications" v-if="showNotifications" ref="notifications">
|
||||||
|
<mk-notifications/>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -56,12 +71,14 @@ import MkSettingsWindow from './settings-window.vue';
|
||||||
import MkDriveWindow from './drive-window.vue';
|
import MkDriveWindow from './drive-window.vue';
|
||||||
import MkMessagingWindow from './messaging-window.vue';
|
import MkMessagingWindow from './messaging-window.vue';
|
||||||
import MkGameWindow from './game-window.vue';
|
import MkGameWindow from './game-window.vue';
|
||||||
|
import contains from '../../../common/scripts/contains';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
hasGameInvitations: false,
|
hasGameInvitations: false,
|
||||||
connection: null
|
connection: null,
|
||||||
|
showNotifications: false
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -130,6 +147,37 @@ export default Vue.extend({
|
||||||
(this as any).os.signout();
|
(this as any).os.signout();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
notifications() {
|
||||||
|
this.showNotifications ? this.closeNotifications() : this.openNotifications();
|
||||||
|
},
|
||||||
|
|
||||||
|
openNotifications() {
|
||||||
|
this.showNotifications = true;
|
||||||
|
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||||
|
el.addEventListener('mousedown', this.onMousedown);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
closeNotifications() {
|
||||||
|
this.showNotifications = false;
|
||||||
|
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||||
|
el.removeEventListener('mousedown', this.onMousedown);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
onMousedown(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
if (
|
||||||
|
!contains(this.$refs.notifications, e.target) &&
|
||||||
|
this.$refs.notifications != e.target &&
|
||||||
|
!contains(this.$refs.notificationsButton, e.target) &&
|
||||||
|
this.$refs.notificationsButton != e.target
|
||||||
|
) {
|
||||||
|
this.closeNotifications();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
dark() {
|
dark() {
|
||||||
this.$store.commit('device/set', {
|
this.$store.commit('device/set', {
|
||||||
key: 'darkmode',
|
key: 'darkmode',
|
||||||
|
@ -157,7 +205,7 @@ export default Vue.extend({
|
||||||
width $width
|
width $width
|
||||||
height 100%
|
height 100%
|
||||||
background var(--desktopHeaderBg)
|
background var(--desktopHeaderBg)
|
||||||
box-shadow var(--shadow)
|
box-shadow var(--shadowRight)
|
||||||
|
|
||||||
&.left
|
&.left
|
||||||
left 0
|
left 0
|
||||||
|
@ -165,28 +213,6 @@ export default Vue.extend({
|
||||||
&.right
|
&.right
|
||||||
right 0
|
right 0
|
||||||
|
|
||||||
> .nav
|
|
||||||
> *
|
|
||||||
&.active
|
|
||||||
box-shadow -4px 0 var(--primary) inset
|
|
||||||
|
|
||||||
> *
|
|
||||||
display block
|
|
||||||
width $width
|
|
||||||
line-height 52px
|
|
||||||
text-align center
|
|
||||||
font-size 18px
|
|
||||||
color var(--desktopHeaderFg)
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
color var(--desktopHeaderHoverFg)
|
|
||||||
text-decoration none
|
|
||||||
|
|
||||||
> .nav.bottom
|
|
||||||
position absolute
|
|
||||||
bottom 64px
|
|
||||||
left 0
|
|
||||||
|
|
||||||
> .post
|
> .post
|
||||||
width $width
|
width $width
|
||||||
height $width
|
height $width
|
||||||
|
@ -219,15 +245,52 @@ export default Vue.extend({
|
||||||
background var(--primaryDarken10) !important
|
background var(--primaryDarken10) !important
|
||||||
transition background 0s ease
|
transition background 0s ease
|
||||||
|
|
||||||
|
.nav
|
||||||
|
> *
|
||||||
|
&.active
|
||||||
|
box-shadow -4px 0 var(--primary) inset
|
||||||
|
|
||||||
|
> *
|
||||||
|
display block
|
||||||
|
width $width
|
||||||
|
line-height 52px
|
||||||
|
text-align center
|
||||||
|
font-size 18px
|
||||||
|
color var(--desktopHeaderFg)
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
background rgba(0, 0, 0, 0.05)
|
||||||
|
color var(--desktopHeaderHoverFg)
|
||||||
|
text-decoration none
|
||||||
|
|
||||||
|
&:active
|
||||||
|
background rgba(0, 0, 0, 0.1)
|
||||||
|
|
||||||
|
> .nav.bottom
|
||||||
|
position absolute
|
||||||
|
bottom 128px
|
||||||
|
left 0
|
||||||
|
|
||||||
> .account
|
> .account
|
||||||
position absolute
|
position absolute
|
||||||
bottom 0
|
bottom 64px
|
||||||
left 0
|
left 0
|
||||||
width $width
|
width $width
|
||||||
height $width
|
height $width
|
||||||
padding 14px
|
padding 14px
|
||||||
|
|
||||||
> *
|
> .menu
|
||||||
|
display none
|
||||||
|
position absolute
|
||||||
|
bottom 64px
|
||||||
|
left 0
|
||||||
|
background var(--desktopHeaderBg)
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
> .menu
|
||||||
|
display block
|
||||||
|
|
||||||
|
> *:not(.menu)
|
||||||
display block
|
display block
|
||||||
width 100%
|
width 100%
|
||||||
height 100%
|
height 100%
|
||||||
|
@ -237,4 +300,30 @@ export default Vue.extend({
|
||||||
width 100%
|
width 100%
|
||||||
height 100%
|
height 100%
|
||||||
|
|
||||||
|
> .dark
|
||||||
|
position absolute
|
||||||
|
bottom 0
|
||||||
|
left 0
|
||||||
|
width $width
|
||||||
|
height $width
|
||||||
|
|
||||||
|
> .notifications
|
||||||
|
position fixed
|
||||||
|
top 0
|
||||||
|
left $width
|
||||||
|
width 350px
|
||||||
|
height 100%
|
||||||
|
overflow auto
|
||||||
|
background var(--face)
|
||||||
|
box-shadow var(--shadowRight)
|
||||||
|
|
||||||
|
.slide-enter-active,
|
||||||
|
.slide-leave-active {
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-enter, .slide-leave-to {
|
||||||
|
transform: translateX(-16px);
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -124,11 +124,14 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API)
|
||||||
|
|
||||||
//#region shadow
|
//#region shadow
|
||||||
const shadow = '0 3px 8px rgba(0, 0, 0, 0.2)';
|
const shadow = '0 3px 8px rgba(0, 0, 0, 0.2)';
|
||||||
|
const shadowRight = '4px 0 4px rgba(0, 0, 0, 0.1)';
|
||||||
if (os.store.state.settings.useShadow) document.documentElement.style.setProperty('--shadow', shadow);
|
if (os.store.state.settings.useShadow) document.documentElement.style.setProperty('--shadow', shadow);
|
||||||
|
if (os.store.state.settings.useShadow) document.documentElement.style.setProperty('--shadowRight', shadowRight);
|
||||||
os.store.watch(s => {
|
os.store.watch(s => {
|
||||||
return s.settings.useShadow;
|
return s.settings.useShadow;
|
||||||
}, v => {
|
}, v => {
|
||||||
document.documentElement.style.setProperty('--shadow', v ? shadow : 'none');
|
document.documentElement.style.setProperty('--shadow', v ? shadow : 'none');
|
||||||
|
document.documentElement.style.setProperty('--shadowRight', v ? shadowRight : 'none');
|
||||||
});
|
});
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue