diff --git a/src/App.vue b/src/App.vue index 97e53e7..a8e8a5f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,116 +4,49 @@ - + diff --git a/src/base.css b/src/base.css index 7e092c8..41a41f6 100644 --- a/src/base.css +++ b/src/base.css @@ -13,6 +13,7 @@ html, body, #app { height: 100%; + overflow-y: hidden; } :root { @@ -63,9 +64,89 @@ button, .button { cursor: pointer; text-decoration: none; margin: 5px; + outline: none; } button:hover, .button:hover { background: var(--accent-hover); } +input[type="checkbox"] { + appearance: none; + -webkit-appearance: none; + width: 1.25rem; + height: 1.25rem; + aspect-ratio: 1; + flex-shrink: 0; + padding: 0; + + background: var(--panel); + border: 1px solid var(--border); + border-radius: 4px; + cursor: pointer; + + display: inline-grid; + place-content: center; + vertical-align: middle; + position: relative; + transition: all 0.15s ease-in-out; +} + +input[type="checkbox"]:hover { + border-color: var(--accent); +} + +input[type="checkbox"]:checked { + background: var(--accent); + border-color: var(--accent); +} + +input[type="checkbox"]::before { + content: ""; + width: 0.7rem; + height: 0.7rem; + transform: scale(0); + transition: 120ms transform ease-in-out; + background-color: #0b0d12; + clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%); +} + +input[type="checkbox"]:checked::before { + transform: scale(1); +} + +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background-color: var(--text); + border-radius: 10px; +} + +::-webkit-scrollbar-thumb:hover { + filter: brightness(1.2); +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--text) transparent; +} + +i { + color: var(--muted); + transition: color 0.2s ease; +} + +i:hover { + color: var(--text); +} + +.btn { + outline: none; +} diff --git a/src/components/ChatWindow.vue b/src/components/ChatWindow.vue index baaca6c..d5d2c5b 100644 --- a/src/components/ChatWindow.vue +++ b/src/components/ChatWindow.vue @@ -66,8 +66,7 @@ async function initializeRoom() { socket.onmessage = (event) => { const msg: Message = JSON.parse(event.data); - const exists = messages.value.some(m => m.sent_at === msg.sent_at && m.sender === msg.sender); - if (!exists) { + if (!messages.value.some(m => m.uuid === msg.uuid)) { messages.value.push(msg); nextTick().then(scrollToBottom); } diff --git a/src/components/Navbar.vue b/src/components/Navbar.vue new file mode 100644 index 0000000..0e932b9 --- /dev/null +++ b/src/components/Navbar.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/components/RoomList.vue b/src/components/RoomList.vue index 865ea1a..e5f9cd9 100644 --- a/src/components/RoomList.vue +++ b/src/components/RoomList.vue @@ -2,17 +2,17 @@

Rooms

- +
-
{{ room.name }} - {{ room.owner_name }} + by {{ room.owner_name }}
@@ -55,6 +55,7 @@ onMounted(async () => { .rooms-header h2 { font-size: 1.1rem; margin: 0; + margin-left: 38px; } .scroll-area { @@ -80,11 +81,11 @@ onMounted(async () => { .room-item.active { background: var(--accent); - color: white; + color: rgba(0, 0, 0, 0.8); } .room-item.active .room-owner { - color: rgba(255, 255, 255, 0.7); + color: rgba(0, 0, 0, 1); } .room-info { @@ -102,15 +103,21 @@ onMounted(async () => { } .create-btn { + margin: 0; + padding: 18px; width: 28px; height: 28px; - border-radius: 50%; + border-radius: var(--radius); border: none; - background: var(--accent); + background: transparent; color: white; cursor: pointer; display: flex; align-items: center; justify-content: center; } + +.create-btn:hover { + background: rgba(255, 255, 255, 0.05); +} diff --git a/src/pages/ChatPage.vue b/src/pages/ChatPage.vue index e2f509b..7e2e997 100644 --- a/src/pages/ChatPage.vue +++ b/src/pages/ChatPage.vue @@ -1,9 +1,17 @@ diff --git a/src/router/index.ts b/src/router/index.ts index 00b2333..8df7ff3 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -9,8 +9,18 @@ const router = createRouter({ history: createWebHistory(), routes: [ { path: '/', redirect: '/rooms/none' }, - { path: '/login', component: LoginPage }, - { path: '/rooms/:uuid', component: ChatPage, props: true }, + { + path: '/login', + name: 'login', + component: LoginPage, + meta: { hideNavbar: true } + }, + { + path: '/rooms/:uuid', + name: 'chat', + component: ChatPage, + props: true + }, { path: '/friendlist', component: FriendListPage } ], }) diff --git a/src/types/api.ts b/src/types/api.ts index dce4706..9436461 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -11,6 +11,7 @@ export interface Room { } export interface Message { + uuid: string sender: string message_type: 'text' content: string