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 @@
@@ -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 @@
-