<template>
<div id="app" v-if="ready">
- <button class="titlebar">
+ <button class="titlebar" />
- </button>
-
- <!-- Menu -->
+ <!-- Minimize and exit buttons. -->
<span class="menu">
- <button class="menuButton exitButton" @click.prevent="callNavbar('close')"></button>
- <button class="menuButton minimizeButton" @click.prevent="callNavbar('min')"></button>
+ <button
+ class="menuButton exitButton"
+ @click.prevent="callNavbar('close')"
+ />
+ <button
+ class="menuButton minimizeButton"
+ @click.prevent="callNavbar('min')"
+ />
</span>
<!-- Windows -->
<template>
<InputItem />
+ <!-- Settings open button. -->
+ <button
+ class="settingsIcon"
+ v-if="toggleSettings == false"
+ @click="onSettings"
+ >
+ <div class="settingsButtonDot"></div>
+ <div class="settingsButtonDot"></div>
+ <div class="settingsButtonDot"></div>
+ </button>
+
+ <!-- Settings "page." -->
+ <div id="settings" v-show="toggleSettings">
+ <button class="settingsOption">Logout</button>
+ </div>
+
<!-- List of message bubbles. -->
<div id="messenger">
<MessageItem v-for="message in messages" :message="message[1]" :key="message[0]" />
</div>
+
</template>
<script lang="ts">
-import { defineComponent, reactive, onMounted, onUnmounted } from "vue";
+import { defineComponent, reactive, ref, onMounted, onUnmounted } from "vue";
import { RenderMessage , Annotation } from "@/types/message/index";
import MessageItem from "@/components/messageItem.vue";
import InputItem from "@/components/inputItem/inputItem.vue";
},
setup() {
+
+ // Whether or not to show the settings.
+ let toggleSettings = ref(false);
+
+ // Listen for escape key to close settings.
+ const onEscape = (e: any) => {
+ if(e.key === "Escape") {
+ toggleSettings.value = false;
+ }
+ window.removeEventListener("keydown", onEscape);
+ }
+
+ // When user clicks settings button.
+ const onSettings = () => {
+ toggleSettings.value = true;
+ window.addEventListener("keydown", onEscape);
+ }
+
+
const { emitter } = useMitt();
+
// List of messages in the view.
// Oldest message first.
const messages = reactive(new Map());
}
}
+ toggleSettings.value = false;
+
onMounted(() => {
emitter.on('self-message', (message) => messages.set(message.uid, message));
// Listen for new messages to render.
});
return {
+ toggleSettings,
messages,
+ onSettings
};
},
});
#messenger::-webkit-scrollbar {
display: none;
}
+
+#settings {
+ position: fixed;
+
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ width: 100vw;
+ height: 100vh;
+
+ background-color: #EBEBEB;
+
+ opacity: 0.75;
+
+ z-index: 4;
+
+ animation-name: appear;
+ animation-duration: 0.5s;
+}
+
+@keyframes appear {
+ from {
+ opacity: 0
+ }
+ to {
+ opacity: 0.75
+ }
+}
+
+.settingsIcon {
+ position: fixed;
+ right: 0;
+
+ border: none;
+ outline: none;
+
+ display: flex;
+ flex-direction: row;
+
+ margin-right: 20px;
+ margin-top: 24px;
+
+ z-index: 2;
+ background-color: #EBEBEB;
+}
+
+.settingsButtonDot {
+ width: 5px;
+ height: 5px;
+
+ margin: 2px;
+ border-radius: 2.5px;
+ background-color: #383838;
+}
+
+.settingsOption {
+ font-family: "SF Compact Display";
+ background-color: #B7B7B7;
+ padding: 10px 30px;
+ border-radius: 20px;
+ font-size: 14px;
+ font-weight: bold;
+ border: none;
+ outline: none;
+ text-decoration: none;
+}
+
+.settingsOption:hover {
+ cursor: pointer;
+}
</style>