From 560d023250226dea6fd36771b120a658a3e4031a Mon Sep 17 00:00:00 2001 From: Vantz Stockwell Date: Thu, 11 Jun 2026 02:21:14 -0400 Subject: [PATCH] feat(redesign): re-skin auth + account views to DS (Phase D batch 1) Auth (Login/Register/ForgotPassword/SetupWizard) + account cluster (Settings/Team/Notifications) re-skinned onto design-system components + tokens. JPEG login banner replaced with the C-gauge mark + Oxanium wordmark. All logic/store/router/handlers preserved (TOTP flow, validators, save handlers, API endpoints). Build green. Co-Authored-By: Claude Opus 4.8 --- .../src/views/admin/NotificationsView.vue | 195 +++--- frontend/src/views/admin/SettingsView.vue | 354 +++++------ frontend/src/views/admin/TeamView.vue | 256 ++++---- .../src/views/auth/ForgotPasswordView.vue | 198 +++++-- frontend/src/views/auth/LoginView.vue | 367 +++++++----- frontend/src/views/auth/RegisterView.vue | 275 +++++---- frontend/src/views/auth/SetupWizardView.vue | 559 ++++++++++++++---- 7 files changed, 1357 insertions(+), 847 deletions(-) diff --git a/frontend/src/views/admin/NotificationsView.vue b/frontend/src/views/admin/NotificationsView.vue index f148b29..3776fb3 100644 --- a/frontend/src/views/admin/NotificationsView.vue +++ b/frontend/src/views/admin/NotificationsView.vue @@ -1,9 +1,13 @@ + + diff --git a/frontend/src/views/admin/SettingsView.vue b/frontend/src/views/admin/SettingsView.vue index b6d9135..f48cb2f 100644 --- a/frontend/src/views/admin/SettingsView.vue +++ b/frontend/src/views/admin/SettingsView.vue @@ -3,14 +3,20 @@ import { ref, onMounted } from 'vue' import { useAuthStore } from '@/stores/auth' import { useToastStore } from '@/stores/toast' import { useApi } from '@/composables/useApi' -import { Settings, Key, Globe, User, Save, Loader2, Eye } from 'lucide-vue-next' + +import Panel from '@/components/ds/data/Panel.vue' +import Button from '@/components/ds/core/Button.vue' +import Badge from '@/components/ds/core/Badge.vue' +import Tabs from '@/components/ds/navigation/Tabs.vue' +import Input from '@/components/ds/forms/Input.vue' +import Switch from '@/components/ds/forms/Switch.vue' const auth = useAuthStore() const toast = useToastStore() const api = useApi() const saving = ref(false) -const section = ref<'account' | 'license' | 'domain' | 'public'>('account') +const section = ref('account') const accountForm = ref({ username: '', @@ -86,209 +92,225 @@ async function savePublicSite() { onMounted(() => { loadForms() }) + +const tabItems = [ + { value: 'account', label: 'Account', icon: 'user' }, + { value: 'license', label: 'License', icon: 'key' }, + { value: 'domain', label: 'Domain', icon: 'globe' }, + { value: 'public', label: 'Public status', icon: 'eye' }, +] + + diff --git a/frontend/src/views/admin/TeamView.vue b/frontend/src/views/admin/TeamView.vue index 6a3efd2..bca12b2 100644 --- a/frontend/src/views/admin/TeamView.vue +++ b/frontend/src/views/admin/TeamView.vue @@ -1,9 +1,14 @@ + + diff --git a/frontend/src/views/auth/ForgotPasswordView.vue b/frontend/src/views/auth/ForgotPasswordView.vue index c616c73..d7aa3e2 100644 --- a/frontend/src/views/auth/ForgotPasswordView.vue +++ b/frontend/src/views/auth/ForgotPasswordView.vue @@ -2,7 +2,10 @@ import { ref } from 'vue' import { useApi } from '@/composables/useApi' import { RouterLink } from 'vue-router' -import { Mail, ArrowLeft, CheckCircle2, Loader2 } from 'lucide-vue-next' +import Logo from '@/components/ds/brand/Logo.vue' +import Input from '@/components/ds/forms/Input.vue' +import Button from '@/components/ds/core/Button.vue' +import Alert from '@/components/ds/feedback/Alert.vue' const api = useApi() const email = ref('') @@ -27,76 +30,149 @@ async function handleSubmit() { + + diff --git a/frontend/src/views/auth/LoginView.vue b/frontend/src/views/auth/LoginView.vue index 737dda9..5963c04 100644 --- a/frontend/src/views/auth/LoginView.vue +++ b/frontend/src/views/auth/LoginView.vue @@ -4,6 +4,10 @@ import { useRouter } from 'vue-router' import { useApi } from '@/composables/useApi' import { useAuthStore } from '@/stores/auth' import type { AuthResponse } from '@/types' +import Logo from '@/components/ds/brand/Logo.vue' +import Input from '@/components/ds/forms/Input.vue' +import Button from '@/components/ds/core/Button.vue' +import Alert from '@/components/ds/feedback/Alert.vue' const router = useRouter() const api = useApi() @@ -96,158 +100,221 @@ function handleBackToLogin() { + + diff --git a/frontend/src/views/auth/RegisterView.vue b/frontend/src/views/auth/RegisterView.vue index 3079661..89690bf 100644 --- a/frontend/src/views/auth/RegisterView.vue +++ b/frontend/src/views/auth/RegisterView.vue @@ -4,6 +4,10 @@ import { useRouter } from 'vue-router' import { useApi } from '@/composables/useApi' import { useAuthStore } from '@/stores/auth' import type { AuthResponse } from '@/types' +import Logo from '@/components/ds/brand/Logo.vue' +import Input from '@/components/ds/forms/Input.vue' +import Button from '@/components/ds/core/Button.vue' +import Alert from '@/components/ds/feedback/Alert.vue' const router = useRouter() const api = useApi() @@ -74,138 +78,149 @@ async function handleRegister() { + + diff --git a/frontend/src/views/auth/SetupWizardView.vue b/frontend/src/views/auth/SetupWizardView.vue index 57fc042..d2f3262 100644 --- a/frontend/src/views/auth/SetupWizardView.vue +++ b/frontend/src/views/auth/SetupWizardView.vue @@ -3,7 +3,10 @@ import { ref } from 'vue' import { useRouter } from 'vue-router' import { useAuthStore } from '@/stores/auth' import { useApi } from '@/composables/useApi' -import { Server, Wifi, CheckCircle, ArrowRight, Loader2 } from 'lucide-vue-next' +import Logo from '@/components/ds/brand/Logo.vue' +import Input from '@/components/ds/forms/Input.vue' +import Button from '@/components/ds/core/Button.vue' +import Alert from '@/components/ds/feedback/Alert.vue' const router = useRouter() const auth = useAuthStore() @@ -21,13 +24,25 @@ const serverForm = ref({ game_port: 28015, }) +// String mirrors for the DS Input component (which binds defineModel). +// Changes sync back to serverForm as numbers before submission. +const serverPortStr = ref(String(serverForm.value.server_port)) +const gamePortStr = ref(String(serverForm.value.game_port)) + +function syncPorts() { + serverForm.value.server_port = parseInt(serverPortStr.value, 10) || serverForm.value.server_port + serverForm.value.game_port = parseInt(gamePortStr.value, 10) || serverForm.value.game_port +} + const connectionTypes = [ - { value: 'bare_metal', label: 'Bare Metal / VPS', desc: 'Direct connection via Companion Agent' }, + { value: 'bare_metal', label: 'Bare metal / VPS', desc: 'Direct connection via Companion Agent' }, { value: 'amp', label: 'AMP (CubeCoders)', desc: 'Connect through AMP panel API' }, { value: 'pterodactyl', label: 'Pterodactyl', desc: 'Connect through Pterodactyl panel API' }, ] async function submitServerConfig() { + syncPorts() + if (!serverForm.value.server_name.trim()) { error.value = 'Server name is required.' return @@ -58,180 +73,464 @@ async function completeSetup() { + +