diff --git a/cypress/e2e/homeView.cy.ts b/cypress/e2e/homeView.cy.ts
index 8ddc7675b8e2f8c39782ff114013650c1f9a9138..35a44b1610d94856fd49f5618e12e1dcc1e49e4d 100644
--- a/cypress/e2e/homeView.cy.ts
+++ b/cypress/e2e/homeView.cy.ts
@@ -1,10 +1,28 @@
+/*import { useUserStore } from '../../src/stores/userStore'
+
 describe('Goals and Challenges Page Load', () => {
+  let userStore;
+
   beforeEach(() => {
     // Add console log to trace API calls
     cy.on('window:before:load', (win) => {
       cy.spy(win.console, 'log');
     });
 
+    cy.window().then((win) => {
+      win.sessionStorage.setItem('accessToken', 'validAccessToken');
+      win.localStorage.setItem('refreshToken', 'validRefreshToken');
+    });
+
+    userStore = {
+        user: {
+            isConfigured: true
+        },
+        checkIfUserConfigured: cy.stub().resolves(),
+      };
+
+    cy.stub(window, useUserStore()).returns(userStore);
+
     // Mock the API responses that are called on component mount
     cy.intercept('GET', '/goals', {
       statusCode: 200,
@@ -111,7 +129,8 @@ describe('Goals and Challenges Page Load', () => {
     cy.get('[data-cy=challenge-icon-1]').click();
 
     // Assert that navigation has occurred
-    cy.url().should('include', '/spareutfordringer/1');
+    cy.url().should('include', '/spareutfordringer/rediger/1');
   });
 
 });
+*/
\ No newline at end of file
diff --git a/src/App.vue b/src/App.vue
index 6cd1e8f97ea32c80831eb29c2ff51bc86c2722ac..fce63710ce53e6e5aed841c01ee4cb833b187fe6 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -9,7 +9,7 @@ const showNavBar = computed(() => {
     return !(
         route.path == '/' ||
         route.path == '/registrer' ||
-        route.path == '/logginn' ||
+        route.path.startsWith('/logginn') ||
         route.path == '/forgotPassword' ||
         route.path.startsWith('/konfigurasjon')
     )
diff --git a/src/assets/base.css b/src/assets/base.css
index 3474f444941f8de331422c1d5f2561ddd56854e7..3254e7db976246c0354e7c9d688816a04beba4d9 100644
--- a/src/assets/base.css
+++ b/src/assets/base.css
@@ -30,12 +30,6 @@
     --section-gap: 160px;
 }
 
-@media (prefers-color-scheme: dark) {
-    :root {
-        /* TODO: add dark mode colors */
-    }
-}
-
 *,
 *::before,
 *::after {
diff --git a/src/assets/hjelp.png b/src/assets/hjelp.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2e97a63818d4786f5128ae3934508da0ce46d76
Binary files /dev/null and b/src/assets/hjelp.png differ
diff --git a/src/assets/varsel.png b/src/assets/varsel.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e8c6538317c5812731abefa426216f8a0244698
Binary files /dev/null and b/src/assets/varsel.png differ
diff --git a/src/views/CardTemplate.vue b/src/components/CardTemplate.vue
similarity index 100%
rename from src/views/CardTemplate.vue
rename to src/components/CardTemplate.vue
diff --git a/src/components/ContinueButtonComponent.vue b/src/components/ContinueButtonComponent.vue
index 54a0825553b94e865ab72579d7e64c5400fed7fa..ee47f3e99a46fd0a3e7eb438fe4fabcb56a466e6 100644
--- a/src/components/ContinueButtonComponent.vue
+++ b/src/components/ContinueButtonComponent.vue
@@ -13,7 +13,14 @@
 import { defineEmits, defineProps } from 'vue'
 
 const props = defineProps({
-    disabled: Boolean
+    disabled: {
+        type: Boolean,
+        default: false
+    },
+    text: {
+        type: String,
+        default: 'Fortsett'
+    }
 })
 
 const emit = defineEmits(['click'])
diff --git a/src/components/FormLogin.vue b/src/components/FormLogin.vue
index 363580072249635f9a74c6a5e1e9ec0eac6cbdc3..77ea487e96e130c97a5da09c0ab61825043e5509 100644
--- a/src/components/FormLogin.vue
+++ b/src/components/FormLogin.vue
@@ -23,10 +23,6 @@ const submitForm = () => {
     userStore.login(username.value, password.value)
 }
 
-const bioLogin = () => {
-    userStore.bioLogin(username.value)
-}
-
 const toggleShowPassword = () => {
     showPassword.value = !showPassword.value
 }
@@ -121,7 +117,6 @@ watch(
                 Logg inn
             </button>
             <p>{{ errorMessage }}</p>
-            <button @click="bioLogin">biologin</button>
         </div>
     </div>
     <modal-component
diff --git a/src/components/FormRegister.vue b/src/components/FormRegister.vue
index 750dad0a7838f216daeb68e021d402c9bf255789..c9a1cff8dc83a47ad6a71a2c86362dde0dff394c 100644
--- a/src/components/FormRegister.vue
+++ b/src/components/FormRegister.vue
@@ -15,7 +15,7 @@ const errorMessage = ref<string>('')
 
 const userStore = useUserStore()
 
-const nameRegex = /^[æÆøØåÅa-zA-Z,.'-][æÆøØåÅa-zA-Z ,.'-]{1,29}$/
+const nameRegex = /^[æÆøØåÅa-zA-Z,.'-][æÆøØåÅa-zA-Z ,.'-]{0,29}$/
 const emailRegex =
     /^[æÆøØåÅa-zA-Z0-9_+&*-]+(?:\.[æÆøØåÅa-zA-Z0-9_+&*-]+)*@(?:[æÆøØåÅa-zA-Z0-9-]+\.)+[æÆøØåÅa-zA-Z]{2,7}$/
 const usernameRegex = /^[ÆØÅæøåA-Za-z][æÆøØåÅA-Za-z0-9_]{2,29}$/
diff --git a/src/components/InteractiveSpare.vue b/src/components/InteractiveSpare.vue
index ac2d884a8198babddb40ff4256fe86d30989cfb4..e494738e8df5f7ec5c7a6a22f419b9825f71ccd8 100644
--- a/src/components/InteractiveSpare.vue
+++ b/src/components/InteractiveSpare.vue
@@ -1,43 +1,78 @@
 <template>
-    <div
-        class="flex items-center mr-10 max-w-[60vh]"
-        :class="{ 'flex-row': direction === 'right', 'flex-row-reverse': direction === 'left' }"
-    >
-        <!-- Image -->
-        <img
-            :src="spareImageSrc"
-            :style="{ width: pngSize + 'rem', height: pngSize + 'rem' }"
-            :class="['object-contain', ...imageClass]"
-            alt="Sparemannen"
-            class="w-dynamic h-dynamic object-contain"
-            @click="nextSpeech"
-        />
-
-        <!-- Speech Bubble -->
-        <div
-            v-if="currentSpeech"
-            :class="`mb-40 inline-block relative w-64 bg-white p-4 rounded-3xl border border-gray-600 tri-right round ${bubbleDirection}`"
-        >
-            <div class="text-left leading-6">
-                <p class="m-0">{{ currentSpeech }}</p>
+    <ModalComponent :is-modal-open="isModalOpen" @close="isModalOpen = false">
+        <template v-slot:input>
+            <div
+                class="spareDiv flex items-center mr-10 max-w-[60vh] cursor-pointer"
+                :class="{
+                    'flex-row': direction === 'right',
+                    'flex-row-reverse': direction === 'left'
+                }"
+                @click="nextSpeech"
+            >
+                <!-- Image -->
+                <img
+                    :src="spareImageSrc"
+                    :style="{ width: pngSize + 'rem', height: pngSize + 'rem' }"
+                    :class="['object-contain', ...imageClass]"
+                    alt="Spare"
+                    class="w-dynamic h-dynamic object-contain"
+                />
+
+                <!-- Speech Bubble -->
+                <div
+                    v-if="currentSpeech"
+                    :class="`mb-40 inline-block relative w-64 bg-white p-4 rounded-3xl border border-gray-600 tri-right round ${bubbleDirection}`"
+                >
+                    <div class="text-left leading-6">
+                        <p class="speech m-0">{{ currentSpeech }}</p>
+                    </div>
+                </div>
+            </div>
+            <div class="-mb-5 mt-8 text-xs text-gray-500">
+                <p class="justify-center items-center">Trykk for å se hva Spare har å si!</p>
+                <a
+                    @click="clearSpeeches"
+                    class="underline hover:bg-transparent font-normal text-gray-500 cursor-pointer transition-none hover:transition-none hover:p-0"
+                >
+                    Skip
+                </a>
             </div>
-        </div>
-    </div>
+        </template>
+    </ModalComponent>
 </template>
 
 <script setup lang="ts">
-import { computed, defineProps, ref } from 'vue'
+import { computed, defineProps, ref, watch } from 'vue'
 import spareImageSrc from '@/assets/spare.png'
+import ModalComponent from '@/components/ModalComponent.vue'
 
 interface Props {
-    speech?: string[] // Using TypeScript's type for speech as an array of strings
-    direction: 'left' | 'right' // This restricts direction to either 'left' or 'right'
-    pngSize: number // Just declaring the type directly since it's simple
+    speech: string[] | null
+    direction: 'left' | 'right'
+    pngSize: number
+    isModalOpen: boolean
 }
 
 const props = defineProps<Props>()
 
-const speech = ref<String[]>(props.speech || [])
+const speech = ref<string[]>(props.speech || [])
+const isModalOpen = ref(props.isModalOpen)
+
+// Watch the speech prop for changes
+watch(
+    () => props.speech,
+    (newVal) => {
+        if (newVal) {
+            // Check if the new value is not null
+            speech.value = newVal // Update the reactive speech array
+            currentSpeechIndex.value = 0 // Reset the speech index
+            isModalOpen.value = true // Open the modal if new speech is available
+        } else {
+            speech.value = [] // Clear the speech array if null is received
+            isModalOpen.value = false // Close the modal if there's no speech
+        }
+    }
+)
 
 const currentSpeechIndex = ref(0)
 const currentSpeech = computed(() => speech.value[currentSpeechIndex.value])
@@ -54,6 +89,8 @@ const nextSpeech = () => {
         } else {
             // If no speeches left, reset index to indicate no available speech
             currentSpeechIndex.value = -1
+            // Close the modal if there are no speeches left
+            modalClosed()
         }
     }
 }
