diff --git a/web/package.json b/web/package.json index c84007f..483b90c 100644 --- a/web/package.json +++ b/web/package.json @@ -23,7 +23,7 @@ "@regle/rules": "^1.16.1", "crypto-js": "^4.2.0", "slugify": "^1.6.6", - "vue": "3.5.15", + "vue": "^3.5.26", "vue-router": "4" }, "devDependencies": { @@ -31,7 +31,7 @@ "@spiriit/vite-plugin-svg-spritemap": "^6.0.0", "@types/crypto-js": "^4.2.2", "@types/node": "^24.10.1", - "@vitejs/plugin-vue": "5.2.1", + "@vitejs/plugin-vue": "^6.0.0", "@vue/eslint-config-prettier": "^10.2.0", "@vue/eslint-config-typescript": "^14.6.0", "@vue/tsconfig": "^0.8.1", @@ -42,7 +42,7 @@ "oxlint": "^1.36.0", "prettier": "^3.7.4", "typescript": "~5.9.3", - "vite": "~7.0.0", + "vite": "^7.3.0", "vite-plugin-vue-devtools": "^8.0.5", "vue-tsc": "^3.2.1" } diff --git a/web/src/components/chat/chat-message.vue b/web/src/components/chat/chat-message.vue new file mode 100644 index 0000000..10682ec --- /dev/null +++ b/web/src/components/chat/chat-message.vue @@ -0,0 +1,77 @@ + + + + + + + + {{ props.username }} + {{ + props.timestamp.toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit', + hour12: false, + }) + }} + + + {{ props.text }} + + + + + + + diff --git a/web/src/components/chat/chat-text-field.vue b/web/src/components/chat/chat-text-field.vue new file mode 100644 index 0000000..8ec3c5f --- /dev/null +++ b/web/src/components/chat/chat-text-field.vue @@ -0,0 +1,101 @@ + + + + + + + + + {{ message.length }}/300 + + + + diff --git a/web/src/components/icon/icons.ts b/web/src/components/icon/icons.ts index fe4d76c..882ea0e 100644 --- a/web/src/components/icon/icons.ts +++ b/web/src/components/icon/icons.ts @@ -7,6 +7,17 @@ export const ICONS = [ 'delete', 'add', 'arrow_down', + 'promote', + 'remove', + 'smile', + 'suggest', + 'handle', + 'playing', + 'queue_add', + 'play_arrow', + 'close', + 'warning', + 'explosion', ] as const export type TIconName = (typeof ICONS)[number] diff --git a/web/src/components/identity/user-identity.vue b/web/src/components/identity/user-identity.vue index c4a3973..f5755dc 100644 --- a/web/src/components/identity/user-identity.vue +++ b/web/src/components/identity/user-identity.vue @@ -18,7 +18,7 @@ const emit = defineEmits<{ - + {{ props.title }} diff --git a/web/src/components/input/sync-input.vue b/web/src/components/input/sync-input.vue index d28f8c6..76630b6 100644 --- a/web/src/components/input/sync-input.vue +++ b/web/src/components/input/sync-input.vue @@ -8,6 +8,7 @@ const props = defineProps<{ err?: string required?: boolean + disabled?: boolean autocomplete?: string }>() @@ -15,7 +16,7 @@ const model = defineModel({ default: '' }) - + ({ default: '' }) :class="{ 'input-field-error': err }" :name="props.name" :id="props.name" + :disabled="props.disabled ?? false" :placeholder="props.placeholder ?? ' '" :required="props.required" :autocomplete="props.autocomplete" @@ -60,6 +62,11 @@ const model = defineModel({ default: '' }) } } +.s-input.disabled { + opacity: 0.8; + pointer-events: none; +} + .has-error { background-color: var(--s-error-light); border-color: var(--s-error-light); diff --git a/web/src/components/prompt/confirmation-prompt.vue b/web/src/components/prompt/confirmation-prompt.vue new file mode 100644 index 0000000..6219f74 --- /dev/null +++ b/web/src/components/prompt/confirmation-prompt.vue @@ -0,0 +1,80 @@ + + + + + + {{ props.title }} + + + + + + + + diff --git a/web/src/components/prompt/reconnecting-prompt.vue b/web/src/components/prompt/reconnecting-prompt.vue new file mode 100644 index 0000000..2cfd930 --- /dev/null +++ b/web/src/components/prompt/reconnecting-prompt.vue @@ -0,0 +1,40 @@ + + + + + Reconnecting + {{ `WebSocket connection lost. Session death in ${formattedTime(13)}` }} + + + + diff --git a/web/src/components/prompt/share-popup.vue b/web/src/components/prompt/share-popup.vue new file mode 100644 index 0000000..e7d2c3e --- /dev/null +++ b/web/src/components/prompt/share-popup.vue @@ -0,0 +1,17 @@ + +Link copied + diff --git a/web/src/components/room/room-settings.vue b/web/src/components/room/room-settings.vue new file mode 100644 index 0000000..5248903 --- /dev/null +++ b/web/src/components/room/room-settings.vue @@ -0,0 +1,127 @@ + + + + + + Room settings + + + + General + + + + + + + + Danger zone + + + + + + + + + diff --git a/web/src/components/user/user-context-menu.vue b/web/src/components/user/user-context-menu.vue new file mode 100644 index 0000000..c57b848 --- /dev/null +++ b/web/src/components/user/user-context-menu.vue @@ -0,0 +1,129 @@ + + + + + + + + Sync Status + + Connected: + {{ props.timeConnected ?? 'NaN' }} + + + + Ping + {{ props.ping ?? 'NaN' }} + + + Error + {{ props.error ?? 'NaN' }} + + + Buffer + {{ props.buffer ?? 'NaN' }} + + + + + + + + + + + + diff --git a/web/src/components/user/user-label.vue b/web/src/components/user/user-label.vue new file mode 100644 index 0000000..4492c5c --- /dev/null +++ b/web/src/components/user/user-label.vue @@ -0,0 +1,62 @@ + + + + + {{ props.username }} + {{ props.isAdmin ? 'Admin' : 'User' }} + + + + diff --git a/web/src/components/user/user-room.vue b/web/src/components/user/user-room.vue new file mode 100644 index 0000000..10ce829 --- /dev/null +++ b/web/src/components/user/user-room.vue @@ -0,0 +1,35 @@ + + + + + + + diff --git a/web/src/icons/close.svg b/web/src/icons/close.svg new file mode 100644 index 0000000..d0754ee --- /dev/null +++ b/web/src/icons/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/icons/delete.svg b/web/src/icons/delete.svg index 3064115..4821202 100644 --- a/web/src/icons/delete.svg +++ b/web/src/icons/delete.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/web/src/icons/explosion.svg b/web/src/icons/explosion.svg new file mode 100644 index 0000000..f1cceb2 --- /dev/null +++ b/web/src/icons/explosion.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/icons/handle.svg b/web/src/icons/handle.svg new file mode 100644 index 0000000..657c55b --- /dev/null +++ b/web/src/icons/handle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/icons/play_arrow.svg b/web/src/icons/play_arrow.svg new file mode 100644 index 0000000..184848c --- /dev/null +++ b/web/src/icons/play_arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/icons/playing.svg b/web/src/icons/playing.svg new file mode 100644 index 0000000..cd58a4e --- /dev/null +++ b/web/src/icons/playing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/icons/promote.svg b/web/src/icons/promote.svg new file mode 100644 index 0000000..c6e3492 --- /dev/null +++ b/web/src/icons/promote.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/src/icons/queue_add.svg b/web/src/icons/queue_add.svg new file mode 100644 index 0000000..6ca3886 --- /dev/null +++ b/web/src/icons/queue_add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/icons/remove.svg b/web/src/icons/remove.svg new file mode 100644 index 0000000..5f433ef --- /dev/null +++ b/web/src/icons/remove.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/src/icons/smile.svg b/web/src/icons/smile.svg new file mode 100644 index 0000000..00cd833 --- /dev/null +++ b/web/src/icons/smile.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/src/icons/suggest.svg b/web/src/icons/suggest.svg new file mode 100644 index 0000000..78450ed --- /dev/null +++ b/web/src/icons/suggest.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/icons/warning.svg b/web/src/icons/warning.svg new file mode 100644 index 0000000..84c483b --- /dev/null +++ b/web/src/icons/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/main.css b/web/src/main.css index 7b5a6a0..cbd2991 100644 --- a/web/src/main.css +++ b/web/src/main.css @@ -58,3 +58,9 @@ body { .s-link { color: var(--s-primary); } +.s-separator { + border: none; + height: 2px; + background: var(--s-border, rgba(0, 0, 0, 0.1)); + margin: 8px 0; +} diff --git a/web/src/queue/media-card.vue b/web/src/queue/media-card.vue new file mode 100644 index 0000000..6a9db4f --- /dev/null +++ b/web/src/queue/media-card.vue @@ -0,0 +1,159 @@ + + + + + + {{ + props.media.title + }} + + + + + + + + + + + 20:20 + + {{ + props.media.description + }} + + + + + diff --git a/web/src/views/RoomView.vue b/web/src/views/RoomView.vue index 1293a44..609b9d3 100644 --- a/web/src/views/RoomView.vue +++ b/web/src/views/RoomView.vue @@ -1,9 +1,17 @@ - Room {{ route.params.room }} + +