From 02c947708f51560ef1dd3aec2f334e50a628e831 Mon Sep 17 00:00:00 2001 From: Yisroel Baum Date: Fri, 31 Jul 2026 09:56:16 +0300 Subject: [PATCH] add guest auth pages --- frontend/website/src/App.vue | 10 +- frontend/website/src/components/AuthForm.vue | 68 ++ .../website/src/components/AuthLayout.vue | 426 +++++++++++++ .../website/src/components/AuthTextField.vue | 70 ++ .../website/src/components/BrandWordmark.vue | 71 +++ frontend/website/src/main.ts | 1 + frontend/website/src/router/index.ts | 53 +- frontend/website/src/stores/auth.ts | 10 + frontend/website/src/styles/main.css | 50 ++ frontend/website/src/views/DashboardView.vue | 67 ++ frontend/website/src/views/HomeView.vue | 599 ++++++++++++++++++ frontend/website/src/views/LoginView.vue | 35 + frontend/website/src/views/SignupView.vue | 49 ++ 13 files changed, 1499 insertions(+), 10 deletions(-) create mode 100644 frontend/website/src/components/AuthForm.vue create mode 100644 frontend/website/src/components/AuthLayout.vue create mode 100644 frontend/website/src/components/AuthTextField.vue create mode 100644 frontend/website/src/components/BrandWordmark.vue create mode 100644 frontend/website/src/stores/auth.ts create mode 100644 frontend/website/src/styles/main.css create mode 100644 frontend/website/src/views/DashboardView.vue create mode 100644 frontend/website/src/views/HomeView.vue create mode 100644 frontend/website/src/views/LoginView.vue create mode 100644 frontend/website/src/views/SignupView.vue diff --git a/frontend/website/src/App.vue b/frontend/website/src/App.vue index abfd315..7c2aa3f 100644 --- a/frontend/website/src/App.vue +++ b/frontend/website/src/App.vue @@ -1,11 +1,3 @@ - - - - diff --git a/frontend/website/src/components/AuthForm.vue b/frontend/website/src/components/AuthForm.vue new file mode 100644 index 0000000..709091f --- /dev/null +++ b/frontend/website/src/components/AuthForm.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/frontend/website/src/components/AuthLayout.vue b/frontend/website/src/components/AuthLayout.vue new file mode 100644 index 0000000..2eeace0 --- /dev/null +++ b/frontend/website/src/components/AuthLayout.vue @@ -0,0 +1,426 @@ + + + + + diff --git a/frontend/website/src/components/AuthTextField.vue b/frontend/website/src/components/AuthTextField.vue new file mode 100644 index 0000000..e9ec98c --- /dev/null +++ b/frontend/website/src/components/AuthTextField.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/frontend/website/src/components/BrandWordmark.vue b/frontend/website/src/components/BrandWordmark.vue new file mode 100644 index 0000000..b41aa80 --- /dev/null +++ b/frontend/website/src/components/BrandWordmark.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/frontend/website/src/main.ts b/frontend/website/src/main.ts index fda1e6e..62f3c02 100644 --- a/frontend/website/src/main.ts +++ b/frontend/website/src/main.ts @@ -3,6 +3,7 @@ import { createPinia } from 'pinia' import App from './App.vue' import router from './router' +import './styles/main.css' const app = createApp(App) diff --git a/frontend/website/src/router/index.ts b/frontend/website/src/router/index.ts index e1eab52..b726d17 100644 --- a/frontend/website/src/router/index.ts +++ b/frontend/website/src/router/index.ts @@ -1,8 +1,59 @@ import { createRouter, createWebHistory } from 'vue-router' +import { useAuthStore } from '@/stores/auth' + const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), - routes: [], + routes: [ + { + path: '/', + name: 'home', + component: () => import('@/views/HomeView.vue'), + }, + { + path: '/login', + name: 'login', + component: () => import('@/views/LoginView.vue'), + meta: { + guestOnly: true, + }, + }, + { + path: '/signup', + name: 'signup', + component: () => import('@/views/SignupView.vue'), + meta: { + guestOnly: true, + }, + }, + { + path: '/dashboard', + name: 'dashboard', + component: () => import('@/views/DashboardView.vue'), + meta: { + requiresAuth: true, + }, + }, + ], +}) + +router.beforeEach((to) => { + const authStore = useAuthStore() + + if (to.meta.requiresAuth && !authStore.isAuthenticated) { + return { + name: 'login', + query: { + redirect: to.fullPath, + }, + } + } + + if (to.meta.guestOnly && authStore.isAuthenticated) { + return { + name: 'dashboard', + } + } }) export default router diff --git a/frontend/website/src/stores/auth.ts b/frontend/website/src/stores/auth.ts new file mode 100644 index 0000000..50688f1 --- /dev/null +++ b/frontend/website/src/stores/auth.ts @@ -0,0 +1,10 @@ +import { ref } from 'vue' +import { defineStore } from 'pinia' + +export const useAuthStore = defineStore('auth', () => { + const isAuthenticated = ref(false) + + return { + isAuthenticated, + } +}) diff --git a/frontend/website/src/styles/main.css b/frontend/website/src/styles/main.css new file mode 100644 index 0000000..a121333 --- /dev/null +++ b/frontend/website/src/styles/main.css @@ -0,0 +1,50 @@ +:root { + color: #1b2924; + background: #f3f1eb; + font-family: + Inter, + ui-sans-serif, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + sans-serif; + font-synthesis: none; + text-rendering: optimizeLegibility; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + min-width: 320px; + min-height: 100%; + background: #f3f1eb; +} + +body { + min-width: 320px; + min-height: 100%; + margin: 0; +} + +button, +input { + font: inherit; +} + +button, +a { + -webkit-tap-highlight-color: transparent; +} + +a { + color: inherit; +} + +#app { + min-height: 100vh; + min-height: 100svh; +} diff --git a/frontend/website/src/views/DashboardView.vue b/frontend/website/src/views/DashboardView.vue new file mode 100644 index 0000000..90b1b1d --- /dev/null +++ b/frontend/website/src/views/DashboardView.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/frontend/website/src/views/HomeView.vue b/frontend/website/src/views/HomeView.vue new file mode 100644 index 0000000..b061d02 --- /dev/null +++ b/frontend/website/src/views/HomeView.vue @@ -0,0 +1,599 @@ + + + + + diff --git a/frontend/website/src/views/LoginView.vue b/frontend/website/src/views/LoginView.vue new file mode 100644 index 0000000..e4215a4 --- /dev/null +++ b/frontend/website/src/views/LoginView.vue @@ -0,0 +1,35 @@ + + + diff --git a/frontend/website/src/views/SignupView.vue b/frontend/website/src/views/SignupView.vue new file mode 100644 index 0000000..123bf72 --- /dev/null +++ b/frontend/website/src/views/SignupView.vue @@ -0,0 +1,49 @@ + + +