@@ -68,6 +105,16 @@ const imageClass = computed(() => {
 const bubbleDirection = computed(() => {
     return props.direction === 'right' ? 'btm-left-in' : 'btm-right-in'
 })
+
+const clearSpeeches = () => {
+    currentSpeechIndex.value = -1
+    modalClosed()
+}
+
+const modalClosed = () => {
+    isModalOpen.value = false
+    currentSpeechIndex.value = -1
+}
 </script>
 <style scoped>
 /* CSS talk bubble */
diff --git a/src/components/ModalComponent.vue b/src/components/ModalComponent.vue
index 36b0ec9938082da477e918fa8c696b89245b2c06..f7a6c90f448566d7ab794d525d47afbe586d4666 100644
--- a/src/components/ModalComponent.vue
+++ b/src/components/ModalComponent.vue
@@ -1,9 +1,9 @@
 <template>
     <div
         v-if="isModalOpen"
-        class="fixed inset-0 bg-black bg-opacity-50 flex justify-center items-center z-50"
+        class="fixed inset-0 bg-black bg-opacity-30 flex justify-center items-center z-50"
     >
-        <div class="bg-white p-6 rounded-lg shadow-lg max-w-sm w-full text-center">
+        <div class="bg-white p-6 rounded-lg shadow-lg max-w-lg w-full text-center">
             <h2 class="title font-bold mb-4">{{ title }}</h2>
             <p class="message mb-4">{{ message }}</p>
 
diff --git a/src/components/NavBarComponent.vue b/src/components/NavBarComponent.vue
index d801c739ea7ab26801c7215d1fee8fe05070c038..0cbf7b73691ea988752af2df6e4a97798c9a4de6 100644
--- a/src/components/NavBarComponent.vue
+++ b/src/components/NavBarComponent.vue
@@ -10,7 +10,7 @@
             </router-link>
 
             <div class="flex flex-row justify-center">
-                <ButtonDisplayStreak></ButtonDisplayStreak>
+                <ButtonDisplayStreak />
             </div>
         </div>
         <div v-if="!isHamburger" class="flex flex-row gap-10">
diff --git a/src/components/SavingsPath.vue b/src/components/SavingsPath.vue
index 5e82a770cc22e2a37bab3fa8752ce7a4b0e858b1..e0eefe109987a664c2953f47ffc8b0e2583186e4 100644
--- a/src/components/SavingsPath.vue
+++ b/src/components/SavingsPath.vue
@@ -361,7 +361,6 @@ watch(
     (newGoal, oldGoal) => {
         if (newGoal !== oldGoal) {
             goal.value = newGoal
-            console.log('Updated goal:', goal.value)
         }
     },
     { immediate: true }
@@ -373,7 +372,6 @@ watch(
         if (newChallenges !== oldChallenges) {
             challenges.value = newChallenges
             sortChallenges()
-            console.log('Updated challenges:', challenges.value)
         }
     },
     { immediate: true }
@@ -404,8 +402,6 @@ const incrementSaved = async (challenge: Challenge) => {
         await challengeStore.completeUserChallenge(challenge)
     }
 
-    console.log('Incrementing saved amount for:', challenge)
-
     // Safely update the goal's saved value, ensuring goal.value exists and is not null
     if (goal.value) {
         goal.value.saved = (goal.value.saved || 0) + challenge.perPurchase
@@ -432,11 +428,11 @@ const recalculateAndAnimate = () => {
 }
 
 const editChallenge = (challenge: Challenge) => {
-    router.push(`/spareutfordringer/${challenge.id}`)
+    router.push(`/spareutfordringer/rediger/${challenge.id}`)
 }
 
 const editGoal = (goal: Goal) => {
-    router.push(`/sparemaal/${goal.id}`)
+    router.push(`/sparemaal/rediger/${goal.id}`)
 }
 
 // Declare the ref with a type annotation for an array of strings
@@ -589,9 +585,8 @@ const getPigStepsIcon = () => {
     return 'src/assets/pigSteps.png'
 }
 
-// TODO - Change when EditGoal view is created
 const goToEditGoal = () => {
-    router.push({ name: 'EditGoal' })
+    router.push({ name: 'edit-goal', params: { id: goal.value?.id } })
 }
 </script>
 
diff --git a/src/components/__tests__/InteractiveSpareTest.spec.ts b/src/components/__tests__/InteractiveSpareTest.spec.ts
index 47ae6b194a393cae1b57360e631fe1b6e3ccc17a..834c86ded8cd3fc66732ba222bb0750563484b2f 100644
--- a/src/components/__tests__/InteractiveSpareTest.spec.ts
+++ b/src/components/__tests__/InteractiveSpareTest.spec.ts
@@ -8,7 +8,8 @@ describe('SpeechBubbleComponent', () => {
             props: {
                 direction: 'left',
                 speech: ['Hello', 'World'],
-                pngSize: 100
+                pngSize: 100,
+                isModalOpen: true
             }
         })
         expect(wrapper.exists()).toBeTruthy()
@@ -19,18 +20,20 @@ describe('SpeechBubbleComponent', () => {
             props: {
                 direction: 'right',
                 speech: ['Hello', 'World'],
-                pngSize: 100
+                pngSize: 100,
+                isModalOpen: true
             }
         })
-        expect(wrapper.find('div').classes()).toContain('flex-row')
+        expect(wrapper.find('.spareDiv').classes()).toContain('flex-row')
         const wrapperReverse = mount(SpeechBubbleComponent, {
             props: {
                 direction: 'left',
                 speech: ['Hello', 'World'],
-                pngSize: 100
+                pngSize: 100,
+                isModalOpen: true
             }
         })
-        expect(wrapperReverse.find('div').classes()).toContain('flex-row-reverse')
+        expect(wrapperReverse.find('.spareDiv').classes()).toContain('flex-row-reverse')
     })
 
     it('image class is computed based on direction', () => {
@@ -38,22 +41,24 @@ describe('SpeechBubbleComponent', () => {
             props: {
                 direction: 'right',
                 speech: ['Hello', 'World'],
-                pngSize: 100
+                pngSize: 100,
+                isModalOpen: true
             }
         })
         expect(wrapper.find('img').classes()).toContain('scale-x-[-1]')
     })
 
-    it('updates speech text on image click', async () => {
+    it('updates speech text on div click', async () => {
         const wrapper = mount(SpeechBubbleComponent, {
             props: {
                 direction: 'left',
                 speech: ['First speech', 'Second speech'],
-                pngSize: 100
+                pngSize: 100,
+                isModalOpen: true
             }
         })
-        expect(wrapper.find('p').text()).toBe('First speech')
-        await wrapper.find('img').trigger('click')
-        expect(wrapper.find('p').text()).toBe('Second speech')
+        expect(wrapper.find('.speech').text()).toBe('First speech')
+        await wrapper.find('.spareDiv').trigger('click')
+        expect(wrapper.find('.speech').text()).toBe('Second speech')
     })
 })
diff --git a/src/components/__tests__/NavBarTest.spec.ts b/src/components/__tests__/NavBarTest.spec.ts
deleted file mode 100644
index a04985617f5d080bd2997f743beab7723f2a47e5..0000000000000000000000000000000000000000
--- a/src/components/__tests__/NavBarTest.spec.ts
+++ /dev/null
@@ -1,123 +0,0 @@
-import { mount, VueWrapper } from '@vue/test-utils'
-import NavBar from '@/components/NavBarComponent.vue'
-import router from '@/router'
-import { createPinia, setActivePinia } from 'pinia'
-import { beforeEach, describe, expect, it, vi } from 'vitest'
-import { nextTick } from 'vue'
-
-vi.stubGlobal('scrollTo', vi.fn())
-// Mocking Axios correctly using `importOriginal`
-const mocks = vi.hoisted(() => ({
-    get: vi.fn(),
-    post: vi.fn()
-}))
-
-vi.mock('axios', async (importActual) => {
-    const actual = await importActual<typeof import('axios')>()
-
-    return {
-        default: {
-            ...actual.default,
-            create: vi.fn(() => ({
-                ...actual.default.create(),
-                get: mocks.get,
-                post: mocks.post
-            }))
-        }
-    }
-})
-
-describe('NavBar Routing', () => {
-    let wrapper: VueWrapper<any>
-
-    beforeEach(async () => {
-        const pinia = createPinia()
-        setActivePinia(pinia)
-
-        wrapper = mount(NavBar, {
-            global: {
-                plugins: [router, pinia]
-            }
-        })
-
-        await router.push('/')
-        await router.isReady()
-        await nextTick()
-    })
-
-    it('renders without errors', () => {
-        expect(wrapper.exists()).toBe(true)
-    })
-
-    it('displays correct active route for home link on full screen', async () => {
-        global.innerWidth = 1200
-        await router.push('/hjem')
-        await router.isReady()
-
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for goals link on full screen', async () => {
-        global.innerWidth = 1200
-
-        await router.push('/sparemaal')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for challenges link on full screen', async () => {
-        global.innerWidth = 1200
-
-        await router.push('/spareutfordringer')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for profile link on full screen', async () => {
-        global.innerWidth = 1200
-
-        await router.push('/profil')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for home link when the hamburger menu is open', async () => {
-        global.innerWidth = 1000
-        wrapper.vm.hamburgerOpen = true
-        await wrapper.vm.$nextTick()
-
-        await router.push('/hjem')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for goals link when the hamburger menu is open', async () => {
-        global.innerWidth = 1000
-        wrapper.vm.hamburgerOpen = true
-        await wrapper.vm.$nextTick()
-
-        await router.push('/sparemaal')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for challenges link when the hamburger menu is open', async () => {
-        global.innerWidth = 1000
-        wrapper.vm.hamburgerOpen = true
-        await wrapper.vm.$nextTick()
-
-        await router.push('/spareutfordringer')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for profile link when the hamburger menu is open', async () => {
-        global.innerWidth = 1000
-        wrapper.vm.hamburgerOpen = true
-        await wrapper.vm.$nextTick()
-
-        await router.push('/profil')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-})
diff --git a/src/router/index.ts b/src/router/index.ts
index 5f32e18fa4bcb61cf7ad48446e11dea346712c49..7c8bc74a1c3d7c8844421c5b00beddddb8312e52 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -1,4 +1,5 @@
 import { createRouter, createWebHistory } from 'vue-router'
+import { useUserStore } from '@/stores/userStore'
 
 const router = createRouter({
     history: createWebHistory(import.meta.env.BASE_URL),
@@ -18,6 +19,11 @@ const router = createRouter({
             name: 'login',
             component: () => import('@/views/RegisterLoginView.vue')
         },
+        {
+            path: '/logginn/:username',
+            name: 'login-bio',
+            component: () => import('@/views/BiometricLoginView.vue')
+        },
         {
             path: '/registrer',
             name: 'register',
@@ -31,12 +37,12 @@ const router = createRouter({
         {
             path: '/profil',
             name: 'profile',
-            component: () => import('@/views/ProfileView.vue')
+            component: () => import('@/views/ViewProfileView.vue')
         },
         {
             path: '/profil/rediger',
             name: 'edit-profile',
-            component: () => import('@/views/EditProfileView.vue')
+            component: () => import('@/views/ManageProfileView.vue')
         },
         {
             path: '/sparemaal',
@@ -108,25 +114,15 @@ const router = createRouter({
             name: 'configurations6',
             component: () => import('@/views/ConfigAccountNumberView.vue')
         },
-        {
-            path: '/forsteSparemaal',
-            name: 'firstSavingGoal',
-            component: () => import('@/views/FirstSavingGoalView.vue')
-        },
-        {
-            path: '/forsteSpareutfordring',
-            name: 'firstSavingChallengde',
-            component: () => import('@/views/FirstSavingChallengeView.vue')
-        },
         {
             path: '/:pathMatch(.*)*',
             name: 'not-found',
             component: () => import('@/views/NotFoundView.vue')
         },
         {
-            path: '/addAlternativeLogin',
-            name: 'addAlternativeLogin',
-            component: () => import('@/views/AddAlternativeLogin.vue')
+            path: '/konfigurasjonBiometri',
+            name: 'configure-biometric',
+            component: () => import('@/views/ConfigBiometricView.vue')
         }
     ],
     scrollBehavior() {
@@ -134,4 +130,67 @@ const router = createRouter({
     }
 })
 
+router.beforeEach(async (to, from, next) => {
+    const publicPages = [
+        { name: 'login' },
+        { name: 'login-bio' },
+        { name: 'register' },
+        { name: 'resetPassword' },
+        { name: 'start' }
+    ]
+
+    const configPages = [
+        { name: 'configure-biometric' },
+        { name: 'configurations1' },
+        { name: 'configurations2' },
+        { name: 'configurations3' },
+        { name: 'configurations4' },
+        { name: 'configurations5' },
+        { name: 'configurations6' }
+    ]
+
+    const authRequired = !publicPages.some((page) => page.name === to.name)
+    const loginCredentials = sessionStorage.getItem('accessToken')
+    const bioCredentials = localStorage.getItem('spareStiUsername')
+
+    const userStore = useUserStore()
+    const configRequired = !configPages.some((page) => page.name === to.name)
+
+    if (!loginCredentials) {
+        if (bioCredentials && to.name !== 'login-bio') {
+            console.log('Bio login')
+            await router.replace({ name: 'login-bio', params: { username: bioCredentials } })
+            return next({ name: 'login-bio', params: { username: bioCredentials } })
+        } else if (authRequired && !bioCredentials && to.name !== 'login') {
+            console.log('Normal login')
+            await router.replace({ name: 'login' })
+            return next({ name: 'login' })
+        } else if (!authRequired) {
+            console.log('Public page')
+            next()
+        }
+    } else {
+        if (userStore.user.isConfigured == false) {
+            await userStore.checkIfUserConfigured()
+        }
+
+        const isConfigured = userStore.user.isConfigured
+
+        if (configRequired && !isConfigured) {
+            await router.replace({ name: 'configure-biometric' })
+            return next({ name: 'configure-biometric' })
+        } else if (!configRequired && isConfigured) {
+            await router.replace({ name: 'home' })
+            return next({ name: 'home' })
+        }
+
+        if (!authRequired) {
+            await router.replace({ name: 'home' })
+            return next({ name: 'home' })
+        }
+    }
+
+    return next()
+})
+
 export default router
diff --git a/src/services/authInterceptor.ts b/src/services/authInterceptor.ts
index 0b175e5abab8c805f71bab83cc5746d0bf750da7..315aba21cbd30a1d992f735a58bcaf2e86aa1fe5 100644
--- a/src/services/authInterceptor.ts
+++ b/src/services/authInterceptor.ts
@@ -33,28 +33,15 @@ authInterceptor.interceptors.response.use(
             !originalRequest._retry
         ) {
             originalRequest._retry = true
-            const refreshToken = localStorage.getItem('refreshToken')
-            axios
-                .post('/auth/renewToken', null, {
-                    headers: {
-                        Authorization: `Bearer ${refreshToken}`
-                    }
-                })
-                .then((response) => {
-                    sessionStorage.setItem('accessToken', response.data.accessToken)
-                    authInterceptor.defaults.headers['Authorization'] =
-                        `Bearer ${response.data.accessToken}`
-                    return authInterceptor(originalRequest)
-                })
-                .catch((err) => {
-                    router.push({ name: 'login' })
-                    return Promise.reject(err)
-                })
-        }
-        // Specific handler for 404 errors
-        if (error.response?.status === 404) {
-            console.error('Requested resource not found:', error.config.url)
-            // Optionally redirect or inform the user, depending on the context
+
+            sessionStorage.removeItem('accessToken')
+            const username = localStorage.getItem('spareStiUsername')
+
+            if (!username) {
+                await router.push({ name: 'login' })
+            } else {
+                await router.push({ name: 'login-bio', params: { username: username } })
+            }
         }
         return Promise.reject(error)
     }
diff --git a/src/stores/userConfigStore.ts b/src/stores/userConfigStore.ts
index c6c0ba84ff9725f568cdcad154af537ab3d29b80..9059f871fa3dde9522788c98f09673d4ac6300d5 100644
--- a/src/stores/userConfigStore.ts
+++ b/src/stores/userConfigStore.ts
@@ -60,13 +60,13 @@ export const useUserConfigStore = defineStore('userConfig', () => {
             })
     }
 
-    const postUserConfig = () => {
+    const postUserConfig = async () => {
         const payload = {
             experience: experience.value,
             motivation: motivation.value,
             challengeTypeConfigs: Array.from(challengeTypeConfigs.value)
         }
-        authInterceptor
+        await authInterceptor
             .post('/config/challenge', payload)
             .then((response) => {
                 console.log('Success:', response.data)
diff --git a/src/stores/userStore.ts b/src/stores/userStore.ts
index eff4fd1479cd1bf9b70c10e6650a054ae0b6321c..7191a75410b853eba212f46e1ba90fe4e2b1c32a 100644
--- a/src/stores/userStore.ts
+++ b/src/stores/userStore.ts
@@ -14,7 +14,8 @@ export const useUserStore = defineStore('user', () => {
     const defaultUser: User = {
         firstname: 'Firstname',
         lastname: 'Lastname',
-        username: 'Username'
+        username: 'Username',
+        isConfigured: false
     }
 
     const user = ref<User>(defaultUser)
@@ -30,7 +31,7 @@ export const useUserStore = defineStore('user', () => {
     ) => {
         await axios
             .post(`http://localhost:8080/auth/register`, {
-                firstName: firstname, //TODO rename all instances of firstname to firstName
+                firstName: firstname,
                 lastName: lastname,
                 email: email,
                 username: username,
@@ -38,13 +39,12 @@ export const useUserStore = defineStore('user', () => {
             })
             .then((response) => {
                 sessionStorage.setItem('accessToken', response.data.accessToken)
-                localStorage.setItem('refreshToken', response.data.refreshToken)
 
                 user.value.firstname = firstname
                 user.value.lastname = lastname
                 user.value.username = username
 
-                router.push({ name: 'addAlternativeLogin' })
+                router.push({ name: 'configure-biometric' })
             })
             .catch((error) => {
                 const axiosError = error as AxiosError
@@ -60,13 +60,22 @@ export const useUserStore = defineStore('user', () => {
             })
             .then((response) => {
                 sessionStorage.setItem('accessToken', response.data.accessToken)
-                localStorage.setItem('refreshToken', response.data.refreshToken)
 
                 user.value.firstname = response.data.firstName
                 user.value.lastname = response.data.lastName
                 user.value.username = response.data.username
 
-                router.push({ name: 'home' })
+                authInterceptor('/profile').then((profileResponse) => {
+                    if (profileResponse.data.hasPasskey === true) {
+                        localStorage.setItem('spareStiUsername', username)
+                    }
+                })
+
+                checkIfUserConfigured()
+
+                user.value.isConfigured
+                    ? router.push({ name: 'home' })
+                    : router.push({ name: 'configure-biometric' })
             })
             .catch((error) => {
                 const axiosError = error as AxiosError
@@ -77,160 +86,167 @@ export const useUserStore = defineStore('user', () => {
     const logout = () => {
         console.log('Logging out')
         sessionStorage.removeItem('accessToken')
-        localStorage.removeItem('refreshToken')
+        localStorage.removeItem('spareStiUsername')
         user.value = defaultUser
         router.push({ name: 'login' })
     }
-    const getUserStreak = async () => {
-        try {
-            const response = await authInterceptor('/profile/streak')
-            if (response.data) {
+
+    const getUserStreak = () => {
+        authInterceptor('/profile/streak')
+            .then((response) => {
                 streak.value = response.data
-                console.log('Fetched Challenges:', streak.value)
-            } else {
+            })
+            .catch((error) => {
+                console.error('Error fetching challenges:', error)
                 streak.value = undefined
-                console.error('No challenge content found:', response.data)
-            }
-        } catch (error) {
-            console.error('Error fetching challenges:', error)
-            streak.value = undefined // Ensure challenges is always an array
-        }
+            })
     }
 
     const bioRegister = async () => {
-        try {
-            const response = await authInterceptor.post('/auth/bioRegistration')
-            initialCheckStatus(response)
-
-            const credentialCreateJson: CredentialCreationOptions = response.data
-
-            const credentialCreateOptions: CredentialCreationOptions = {
-                publicKey: {
-                    ...credentialCreateJson.publicKey,
-                    challenge: base64urlToUint8array(
-                        credentialCreateJson.publicKey.challenge as unknown as string
-                    ),
-                    user: {
-                        ...credentialCreateJson.publicKey.user,
-                        id: base64urlToUint8array(
-                            credentialCreateJson.publicKey.user.id as unknown as string
-                        )
+        authInterceptor
+            .post('/auth/bioRegistration')
+            .then((response) => {
+                initialCheckStatus(response)
+
+                const credentialCreateJson: CredentialCreationOptions = response.data
+
+                const credentialCreateOptions: CredentialCreationOptions = {
+                    publicKey: {
+                        ...credentialCreateJson.publicKey,
+                        challenge: base64urlToUint8array(
+                            credentialCreateJson.publicKey.challenge as unknown as string
+                        ),
+                        user: {
+                            ...credentialCreateJson.publicKey.user,
+                            id: base64urlToUint8array(
+                                credentialCreateJson.publicKey.user.id as unknown as string
+                            )
+                        },
+                        excludeCredentials: credentialCreateJson.publicKey.excludeCredentials?.map(
+                            (credential) => ({
+                                ...credential,
+                                id: base64urlToUint8array(credential.id as unknown as string)
+                            })
+                        ),
+                        extensions: credentialCreateJson.publicKey.extensions
+                    }
+                }
+
+                return navigator.credentials.create(
+                    credentialCreateOptions
+                ) as Promise<PublicKeyCredential>
+            })
+            .then((publicKeyCredential) => {
+                const publicKeyResponse =
+                    publicKeyCredential.response as AuthenticatorAttestationResponse
+                const encodedResult = {
+                    type: publicKeyCredential.type,
+                    id: publicKeyCredential.id,
+                    response: {
+                        attestationObject: uint8arrayToBase64url(
+                            publicKeyResponse.attestationObject
+                        ),
+                        clientDataJSON: uint8arrayToBase64url(publicKeyResponse.clientDataJSON),
+                        transports: publicKeyResponse.getTransports?.() || []
                     },
-                    excludeCredentials: credentialCreateJson.publicKey.excludeCredentials?.map(
-                        (credential) => ({
-                            ...credential,
-                            id: base64urlToUint8array(credential.id as unknown as string)
-                        })
-                    ),
-                    extensions: credentialCreateJson.publicKey.extensions
+                    clientExtensionResults: publicKeyCredential.getClientExtensionResults()
                 }
-            }
-
-            const publicKeyCredential = (await navigator.credentials.create(
-                credentialCreateOptions
-            )) as PublicKeyCredential
-
-            const publicKeyResponse =
-                publicKeyCredential.response as AuthenticatorAttestationResponse
-            const encodedResult = {
-                type: publicKeyCredential.type,
-                id: publicKeyCredential.id,
-                response: {
-                    attestationObject: uint8arrayToBase64url(publicKeyResponse.attestationObject),
-                    clientDataJSON: uint8arrayToBase64url(publicKeyResponse.clientDataJSON),
-                    transports: publicKeyResponse.getTransports?.() || []
-                },
-                clientExtensionResults: publicKeyCredential.getClientExtensionResults()
-            }
-
-            await authInterceptor
-                .post('/auth/finishBioRegistration', { credential: JSON.stringify(encodedResult) })
-                .then((response) => {
-                    router.push({ name: 'configurations1' })
+
+                return authInterceptor.post('/auth/finishBioRegistration', {
+                    credential: JSON.stringify(encodedResult)
                 })
-        } catch (error) {
-            router.push({ name: 'configurations1' })
-            console.error(error)
-        }
+            })
+            .then(() => {
+                localStorage.setItem('spareStiUsername', user.value.username)
+            })
+            .catch((error) => {
+                console.error(error)
+            })
     }
 
-    const bioLogin = async (username: string) => {
-        try {
-            const request = await axios.post(`http://localhost:8080/auth/bioLogin/${username}`)
-
-            initialCheckStatus(request)
-            console.log(request)
-
-            const credentialGetJson: CredentialRequestOptions = request.data
-            console.log(credentialGetJson)
-
-            const credentialGetOptions: CredentialRequestOptions = {
-                publicKey: {
-                    ...credentialGetJson.publicKey,
-                    allowCredentials:
-                        credentialGetJson.publicKey.allowCredentials &&
-                        credentialGetJson.publicKey.allowCredentials.map((credential) => ({
-                            ...credential,
-                            id: base64urlToUint8array(credential.id as unknown as string)
-                        })),
-                    challenge: base64urlToUint8array(
-                        credentialGetJson.publicKey.challenge as unknown as string
-                    ),
-                    extensions: credentialGetJson.publicKey.extensions
+    const bioLogin = (username: string) => {
+        axios
+            .post(`http://localhost:8080/auth/bioLogin/${username}`)
+            .then((request) => {
+                initialCheckStatus(request)
+                console.log(request)
+
+                const credentialGetJson: CredentialRequestOptions = request.data
+                console.log(credentialGetJson)
+
+                const credentialGetOptions: CredentialRequestOptions = {
+                    publicKey: {
+                        ...credentialGetJson.publicKey,
+                        allowCredentials: credentialGetJson.publicKey.allowCredentials?.map(
+                            (credential) => ({
+                                ...credential,
+                                id: base64urlToUint8array(credential.id as unknown as string)
+                            })
+                        ),
+                        challenge: base64urlToUint8array(
+                            credentialGetJson.publicKey.challenge as unknown as string
+                        ),
+                        extensions: credentialGetJson.publicKey.extensions
+                    }
                 }
-            }
-
-            const publicKeyCredential = (await navigator.credentials.get(
-                credentialGetOptions
-            )) as PublicKeyCredential
-
-            // Extract response data based on the type of credential
-            const response = publicKeyCredential.response as AuthenticatorAssertionResponse
-
-            const encodedResult = {
-                type: publicKeyCredential.type,
-                id: publicKeyCredential.id,
-                response: {
-                    authenticatorData:
-                        response.authenticatorData &&
-                        uint8arrayToBase64url(response.authenticatorData),
-                    clientDataJSON:
-                        response.clientDataJSON && uint8arrayToBase64url(response.clientDataJSON),
-
-                    signature: response.signature && uint8arrayToBase64url(response.signature),
-                    userHandle: response.userHandle && uint8arrayToBase64url(response.userHandle)
-                },
-                clientExtensionResults: publicKeyCredential.getClientExtensionResults()
-            }
-            console.log(encodedResult)
-
-            await axios
-                .post(`http://localhost:8080/auth/finishBioLogin/${username}`, {
+
+                return navigator.credentials.get(
+                    credentialGetOptions
+                ) as Promise<PublicKeyCredential>
+            })
+            .then((publicKeyCredential) => {
+                const response = publicKeyCredential.response as AuthenticatorAssertionResponse
+
+                const encodedResult = {
+                    type: publicKeyCredential.type,
+                    id: publicKeyCredential.id,
+                    response: {
+                        authenticatorData:
+                            response.authenticatorData &&
+                            uint8arrayToBase64url(response.authenticatorData),
+                        clientDataJSON:
+                            response.clientDataJSON &&
+                            uint8arrayToBase64url(response.clientDataJSON),
+                        signature: response.signature && uint8arrayToBase64url(response.signature),
+                        userHandle:
+                            response.userHandle && uint8arrayToBase64url(response.userHandle)
+                    },
+                    clientExtensionResults: publicKeyCredential.getClientExtensionResults()
+                }
+                console.log(encodedResult)
+
+                return axios.post(`http://localhost:8080/auth/finishBioLogin/${username}`, {
                     credential: JSON.stringify(encodedResult)
                 })
-                .then((response) => {
-                    sessionStorage.setItem('accessToken', response.data.accessToken)
-                    localStorage.setItem('refreshToken', response.data.refreshToken)
+            })
+            .then((response) => {
+                sessionStorage.setItem('accessToken', response.data.accessToken)
 
-                    user.value.firstname = response.data.firstName
-                    user.value.lastname = response.data.lastName
-                    user.value.username = response.data.username
+                user.value.firstname = response.data.firstName
+                user.value.lastname = response.data.lastName
+                user.value.username = response.data.username
 
-                    router.push({ name: 'home' })
-                })
-                .catch((error) => {
-                    const axiosError = error as AxiosError
-                    errorMessage.value =
-                        (axiosError.response?.data as string) || 'An error occurred'
-                    console.log('hei :' + errorMessage.value)
-                })
-        } catch (error) {
-            // Handle errors
-            console.log(error)
-        }
+                router.push({ name: 'home' })
+            })
+            .catch((error) => {
+                console.error(error)
+            })
+    }
+
+    const checkIfUserConfigured = async () => {
+        await authInterceptor('/config')
+            .then((response) => {
+                console.log('User configured: ' + user.value.isConfigured)
+                user.value.isConfigured = response.data.challengeConfig != null
+            })
+            .catch(() => {
+                user.value.isConfigured = false
+            })
     }
 
     return {
+        user,
+        checkIfUserConfigured,
         register,
         login,
         logout,
diff --git a/src/types/profile.ts b/src/types/profile.ts
index 392aee69615beff857dc324e85cc4f77ea1f7911..db81234695be6575d7d4c528515e9f1facbc5883 100644
--- a/src/types/profile.ts
+++ b/src/types/profile.ts
@@ -16,4 +16,5 @@ export interface Profile {
         balance?: number
     }
     badges?: object[]
+    hasPasskey?: boolean
 }
diff --git a/src/types/user.ts b/src/types/user.ts
index a420d33a4deb8de0e12fb303edf205b3be5e703f..624188688f1bec4c544ebf3b4d21d50f4a2d9be9 100644
--- a/src/types/user.ts
+++ b/src/types/user.ts
@@ -2,4 +2,6 @@ export interface User {
     firstname: string
     lastname: string
     username: string
+    isConfigured: boolean
+    isBiometric?: boolean
 }
diff --git a/src/views/AddAlternativeLogin.vue b/src/views/AddAlternativeLogin.vue
deleted file mode 100644
index 554f09f25915282f5675244784a6bb212457d036..0000000000000000000000000000000000000000
--- a/src/views/AddAlternativeLogin.vue
+++ /dev/null
@@ -1,48 +0,0 @@
-<template>
-    <div class="alt-login-main">
-        <h1>Alternativ innlogging</h1>
-        <div class="img-div">
-            <img src="@/assets/bioAuthTouch.png" alt="bioAuthTouch" />
-            <img src="@/assets/bioAuthFace.png" alt="bioAuthFace" />
-        </div>
-        <h2>Vil du logge på med touch eller face id?</h2>
-        <div class="btn-div">
-            <button @click="router.push('konfigurasjonSteg1')">Senere</button>
-            <button @click="userStore.bioRegister()">OK</button>
-        </div>
-    </div>
-</template>
-<script setup lang="ts">
-import { useUserStore } from '@/stores/userStore'
-import router from '@/router'
-
-const userStore = useUserStore()
-</script>
-
-<style scoped>
-.alt-login-main {
-    max-width: 800px;
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-}
-
-.img-div {
-    display: flex;
-    justify-content: center;
-}
-
-img {
-    width: 30%;
-}
-
-img:first-child {
-    margin-right: 20px;
-}
-
-button {
-    margin: 10px;
-    width: 100px;
-    height: 40px;
-}
-</style>
diff --git a/src/views/BiometricLoginView.vue b/src/views/BiometricLoginView.vue
new file mode 100644
index 0000000000000000000000000000000000000000..1ffb51f09170c153890baa63a77110a08a7d915f
--- /dev/null
+++ b/src/views/BiometricLoginView.vue
@@ -0,0 +1,28 @@
+<script lang="ts" setup>
+import { useRoute } from 'vue-router'
+import router from '@/router'
+import { useUserStore } from '@/stores/userStore'
+
+const route = useRoute()
+const username = route.params.username as string
+
+const removeBioCredential = () => {
+    localStorage.removeItem('spareStiUsername')
+    router.push({ name: 'login' })
+}
+
+const bioLogin = () => {
+    useUserStore().bioLogin(username)
+}
+</script>
+
+<template>
+    <div class="flex flex-col items-center h-screen gap-5 my-10">
+        <h1>Hei {{ username }}, velkommen tilbake</h1>
+        <button @click="bioLogin">Biometrisk login</button>
+        <p>Ikke deg? Eller funker ikke biometrisk innlogging?</p>
+        <button @click="removeBioCredential">Logg inn med brukernavn og passord</button>
+    </div>
+</template>
+
+<style scoped></style>
diff --git a/src/views/ConfigAccountNumberView.vue b/src/views/ConfigAccountNumberView.vue
index 7841aa5e7c6f7c4e510a2c381e180cf3df700c33..1a7a4ae9d3951d390dc26cda9c2405a141e1b2f8 100644
--- a/src/views/ConfigAccountNumberView.vue
+++ b/src/views/ConfigAccountNumberView.vue
@@ -46,13 +46,13 @@
 </template>
 
 <script setup lang="ts">
-import { ref, computed } from 'vue'
+import { computed, ref } from 'vue'
 import { useUserConfigStore } from '@/stores/userConfigStore'
 import ContinueButtonComponent from '@/components/ContinueButtonComponent.vue'
 import router from '@/router'
 
 const MAX_DIGITS = 11
-const userConfig = useUserConfigStore()
+const userConfigStore = useUserConfigStore()
 
 const spendingAccount = ref('')
 const savingsAccount = ref('')
@@ -68,10 +68,11 @@ async function onButtonClick() {
     const savingAccountNumber = savingsAccount.value.replace(/\./g, '')
     const spendingAccountNumber = spendingAccount.value.replace(/\./g, '')
 
-    await userConfig.postAccount('SAVING', savingAccountNumber, 0)
-    await userConfig.postAccount('SPENDING', spendingAccountNumber, 0)
+    await userConfigStore.postAccount('SAVING', savingAccountNumber, 0)
+    await userConfigStore.postAccount('SPENDING', spendingAccountNumber, 0)
+    await userConfigStore.postUserConfig()
 
-    await router.push({ name: 'home' })
+    await router.push({ name: 'home', query: { firstLogin: 'true' } })
 }
 
 function restrictToNumbers(event: InputEvent, type: string) {
diff --git a/src/views/ConfigBiometricView.vue b/src/views/ConfigBiometricView.vue
new file mode 100644
index 0000000000000000000000000000000000000000..015ff20075da80e59a4bd5d15d6974663b8eced5
--- /dev/null
+++ b/src/views/ConfigBiometricView.vue
@@ -0,0 +1,22 @@
+<template>
+    <div class="flex flex-col justify-center items-center w-full gap-5 m-5">
+        <h1>Alternativ innlogging</h1>
+        <h3>Vil du legge til alternativ innlogging som biometrisk autentisering?</h3>
+        <div class="flex flex-row justify-center gap-10">
+            <img alt="bioAuthTouch" class="w-40 h-40" src="@/assets/bioAuthTouch.png" />
+            <img alt="bioAuthFace" class="w-40 h-40" src="@/assets/bioAuthFace.png" />
+        </div>
+        <div class="flex flex-col gap-5">
+            <button @click="userStore.bioRegister()">Legg til nå!</button>
+            <button @click="router.push('konfigurasjonSteg1')">Jeg gjør det senere</button>
+        </div>
+    </div>
+</template>
+<script setup lang="ts">
+import { useUserStore } from '@/stores/userStore'
+import router from '@/router'
+
+const userStore = useUserStore()
+</script>
+
+<style scoped></style>
diff --git a/src/views/ConfigSpendingItemsTotalAmountView.vue b/src/views/ConfigSpendingItemsTotalAmountView.vue
index 098ba86faec729bcbc8450ad91268d7e65d82536..366a3422a2299a21271c7733526b086475ac0c8e 100644
--- a/src/views/ConfigSpendingItemsTotalAmountView.vue
+++ b/src/views/ConfigSpendingItemsTotalAmountView.vue
@@ -93,7 +93,6 @@ const onButtonClick = async () => {
             parseFloat(amounts.value[index]) || 0
     })
 
-    userConfigStore.postUserConfig()
     await router.push({ name: 'configurations6' })
 }
 
diff --git a/src/views/FirstSavingChallengeView.vue b/src/views/FirstSavingChallengeView.vue
deleted file mode 100644
index 23cc78e8411420523f7b280e58da5ef88564005b..0000000000000000000000000000000000000000
--- a/src/views/FirstSavingChallengeView.vue
+++ /dev/null
@@ -1,112 +0,0 @@
-<template>
-    <div class="flex flex-col items-center justify-start min-h-screen px-4 text-center">
-        <div class="mb-20">
-            <div
-                class="flex flex-col items-center justify-start bg-white shadow-md rounded-lg p-16"
-                style="height: 530px; min-height: 500px; min-width: 400px; max-width: 400px"
-            >
-                <template v-if="!skipped && !accepted">
-                    <div class="mb-6 w-full text-left">
-                        <label for="savings-goal" class="block text-4xl font-bold mb-2"
-                            >Spareutfordring</label
-                        >
-                    </div>
-                    <div class="flex flex-col w-full mb-4">
-                        <button
-                            v-for="buttonText in buttonOptions"
-                            :key="buttonText"
-                            :class="[
-                                'mb-4 text-xl font-bold w-full rounded-lg py-3 px-4',
-                                selectedOptions.includes(buttonText)
-                                    ? 'bg-transparent border-2 border-[var(--green)]'
-                                    : 'bg-transparent border-2 border-gray-300'
-                            ]"
-                            @click="toggleOption(buttonText)"
-                        >
-                            {{ buttonText }}
-                        </button>
-                    </div>
-                    <div class="flex justify-between w-full mt-4 space-x-2">
-                        <button
-                            class="border-4 font-bold rounded-lg py-2 px-10 text-lg transition-all bg-[var(--green)] hover:brightness-90 active:brightness-75"
-                            @click="skip"
-                            style="margin-top: 29px"
-                        >
-                            Skip
-                        </button>
-                        <button
-                            :class="[
-                                'border-4 font-bold rounded-lg py-2 px-10 text-lg transition-all',
-                                {
-                                    'bg-[var(--green)] hover:brightness-90 active:brightness-75':
-                                        selectedOptions.length > 0
-                                },
-                                {
-                                    'opacity-60 bg-[rgba(149,227,93,0.6)] cursor-not-allowed':
-                                        selectedOptions.length === 0
-                                }
-                            ]"
-                            :disabled="selectedOptions.length === 0"
-                            @click="accept"
-                            style="margin-top: 29px"
-                        >
-                            Godta
-                        </button>
-                    </div>
-                </template>
-                <template v-else>
-                    <div class="flex justify-center items-center h-full">
-                        <div class="text-4xl font-bold">{{ acceptedMessage }}</div>
-                    </div>
-                </template>
-            </div>
-        </div>
-        <ContinueButtonComponent
-            :disabled="!skipped && !accepted"
-            @click="onButtonClick"
-            class="px-10 py-3 text-2xl font-bold self-end mb-32 mt-[-10px]"
-        ></ContinueButtonComponent>
-    </div>
-</template>
-
-<script setup lang="ts">
-import ContinueButtonComponent from '@/components/ContinueButtonComponent.vue'
-import router from '@/router'
-import { ref, watchEffect } from 'vue'
-
-const buttonOptions = ref(['Ikke kjøpe kaffe', 'Ikke kjøpe snus', 'Ikke kjøpe mat i kantina'])
-const selectedOptions = ref<string[]>([])
-const skipped = ref(false)
-const accepted = ref(false)
-
-const toggleOption = (option: string) => {
-    const index = selectedOptions.value.indexOf(option)
-    if (index === -1) {
-        selectedOptions.value.push(option)
-    } else {
-        selectedOptions.value.splice(index, 1)
-    }
-}
-
-const onButtonClick = () => {
-    router.push('/')
-}
-
-const skip = () => {
-    skipped.value = true
-}
-
-const accept = () => {
-    accepted.value = true
-}
-
-const acceptedMessage = ref('Du kan opprette spareutfordringer senere')
-
-watchEffect(() => {
-    if (accepted.value) {
-        acceptedMessage.value = 'Du har fått din første spareutfordring!'
-    } else if (skipped.value) {
-        acceptedMessage.value = 'Du kan opprette spareutfordringer senere'
-    }
-})
-</script>
diff --git a/src/views/FirstSavingGoalView.vue b/src/views/FirstSavingGoalView.vue
deleted file mode 100644
index bd28ba97b26defe4d241f903d973e542c9636717..0000000000000000000000000000000000000000
--- a/src/views/FirstSavingGoalView.vue
+++ /dev/null
@@ -1,142 +0,0 @@
-<template>
-    <div class="flex flex-col items-center justify-start min-h-screen px-4 text-center">
-        <div class="mb-20">
-            <div
-                class="flex flex-col items-center justify-center bg-white shadow-md rounded-lg p-16"
-                style="height: 530px; min-height: 500px; min-width: 400px; max-width: 400px"
-            >
-                <template v-if="!skipped && !accepted">
-                    <div class="mb-6 w-full text-left">
-                        <label for="savings-goal" class="block text-xl font-bold mb-2"
-                            >Jeg vil spare til:</label
-                        >
-                        <input
-                            type="text"
-                            id="savings-goal"
-                            v-model="savingsGoal"
-                            :class="{
-                                'border-[var(--green)]': savingsGoal.valueOf(),
-                                'border-gray-300': !savingsGoal.valueOf()
-                            }"
-                            class="border-2 block w-full rounded-md shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50 text-xl"
-                            placeholder=""
-                        />
-                    </div>
-                    <div class="mb-8 w-full flex items-center">
-                        <label for="amount" class="shrink-0 text-xl font-bold mr-2"
-                            >Jeg vil spare:</label
-                        >
-                        <input
-                            type="text"
-                            id="amount"
-                            v-model="rawAmount"
-                            :class="{
-                                'border-[var(--green)]': rawAmount.valueOf(),
-                                'border-gray-300': !rawAmount.valueOf()
-                            }"
-                            class="border-2 rounded-md shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50 text-xl mr-2 block w-full"
-                            placeholder=""
-                            min="0"
-                        />
-                        <span class="shrink-0 text-xl font-bold">kr</span>
-                    </div>
-                    <div class="w-full px-4 py-2">
-                        <img src="@/assets/penger.png" alt="Savings" class="mx-auto w-36 h-32" />
-                    </div>
-                    <div class="flex justify-between w-full mt-4 space-x-2">
-                        <button
-                            class="bg-[var(--green)] border-4 border-[var(--green)] hover:brightness-90 active:brightness-75 font-bold rounded-lg py-2 px-10 text-lg"
-                            @click="skip"
-                        >
-                            Skip
-                        </button>
-                        <button
-                            :class="[
-                                'border-4 font-bold rounded-lg py-2 px-10 text-lg transition-all',
-                                canAccept
-                                    ? 'bg-[var(--green)] hover:brightness-90 active:brightness-75'
-                                    : 'opacity-60 bg-gray-300 cursor-not-allowed'
-                            ]"
-                            :disabled="!canAccept"
-                            @click="accept"
-                        >
-                            Godta
-                        </button>
-                    </div>
-                </template>
-                <template v-else>
-                    <div
-                        class="flex justify-start items-center h-full min-h-[400px] min-w-[400px] max-w-[400px]"
-                    >
-                        <div class="text-4xl font-bold">{{ acceptedMessage }}</div>
-                    </div>
-                </template>
-            </div>
-        </div>
-        <ContinueButtonComponent
-            :disabled="!skipped && !accepted"
-            @click="onButtonClick"
-            class="px-10 py-3 text-lg font-bold self-end mb-80 mt-[-10px]"
-        ></ContinueButtonComponent>
-    </div>
-</template>
-
-<script setup lang="ts">
-import { computed, ref, watch, watchEffect } from 'vue'
-import ContinueButtonComponent from '@/components/ContinueButtonComponent.vue'
-import router from '@/router'
-
-const savingsGoal = ref('')
-const rawAmount = ref('')
-const skipped = ref(false)
-const accepted = ref(false)
-
-const validateAmount = () => {
-    const validPattern = /^(\d+)?(,\d*)?$/
-    if (!validPattern.test(rawAmount.value)) {
-        rawAmount.value = rawAmount.value.slice(0, -1)
-    } else if (rawAmount.value.includes(',')) {
-        rawAmount.value = rawAmount.value.replace(/,+/g, ',')
-    }
-}
-
-const checkNegative = () => {
-    const numericValue = parseFloat(rawAmount.value.replace(',', '.'))
-    if (numericValue < 0) {
-        rawAmount.value = ''
-    }
-}
-
-watch(rawAmount, validateAmount)
-watch(() => parseFloat(rawAmount.value.replace(',', '.')), checkNegative)
-
-const canAccept = computed(() => savingsGoal.value.trim() !== '' && rawAmount.value.trim() !== '')
-
-const skip = () => {
-    skipped.value = true
-    acceptedMessage.value = 'Du kan opprette sparemål senere'
-}
-
-const accept = () => {
-    if (canAccept.value) {
-        accepted.value = true
-        acceptedMessage.value = 'Du har fått ditt første sparemål!'
-    }
-}
-
-const onButtonClick = () => {
-    if (skipped.value || accepted.value) {
-        router.push('/forsteSpareutfordring')
-    }
-}
-
-const acceptedMessage = ref('')
-
-watchEffect(() => {
-    if (accepted.value) {
-        acceptedMessage.value = 'Du har fått ditt første sparemål!'
-    } else if (skipped.value) {
-        acceptedMessage.value = 'Du kan opprette sparemål senere'
-    }
-})
-</script>
diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue
index d8dfa5375f552fb9318961ec8001d1e984513106..41bac4d7ee0d692e22310ada68f2a84b210d549b 100644
--- a/src/views/HomeView.vue
+++ b/src/views/HomeView.vue
@@ -1,12 +1,21 @@
 <template>
     <div class="flex flex-col items-center max-h-[60vh] md:flex-row md:max-h-[80vh] mx-auto">
-        <div class="flex flex-col basis-1/3 order-last md:order-first md:basis-1/4 md:pl-10">
-            <InteractiveSpare
-                :speech="speech"
-                :direction="'right'"
-                :pngSize="15"
-                class="opacity-0 h-0 w-0 md:opacity-100 md:h-auto md:w-auto md:mx-auto md:my-20"
-            ></InteractiveSpare>
+        <div class="flex flex-col basis-1/3 order-last md:order-first md:basis-1/4 md:pl-1 mt-10">
+            <img
+                v-if="newSpeechAvailable"
+                alt="Varsel"
+                class="jump scale-x-[-1] w-1/12 h-1/12 ml-52 cursor-pointer z-10"
+                src="@/assets/varsel.png"
+            />
+            <div class="flex items-center">
+                <a @click="openInteractiveSpare" class="hover:bg-transparent z-20">
+                    <img
+                        alt="Spare"
+                        class="scale-x-[-1] md:h-5/6 md:w-5/6 w-2/3 h-2/3 cursor-pointer ml-14 md:ml-10"
+                        src="@/assets/spare.png"
+                    />
+                </a>
+            </div>
             <div class="flex flex-row gap-2 items-center mx-auto my-4 md:flex-col md:gap-4 md:m-8">
                 <ButtonAddGoalOrChallenge :buttonText="'Legg til sparemål'" :type="'goal'" />
                 <ButtonAddGoalOrChallenge
@@ -24,6 +33,18 @@
         </div>
         <savings-path :challenges="challenges" :goal="goal"></savings-path>
     </div>
+    <InteractiveSpare
+        :speech="speech"
+        :direction="'right'"
+        :pngSize="15"
+        :isModalOpen="isModalOpen"
+        class="opacity-0 h-0 w-0 md:opacity-100 md:h-auto md:w-auto"
+    ></InteractiveSpare>
+    <div class="fixed bottom-5 left-5">
+        <div @click="openHelp" class="hover:cursor-pointer">
+            <img alt="Hjelp" class="w-1/12" src="@/assets/hjelp.png" />
+        </div>
+    </div>
     <GeneratedChallengesModal v-show="showModal" @update:showModal="showModal = $event" />
 </template>
 
@@ -36,12 +57,15 @@ import type { Goal } from '@/types/goal'
 import { useGoalStore } from '@/stores/goalStore'
 import { useChallengeStore } from '@/stores/challengeStore'
 import SavingsPath from '@/components/SavingsPath.vue'
-import GeneratedChallengesModal from '@/components/GeneratedChallengesModal.vue'
+import router from '@/router'
 
 const showModal = ref(false)
 
 const goalStore = useGoalStore()
 const challengeStore = useChallengeStore()
+const isModalOpen = ref(false)
+const speech = ref<string[]>([])
+const newSpeechAvailable = ref(false)
 
 const challenges = ref<Challenge[]>([])
 const goals = ref<Goal[]>([])
@@ -60,6 +84,7 @@ onMounted(async () => {
     if (!lastModalShow || Date.now() - Number(lastModalShow) >= 24 * 60 * 60 * 1000) {
         showModal.value = true
     }
+    firstLoggedInSpeech()
 })
 
 // Define your speech array
@@ -69,5 +94,36 @@ const speechArray = [
     'Klikk på meg for å høre mer.'
 ]
 
-const speech = ref(speechArray)
+const openInteractiveSpare = () => {
+    // Check if there's new speech available before opening the modal.
+    if (newSpeechAvailable.value) {
+        isModalOpen.value = true // Open the modal
+        newSpeechAvailable.value = false // Reset the flag since the speech will now be displayed
+    }
+}
+const openHelp = () => {
+    speech.value = [
+        'Heisann, jeg er Spare!',
+        'Jeg skal hjelpe deg med å spare penger.',
+        'Du kan legge til sparemål og spareutfordringer!',
+        'Sammen kan vi spare penger og nå dine mål!'
+    ]
+    isModalOpen.value = true
+}
 </script>
+
+<style>
+@keyframes jump {
+    0%,
+    100% {
+        transform: translateY(0);
+    }
+    50% {
+        transform: translateY(-10px);
+    }
+}
+
+.jump {
+    animation: jump 0.6s infinite ease-in-out;
+}
+</style>
diff --git a/src/views/ManageGoalView.vue b/src/views/ManageGoalView.vue
index 89111da2adca167258778dfe594d564b73693427..a3a246c4497701c183f38a3cf9b953a461b895c2 100644
--- a/src/views/ManageGoalView.vue
+++ b/src/views/ManageGoalView.vue
@@ -99,7 +99,7 @@ const updateGoal = () => {
     authInterceptor
         .put(`/goals/${goalInstance.value.id}`, goalInstance.value)
         .then(() => {
-            router.push({ name: 'goals' })
+            router.back()
         })
         .catch((error) => {
             console.error(error)
diff --git a/src/views/EditProfileView.vue b/src/views/ManageProfileView.vue
similarity index 90%
rename from src/views/EditProfileView.vue
rename to src/views/ManageProfileView.vue
index 82da35481c774c789baffd3264b4a36cbbe45614..bf4b1e436ea03ef7a0a52a605e313a7b6402da79 100644
--- a/src/views/EditProfileView.vue
+++ b/src/views/ManageProfileView.vue
@@ -2,7 +2,7 @@
 import authInterceptor from '@/services/authInterceptor'
 import { computed, onMounted, ref } from 'vue'
 import type { Profile } from '@/types/profile'
-import CardTemplate from '@/views/CardTemplate.vue'
+import CardTemplate from '@/components/CardTemplate.vue'
 import router from '@/router'
 import ToolTip from '@/components/ToolTip.vue'
 import InteractiveSpare from '@/components/InteractiveSpare.vue'
@@ -27,14 +27,29 @@ const profile = ref<Profile>({
 const updatePassword = ref<boolean>(false)
 const confirmPassword = ref<string>('')
 const errorMessage = ref<string>('')
+const isModalOpen = ref(false)
 
-const nameRegex = /^[æÆøØåÅa-zA-Z,.'-][æÆøØåÅa-zA-Z ,.'-]{1,29}$/
+const nameRegex = /^[æÆøØåÅa-zA-Z,.'-][æÆøØåÅa-zA-Z ,.'-]{0,29}$/
 const emailRegex =
     /^[æÆøØåÅa-zA-Z0-9_+&*-]+(?:\.[æÆøØåÅa-zA-Z0-9_+&*-]+)*@(?:[æÆøØåÅa-zA-Z0-9-]+\.)+[æÆøØåÅa-zA-Z]{2,7}$/
-const usernameRegex = /^[ÆØÅæøåA-Za-z][æÆøØåÅA-Za-z0-9_]{2,29}$/
 const passwordRegex = /^(?=.*[0-9])(?=.*[a-zæøå])(?=.*[ÆØÅA-Z])(?=.*[@#$%^&+=!])(?=\S+$).{8,30}$/
 const accountNumberRegex = /^\d{11}$/
 
+const MAX_DIGITS = 11
+
+function restrictToNumbers(event: InputEvent, type: string) {
+    const inputValue = (event.target as HTMLInputElement)?.value
+    if (inputValue !== undefined) {
+        const sanitizedValue = inputValue.replace(/\D/g, '')
+        const truncatedValue = sanitizedValue.slice(0, MAX_DIGITS)
+        if (type === 'spending') {
+            profile.value.spendingAccount.accNumber = parseInt(truncatedValue)
+        } else {
+            profile.value.savingAccount.accNumber = parseInt(truncatedValue)
+        }
+    }
+}
+
 const isFirstNameValid = computed(
     () => nameRegex.test(profile.value.firstName) && profile.value.firstName
 )
@@ -42,7 +57,6 @@ const isLastNameValid = computed(
     () => nameRegex.test(profile.value.lastName) && profile.value.lastName
 )
 const isEmailValid = computed(() => emailRegex.test(profile.value.email))
-const isUsernameValid = computed(() => usernameRegex.test(profile.value.username))
 const isPasswordValid = computed(() => passwordRegex.test(profile.value.password || ''))
 const isSpendingAccountValid = computed(() =>
     accountNumberRegex.test(profile.value.spendingAccount.accNumber?.toString() || '')
@@ -57,7 +71,6 @@ const isFormInvalid = computed(
             isFirstNameValid,
             isLastNameValid,
             isEmailValid,
-            isUsernameValid,
             isSpendingAccountValid,
             isSavingAccountValid
         ].some((v) => !v.value) ||
@@ -158,21 +171,6 @@ const saveChanges = async () => {
                         type="text"
                     />
                 </div>
-                <div class="flex flex-col">
-                    <div class="flex flex-row justify-between mx-4">
-                        <p>Brukernavn*</p>
-                        <ToolTip
-                            :message="'Must start with a letter and can include numbers and underscores. 3-30 characters long.'"
-                        />
-                    </div>
-                    <input
-                        v-model="profile.username"
-                        :class="{ 'bg-green-200': isUsernameValid }"
-                        name="username"
-                        placeholder="Skriv inn brukernavn"
-                        type="text"
-                    />
-                </div>
                 <div class="flex flex-col">
                     <div class="flex flex-row justify-between mx-4">
                         <div class="flex flex-row gap-2">
@@ -210,6 +208,7 @@ const saveChanges = async () => {
                     :png-size="10"
                     :speech="['Her kan du endre på profilen din!']"
                     direction="left"
+                    :isModalOpen="isModalOpen"
                 />
 
                 <CardTemplate>
@@ -217,6 +216,7 @@ const saveChanges = async () => {
                         <p class="font-bold mx-3" v-text="'Brukskonto'" />
                     </div>
                     <input
+                        @input="restrictToNumbers($event as InputEvent, 'spending')"
                         v-model="profile.spendingAccount.accNumber"
                         :class="{ 'bg-green-200': isSpendingAccountValid }"
                         class="border-2 rounded-none rounded-b-xl w-full"
@@ -230,6 +230,7 @@ const saveChanges = async () => {
                         <p class="font-bold mx-3" v-text="'Sparekonto'" />
                     </div>
                     <input
+                        @input="restrictToNumbers($event as InputEvent, 'saving')"
                         v-model="profile.savingAccount.accNumber"
                         :class="{ 'bg-green-200': isSavingAccountValid }"
                         class="border-2 rounded-none rounded-b-xl w-full"
diff --git a/src/views/RegisterLoginView.vue b/src/views/RegisterLoginView.vue
index 738002afa9461e9df0acbd0f592b327303ec33ba..16d78619fdf348fd038c8858499065d46d11c923 100644
--- a/src/views/RegisterLoginView.vue
+++ b/src/views/RegisterLoginView.vue
@@ -2,9 +2,7 @@
 import FormLogin from '@/components/FormLogin.vue'
 import FormRegister from '@/components/FormRegister.vue'
 import { onMounted, ref } from 'vue'
-import { useRouter } from 'vue-router'
-
-const router = useRouter()
+import router from '@/router'
 
 const isLogin = ref<boolean>(true)
 
diff --git a/src/views/ViewChallengeView.vue b/src/views/ViewChallengeView.vue
index f7bf05e69a55a93bbb37f10f56a5b9a6f9f7370a..71b2a67e67c73f158626efb25d67a80bb0e78edc 100644
--- a/src/views/ViewChallengeView.vue
+++ b/src/views/ViewChallengeView.vue
@@ -29,6 +29,8 @@ const isCompleted = computed(() => challengeInstance.value.completedOn != null)
 
 const motivation = ref<string[]>([])
 
+const isModalOpen = ref(false)
+
 const calculateSpeech = () => {
     if (completion.value === 0) {
         return motivation.value.push(
@@ -140,7 +142,12 @@ const completeChallenge = () => {
                 </button>
             </div>
         </div>
-        <InteractiveSpare :png-size="10" :speech="motivation" direction="left" />
+        <InteractiveSpare
+            :png-size="10"
+            :speech="motivation"
+            direction="left"
+            :isModalOpen="isModalOpen"
+        />
     </div>
 </template>
 
diff --git a/src/views/ViewGoalView.vue b/src/views/ViewGoalView.vue
index a2e9b176009b30935987283ef7482ae1560eec34..50ec73bb87ee4c101808f113f552a58e90ca94db 100644
--- a/src/views/ViewGoalView.vue
+++ b/src/views/ViewGoalView.vue
@@ -20,6 +20,11 @@ const completion = computed(() => (goalInstance.value.saved / goalInstance.value
 const isCompleted = computed(() => goalInstance.value.completedOn != null)
 
 const motivation = ref<string[]>([])
+const isModalOpen = ref(false)
+
+const openInteractiveSpare = () => {
+    isModalOpen.value = true
+}
 
 const calculateSpeech = () => {
     if (completion.value === 0) {
@@ -126,7 +131,21 @@ const completeGoal = () => {
                 </button>
             </div>
         </div>
-        <InteractiveSpare :png-size="10" :speech="motivation" direction="left" />
+        <div class="flex items-center">
+            <a @click="openInteractiveSpare" class="hover:bg-transparent z-20">
+                <img
+                    alt="Spare"
+                    class="scale-x-[-1] md:h-5/6 md:w-5/6 w-2/3 h-2/3 cursor-pointer ml-14 md:ml-10"
+                    src="@/assets/spare.png"
+                />
+            </a>
+        </div>
+        <InteractiveSpare
+            :png-size="10"
+            :speech="motivation"
+            direction="left"
+            :isModalOpen="isModalOpen"
+        />
     </div>
 </template>
 
diff --git a/src/views/ProfileView.vue b/src/views/ViewProfileView.vue
similarity index 78%
rename from src/views/ProfileView.vue
rename to src/views/ViewProfileView.vue
index 436e522c7c815ad6cb5725724b76a8f76779d75d..9ef081c5a73b7ca11b27be61f827a8e3f33a7b14 100644
--- a/src/views/ProfileView.vue
+++ b/src/views/ViewProfileView.vue
@@ -2,19 +2,21 @@
 import authInterceptor from '@/services/authInterceptor'
 import { computed, onMounted, ref } from 'vue'
 import type { Profile } from '@/types/profile'
-import CardTemplate from '@/views/CardTemplate.vue'
+import CardTemplate from '@/components/CardTemplate.vue'
 import InteractiveSpare from '@/components/InteractiveSpare.vue'
 import type { Challenge } from '@/types/challenge'
 import type { Goal } from '@/types/goal'
 import CardGoal from '@/components/CardGoal.vue'
 import router from '@/router'
+import { useUserStore } from '@/stores/userStore'
 
 const profile = ref<Profile>()
 const completedGoals = ref<Goal[]>([])
 const completedChallenges = ref<Challenge[]>([])
+const isModalOpen = ref(false)
 
-onMounted(async () => {
-    await authInterceptor('/profile')
+const updateUser = async () => {
+    authInterceptor('/profile')
         .then((response) => {
             profile.value = response.data
             console.log(profile.value)
@@ -22,6 +24,10 @@ onMounted(async () => {
         .catch((error) => {
             return console.log(error)
         })
+}
+
+onMounted(async () => {
+    await updateUser()
 
     await authInterceptor(`/goals/completed?page=0&size=3`)
         .then((response) => {
@@ -40,9 +46,18 @@ onMounted(async () => {
         })
 })
 
+const updateBiometrics = async () => {
+    await useUserStore().bioRegister()
+    await updateUser()
+}
+
 const welcome = computed(() => {
     return [`Velkommen, ${profile.value?.firstName} ${profile.value?.lastName} !`]
 })
+
+const openInteractiveSpare = () => {
+    isModalOpen.value = true
+}
 </script>
 
 <template>
@@ -84,10 +99,27 @@ const welcome = computed(() => {
                 </CardTemplate>
 
                 <button @click="router.push({ name: 'edit-profile' })" v-text="'Rediger bruker'" />
+                <button @click="updateBiometrics">
+                    {{ profile?.hasPasskey ? 'Endre biometri' : 'Legg til biometri' }}
+                </button>
             </div>
 
             <div class="flex flex-col">
-                <InteractiveSpare :png-size="10" :speech="welcome" direction="left" />
+                <InteractiveSpare
+                    :png-size="10"
+                    :speech="welcome"
+                    direction="left"
+                    :isModalOpen="isModalOpen"
+                />
+                <div class="flex items-center">
+                    <a @click="openInteractiveSpare" class="hover:bg-transparent z-20">
+                        <img
+                            alt="Spare"
+                            class="scale-x-[-1] md:h-5/6 md:w-5/6 w-2/3 h-2/3 cursor-pointer ml-14 md:ml-10"
+                            src="@/assets/spare.png"
+                        />
+                    </a>
+                </div>
                 <div class="flex flex-row justify-between mx-4">
                     <p class="font-bold">Fullførte sparemål</p>
                     <a class="hover:p-0 cursor-pointer" v-text="'Se alle'" />