dashy/src/components/Settings/KeyboardShortcutInfo.vue

128 lines
3.7 KiB
Vue
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<transition name="slide-fade">
<div class="kb-sc-info" v-if="!shouldHide">
<h5>There are keyboard shortcuts! 🙌</h5>
<div class="close" title="Hide forever [Esc]" @click="hideWelcomeHelper()">x</div>
<p title="Press [Esc] to hide this tip forever. See there's even a shortcut for that! 🚀">
Just start typing to filter. Then use the tab key to cycle through results,
and press enter to launch the selected item, or alt + enter to open in a modal.
You can hit Esc at anytime to clear the search. Easy 🥳
</p>
</div>
</transition>
</template>
<script>
import { localStorageKeys } from '@/utils/defaults';
export default {
name: 'KeyboardShortcutInfo',
data() {
return {
shouldHide: true, // False = show/ true = hide. Intuitive, eh?
};
},
methods: {
/**
* If the session storage item exists, true will be returned
* Otherwise, if not then false is returned.
* Note the !! just converts 'false' to false, as strings resolve to true
*/
shouldHideWelcomeMessage() {
return !!localStorage[localStorageKeys.HIDE_WELCOME_BANNER];
},
/**
* Update session storage, so that it won't be shown again
* Trigger the hide function, and remove the event listerner
*/
hideWelcomeHelper() {
this.shouldHide = true;
localStorage.setItem(localStorageKeys.HIDE_WELCOME_BANNER, true);
window.removeEventListener('keyup');
},
},
/**
* Once mounted, if it's the users first time here, then we wait 3 seconds,
* and show the helpfull little keyboard shortcut dialog.
* Then we listen for the Esc key to be pressed, and hide the dialog.
*/
mounted() {
const shouldHide = this.shouldHideWelcomeMessage();
if (!shouldHide) {
window.setTimeout(() => { this.shouldHide = shouldHide; }, 3000);
window.addEventListener('keyup', (ev) => {
// User pressed the escape key. Trigger permanent dismissal of dialog
if (ev.keyCode === 27) this.hideWelcomeHelper();
});
} else { // Meh, component not needed.
// No point wasting valuable bytes of your 32GB Ram, lets kill it
this.$destroy();
}
},
};
</script>
<style scoped lang="scss">
@import '@/styles/media-queries.scss';
.kb-sc-info {
position: fixed;
width: 30em;
bottom: 0;
right: 10px;
margin: 0.5em;
padding: 0.1em 0.3em;
z-index: 10;
border-radius: 12px;
border: 1px solid var(--welcome-popup-background);
-webkit-box-shadow: 2px 1px 5px #130f23;
box-shadow: 2px 1px 5px #130f23;
border: 1px solid var(--welcome-popup-text-color);
color: var(--welcome-popup-text-color);
background: var(--welcome-popup-background);
cursor: default;
opacity: 0.94;
@include phone {
display: none;
}
h5 { /* The dialog title */
position: absolute;
top: -35px;
left: 20px;
border: 1px solid var(--welcome-popup-text-color);
color: var(--welcome-popup-text-color);
background: var(--welcome-popup-background);
padding: 4px;
border-radius: var(--curve-factor);
}
.close { /* The little exit icon, in top-right */
float: right;
border-radius: 20px;
width: 1em;
padding: 0 0 6px 6px;
height: 1em;
background: var(--transparent-50);
margin-top: 3px;
border: 1px solid transparent;
cursor: pointer;
&:hover {
border: 1px solid var(--welcome-popup-text-color);
opacity: var(--dimming-factor);
}
}
}
/* Animations, animations everywhere */
.slide-fade-enter-active {
transition: all 1s ease;
}
.slide-fade-leave-active {
transition: all .8s cubic-bezier(.93,.01,.89,.5);
}
.slide-fade-enter, .slide-fade-leave-to {
transform: translateY(35em);
opacity: 0;
}
</style>