diff --git a/README.md b/README.md
index 32d8d5d59f6e3eb2eefd48ffa1cde67c8732408d..fe8f4c0a54d6cef05c1759f351d9bb20265e356b 100644
--- a/README.md
+++ b/README.md
@@ -1,93 +1,101 @@
 # idatt2106_2024_3_frontend
 
+<div align="center">
+  <h1 align="center">Sparesti</h1>
+  <h3 align="center">idatt2106_2024_3_frontend </h3>
+  <p align="center">
+  This is the frontend repository made by Magnus Rindal, Håkon Fredrik Fjellanger, Isak Kallestad Mandal, Sverre Frogner Haugen, Tini Tran, Torbjørn Antonsen, Vilde Min Vikan and Jens Martin Jahle, for the subject System Development with agile methods (IDATT2106) for the spring semester 2024.
+  </p>
+</div>
 
+## Description
 
-## Getting started
-
-To make it easy for you to get started with GitLab, here's a list of recommended next steps.
-
-Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
-
-## Add your files
-
-- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
-- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
+Sparesti is a web application that helps users save money by providing a platform for users to
+create and manage savings goals, perform challenges, and track their progress.
+The application is designed to be user-friendly and intuitive, making it easy for users to save
+money and reach their financial goals.
 
-```
-cd existing_repo
-git remote add origin https://gitlab.stud.idi.ntnu.no/scrum_team_3/idatt2106_2024_3_frontend.git
-git branch -M main
-git push -uf origin main
-```
+This repository contains the frontend code for the Sparesti application. The frontend is built using Vue and TypeScript, and it provides the user interface for the application.
+The frontend is responsible for displaying the user interface, handling user input, and communicating with the backend API. 
+The frontend is designed to be responsive and accessible, making it easy for users to interact with the application on any device.
 
-## Integrate with your tools
 
-- [ ] [Set up project integrations](https://gitlab.stud.idi.ntnu.no/scrum_team_3/idatt2106_2024_3_frontend/-/settings/integrations)
+## Badges
 
-## Collaborate with your team
+<a href="https://gitlab.stud.idi.ntnu.no/scrum_team_3/idatt2106_2024_03_frontend/-/commits/master"><img alt="pipeline status" src="https://gitlab.stud.idi.ntnu.no/scrum_team_3/idatt2106_2024_03_frontend/badges/master/pipeline.svg" /></a>
 
-- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
-- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
-- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
-- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
-- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
 
-## Test and Deploy
+<a href="https://gitlab.stud.idi.ntnu.no/scrum_team_3/idatt2106_2024_03_frontend/-/commits/master"><img alt="coverage report" src="https://gitlab.stud.idi.ntnu.no/scrum_team_3/idatt2106_2024_03_frontend/badges/master/coverage.svg" /></a>
 
-Use the built-in continuous integration in GitLab.
+## Visuals
 
-- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
-- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
-- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
-- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
-- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
+### Homepage
+![Homepage](src/assets/readmeImages/homepage.png)
+### Milestone Playthrough
+![ChallengePlaythrough](src/assets/readmeImages/challengePlaythrough.png)
+### Consumption Overview
+![ConsumptionOverview](src/assets/readmeImages/consumptionOverview.png)
 
-***
 
-# Editing this README
+## Installation and execution
 
-When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
+> **Note:** The backend repository must be running in order for the frontend to work as intended.
+> The backend repository can be found [here](https://gitlab.stud.idi.ntnu.no/scrum_team_3/idatt2106_2024_03_backend).
 
-## Suggestions for a good README
+### Prerequisites
 
-Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
+To run this program you need:
 
-## Name
-Choose a self-explaining name for your project.
+- Node.js
+- npm
 
-## Description
-Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
+### Installation
 
-## Badges
-On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
+1. Clone the repository using Git:
+   ```sh
+   git clone https://gitlab.stud.idi.ntnu.no/scrum_team_3/idatt2106_2024_03_frontend
+    ```
+   
+2. Alternatively, you can download the ZIP file and extract it.
+    https://gitlab.stud.idi.ntnu.no/scrum_team_3/idatt2106_2024_03_frontend/-/archive/master/idatt2106_2024_03_frontend-master.zip
 
-## Visuals
-Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
+### Running the repository
 
-## Installation
-Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
+1. Navigate to the root folder of the project
+2. Run the following command to install the necessary dependencies:
+   ```sh
+   npm install
+   ```
+3. Run the following command to start the frontend:
+   ```sh
+    npm run dev
+    ```
+4. The frontend should now be running on http://localhost:5173
 
 ## Usage
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
-
-## Support
-Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
 
-## Roadmap
-If you have ideas for releases in the future, it is a good idea to list them in the README.
+To use the application, open a web browser and navigate to http://localhost:5173.
+You can now create an account, log in, and start saving money by creating savings goals and performing challenges.
+You need to have the backend running in order to use the application as intended.
+Also note that the logged-in user must have a connection to our mock bank in order to use the application as intended.
+Use our test user with the following credentials:
 
-## Contributing
-State if you are open to contributions and what your requirements are for accepting them.
-
-For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
-
-You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
+- Username: JohnSmith12
+- Password: password
 
 ## Authors and acknowledgment
-Show your appreciation to those who have contributed to the project.
 
-## License
-For open source projects, say how it is licensed.
+This project was made by the following students at NTNU:
+
+Magnus Rindal,
+HÃ¥kon Fredrik Fjellanger,
+Isak Kallestad Mandal,
+Sverre Frogner Haugen,
+Tini Tran,
+Torbjørn Antonsen,
+Vilde Min Vikan and
+Jens Martin Jahle
 
 ## Project status
-If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
+This project is currently finished and will not be maintained.
+There are no plans to continue development on this project in the future.
\ No newline at end of file
diff --git a/src/App.vue b/src/App.vue
index ee6510a265ad8ef54e2ec8730091082d9dd9d676..472149180e58ae05416b5000646556a5c19c12f2 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -7,10 +7,21 @@ import { RouterView } from 'vue-router'
     <RouterView />
   </div>
 </template>
-<style scoped>
+<style>
 .app{
   height: 100vh;
   width: 100vw;
 }
 
+button:hover{
+  cursor: pointer;
+  h1:hover, h3:hover, h2:hover, h4:hover{
+    cursor: pointer;
+  }
+}
+
+h1:hover, h3:hover, h2:hover, h4:hover{
+  cursor: default;
+}
+
 </style>
diff --git a/src/assets/background/img.png b/src/assets/background/img.png
new file mode 100644
index 0000000000000000000000000000000000000000..7390e64ef1f3039e5d6f90262de6b03e723feb4a
Binary files /dev/null and b/src/assets/background/img.png differ
diff --git a/src/assets/readmeImages/challengePlaythrough.png b/src/assets/readmeImages/challengePlaythrough.png
new file mode 100644
index 0000000000000000000000000000000000000000..81b4fbb26e01240fcd19c0932ef7d3ff6a11f4aa
Binary files /dev/null and b/src/assets/readmeImages/challengePlaythrough.png differ
diff --git a/src/assets/readmeImages/consumptionOverview.png b/src/assets/readmeImages/consumptionOverview.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f0bfb476f22171b5acfc9f1043a0f3d0948f5fa
Binary files /dev/null and b/src/assets/readmeImages/consumptionOverview.png differ
diff --git a/src/assets/readmeImages/homepage.png b/src/assets/readmeImages/homepage.png
new file mode 100644
index 0000000000000000000000000000000000000000..b102194e9d9ad336e7057433b97375dce8de431d
Binary files /dev/null and b/src/assets/readmeImages/homepage.png differ
diff --git a/src/components/ProgressBar.vue b/src/components/ProgressBar.vue
index 516e8df78c80eadff5dedc81f3131467b5a89615..60f435f31bc66e205e615acf3307bfc28915b3ad 100644
--- a/src/components/ProgressBar.vue
+++ b/src/components/ProgressBar.vue
@@ -23,14 +23,14 @@
 <style scoped>
 
   #QuestionProgress{
-    width: 90%;
-    height: 10vh;
+    width: 100%;
+    height: 100%;
   }
 
   @media only screen and (max-width: 1000px) {
 
     #QuestionProgress{
-      width: 90vw;
+      width: 100%;
     }
   }
 </style>
\ No newline at end of file
diff --git a/src/components/__tests__/ActiveChallengeDisplay.spec.ts b/src/components/__tests__/ActiveChallengeDisplay.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9fc34f6d6468d963516702eed6ac0e6e3acdfa1c
--- /dev/null
+++ b/src/components/__tests__/ActiveChallengeDisplay.spec.ts
@@ -0,0 +1,68 @@
+import { mount } from '@vue/test-utils';
+import ActiveChallengeDisplay from '@/components/challenge/ActiveChallengeDisplay.vue';
+import { describe, it, expect } from 'vitest'
+
+describe('ActiveChallengeDisplay', () => {
+  it('emits challengeCompleted when complete button is clicked', async () => {
+    const challenge = {
+      challengeId: 1,
+      challengeTitle: 'Test Challenge',
+      challengeDescription: 'Description of test challenge',
+      goalSum: 100,
+      expirationDate: '2024-05-01'
+    };
+
+    const wrapper = mount(ActiveChallengeDisplay, {
+      props: {
+        challenge
+      }
+    });
+
+    await wrapper.find('.complete-button').trigger('click');
+
+    expect(wrapper.emitted('challengeCompleted')).toBeTruthy();
+    expect(wrapper.emitted('challengeCompleted')?.[0]?.[0]).toBe(challenge.challengeId);
+  });
+
+  it('emits challengeDeleted when delete button is clicked', async () => {
+    const challenge = {
+      challengeId: 1,
+      challengeTitle: 'Test Challenge',
+      challengeDescription: 'Description of test challenge',
+      goalSum: 100,
+      expirationDate: '2024-05-01'
+    };
+
+    const wrapper = mount(ActiveChallengeDisplay, {
+      props: {
+        challenge
+      }
+    });
+
+    await wrapper.find('.close-img').trigger('click');
+
+    expect(wrapper.emitted('challengeDeleted')).toBeTruthy();
+    expect(wrapper.emitted('challengeDeleted')?.[0]?.[0]).toBe(challenge.challengeId);
+  });
+
+  it('displays correct challenge information', () => {
+    const challenge = {
+      challengeId: 1,
+      challengeTitle: 'Test Challenge',
+      challengeDescription: 'Description of test challenge',
+      goalSum: 100,
+      expirationDate: '2024-05-01'
+    };
+
+    const wrapper = mount(ActiveChallengeDisplay, {
+      props: {
+        challenge
+      }
+    });
+
+    expect(wrapper.text()).toContain(challenge.challengeTitle);
+    expect(wrapper.text()).toContain(challenge.challengeDescription);
+    expect(wrapper.text()).toContain('Utløpsdato: 01/05/2024');
+    expect(wrapper.text()).toContain('Sparesum: 100kr');
+  });
+});
diff --git a/src/components/__tests__/ActiveMilestoneDisplay.spec.ts b/src/components/__tests__/ActiveMilestoneDisplay.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..77b69353f81d9806890d566ce16b2921832c3aa7
--- /dev/null
+++ b/src/components/__tests__/ActiveMilestoneDisplay.spec.ts
@@ -0,0 +1,64 @@
+import { mount } from '@vue/test-utils';
+import { describe, it, expect, beforeEach } from 'vitest'
+import { createPinia, setActivePinia } from 'pinia'
+import ActiveMilestoneDisplay from '../milestone/ActiveMilestoneDisplay.vue'
+import ProgressBar from '../ProgressBar.vue'
+
+describe('ActiveMilestoneDisplay', () => {
+
+  beforeEach(() => {
+    setActivePinia(createPinia())
+  })
+
+  const propsData = {
+    id: 1,
+    title: 'Test Milestone',
+    description: 'Test Description',
+    goalSum: 1000,
+    currentSum: 500,
+    deadline: new Date('2024-05-01'),
+    startDate: new Date('2024-04-01'),
+    image: 'test.jpg'
+  }
+
+  const id = 1;
+  const title = 'Test Milestone'
+  const description = 'Test Description'
+  const goalSum = 1000
+  const currentSum = 500
+  const deadline = new Date('2024-05-01')
+  const startDate = new Date('2024-04-01')
+  const image = 'test.jpg'
+
+  it('renders correctly', () => {
+    const wrapper = mount(ActiveMilestoneDisplay, {
+      props: { id, title, description, goalSum, currentSum, deadline, startDate, image }
+    })
+    expect(wrapper.find('.active-milestone-display').exists()).toBe(true)
+    expect(wrapper.find('.title').text()).toBe(propsData.title)
+    expect(wrapper.find('.description').text()).toBe(
+      `${propsData.currentSum}kr av ${propsData.goalSum}kr`
+    )
+    expect(wrapper.findComponent(ProgressBar).props('Max')).toBe(
+      propsData.goalSum
+    )
+    expect(wrapper.findComponent(ProgressBar).props('Current')).toBe(
+      propsData.currentSum
+    )
+  })
+
+  it('displays default image if image prop is not provided', async () => {
+    const wrapper = mount(ActiveMilestoneDisplay, {
+      props: { propsData }
+    })
+    await wrapper.setProps({ image: '' })
+
+    const imgElement = wrapper.find('img');
+
+    // Assert that the <img> element exists
+    expect(imgElement.exists()).toBe(true);
+
+    expect(imgElement.attributes('src')).toBe('/src/assets/background/img.png');
+  })
+
+});
diff --git a/src/components/__tests__/CompletedMilestoneDisplay.spec.ts b/src/components/__tests__/CompletedMilestoneDisplay.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c1f3248b1930a365140fe0fd61552835a9f34a74
--- /dev/null
+++ b/src/components/__tests__/CompletedMilestoneDisplay.spec.ts
@@ -0,0 +1,41 @@
+import { mount } from '@vue/test-utils';
+import CompletedMilestoneDisplay from '../milestone/CompletedMilestoneDisplay.vue'
+import { describe, it, expect } from 'vitest'
+import { nextTick } from 'vue'
+
+describe('CompletedMilestoneDisplay', () => {
+  it('renders with props', async () => {
+    const wrapper = mount(CompletedMilestoneDisplay, {
+      props: {
+        id: 1,
+        title: 'Test Title',
+        description: 'Test Description',
+        goalSum: 1000,
+        currentSum: 500,
+        deadline: new Date('2024-05-01'),
+        startDate: new Date('2024-04-01'),
+        image: 'test.jpg'
+      }
+    });
+
+    expect(wrapper.find('.title').text()).toBe('Test Title');
+
+    expect(wrapper.find('.info').exists()).toBe(true);
+    expect(wrapper.find('.info h4').text()).toBe('Du sparte 500kr av 1000kr');
+
+    await wrapper.trigger('mouseover');
+
+    await nextTick();
+
+    expect(wrapper.find('.info').exists()).toBe(true);
+    expect(wrapper.find('.info h4').text()).toBe('Du sparte 500kr av 1000kr');
+
+    await wrapper.trigger('mouseleave');
+
+    await nextTick();
+
+    expect(wrapper.find('.info').exists()).toBe(true);
+    expect(wrapper.find('.info h4').text()).toBe('Du sparte 500kr av 1000kr');
+  });
+
+});
diff --git a/src/components/__tests__/FirstTimeAnswers.spec.ts b/src/components/__tests__/FirstTimeAnswers.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..512378096c39b8b8379258e76d12061381bfbc41
--- /dev/null
+++ b/src/components/__tests__/FirstTimeAnswers.spec.ts
@@ -0,0 +1,19 @@
+import { setActivePinia, createPinia } from 'pinia'
+import { FirstTimeAnswersStore } from '../../stores/FirstTimeAnswers'
+import { describe, it, expect, beforeEach } from 'vitest'
+
+describe('FirstTimeAnswersStore', () => {
+    beforeEach(() => {
+        setActivePinia(createPinia())
+    })
+
+    it('Sets user answer at specific index', () => {
+        const answersStore = FirstTimeAnswersStore()
+
+        expect(answersStore.userResponses).toEqual([])
+        answersStore.setUserAnswer(0, 'First answer')
+        expect(answersStore.userResponses).toEqual(['First answer'])
+        answersStore.setUserAnswer(1, 'Second answer')
+        expect(answersStore.userResponses).toEqual(['First answer', 'Second answer'])
+    })
+})
diff --git a/src/components/__tests__/InactiveChallengeDisplay.spec.ts b/src/components/__tests__/InactiveChallengeDisplay.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..55addb13b76c2469f33959190a6196905300ce6f
--- /dev/null
+++ b/src/components/__tests__/InactiveChallengeDisplay.spec.ts
@@ -0,0 +1,34 @@
+import { mount } from '@vue/test-utils';
+import InactiveChallengeDisplay from '@/components/challenge/InactiveChallengeDisplay.vue';
+import { describe, it, expect, beforeEach } from 'vitest'
+import { createPinia, setActivePinia } from 'pinia'
+
+describe('InactiveChallengeDisplay', () => {
+
+  beforeEach(() => {
+    setActivePinia(createPinia())
+  })
+
+  it('renders challenge information correctly', () => {
+    const challenge = {
+      challengeId: 1,
+      challengeTitle: 'Test Challenge',
+      challengeDescription: 'Description of test challenge',
+      goalSum: 100,
+      expirationDate: '2024-05-01'
+    };
+
+    const wrapper = mount(InactiveChallengeDisplay, {
+      propsData: {
+        challenge // Pass challenge as propsData
+      }
+    });
+
+    expect(wrapper.find('.title').text()).toBe(challenge.challengeTitle);
+    expect(wrapper.find('.description').text()).toBe(challenge.challengeDescription);
+    expect(wrapper.find('.sum').text()).toContain(challenge.goalSum);
+    expect(wrapper.find('.info').text()).toContain('Utløpsdato:');
+    expect(wrapper.find('.info').text()).toContain('Sparesum:');
+  });
+
+});
diff --git a/src/components/__tests__/create-form/BaseInput.spec.ts b/src/components/__tests__/create-form/BaseInput.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..abf5a6074f0bf92eac2d2965d6b2eaab8824b931
--- /dev/null
+++ b/src/components/__tests__/create-form/BaseInput.spec.ts
@@ -0,0 +1,41 @@
+import { mount } from '@vue/test-utils'
+import BaseInput from '@/components/create-form/BaseInput.vue'
+import { describe, it, expect } from 'vitest'
+
+describe('BaseInput', () => {
+  it('renders correctly with props', async () => {
+    const label = 'Your Label'
+    const placeHolder = 'Your Placeholder'
+    const type = 'text'
+    const modelValue = 'Initial Value'
+
+    const wrapper = mount(BaseInput, {
+      props: {
+        label,
+        placeHolder,
+        type,
+        modelValue
+      }
+    })
+
+    expect(wrapper.find('label').text()).toBe(label)
+
+    const input = wrapper.find('input')
+    expect(input.attributes('placeholder')).toBe(placeHolder)
+    expect(input.attributes('type')).toBe(type)
+    expect(input.element.value).toBe(modelValue)
+
+    // Simulate input
+    const newValue = 'New Value'
+    await input.setValue(newValue)
+
+    const emittedEvents = wrapper.emitted()
+    expect(emittedEvents).toBeTruthy()
+
+    const updateModelValueEvents = emittedEvents['update:modelValue'] as any[]
+    expect(updateModelValueEvents).toBeTruthy()
+
+    const newValueEmitted = updateModelValueEvents[0][0]
+    expect(newValueEmitted).toBe(newValue)
+  })
+})
diff --git a/src/components/__tests__/create-form/BaseTextArea.spec.ts b/src/components/__tests__/create-form/BaseTextArea.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..07c9a5eb4069f8ae26a51f33d793817e8b6502b6
--- /dev/null
+++ b/src/components/__tests__/create-form/BaseTextArea.spec.ts
@@ -0,0 +1,37 @@
+import { mount } from '@vue/test-utils'
+import { describe, it, expect } from 'vitest'
+import BaseTextArea from '@/components/create-form/BaseTextArea.vue'
+
+describe('BaseTextArea', () => {
+  it('renders correctly with props', async () => {
+    const label = 'Your Label'
+    const placeHolder = 'Your Placeholder'
+    const modelValue = 'Initial Value'
+
+    const wrapper = mount(BaseTextArea, {
+      props: {
+        label,
+        placeHolder,
+        modelValue
+      }
+    })
+
+    expect(wrapper.find('label').text()).toBe(label)
+
+    const textarea = wrapper.find('textarea')
+    expect(textarea.attributes('placeholder')).toBe(placeHolder)
+    expect(textarea.element.value).toBe(modelValue)
+
+    const newValue = 'New Value'
+    await textarea.setValue(newValue)
+
+    const emittedEvents = wrapper.emitted()
+    expect(emittedEvents).toBeTruthy()
+
+    const updateModelValueEvents = emittedEvents['update:modelValue'] as any[]
+    expect(updateModelValueEvents).toBeTruthy()
+
+    const newValueEmitted = updateModelValueEvents[0][0]
+    expect(newValueEmitted).toBe(newValue)
+  })
+})
diff --git a/src/components/__tests__/economy/ToggleButton.spec.ts b/src/components/__tests__/economy/ToggleButton.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..30d04e0829a9996e2f97bf7210e427f2cfdded2e
--- /dev/null
+++ b/src/components/__tests__/economy/ToggleButton.spec.ts
@@ -0,0 +1,30 @@
+import { describe, it, expect } from 'vitest'
+import { mount } from '@vue/test-utils'
+import ToggleButton from '@/components/economy/ToggleButton.vue'
+
+describe('ToggleButton', () => {
+  it('toggles chart visibility when clicked', async () => {
+
+    const wrapper = mount(ToggleButton) as any
+    expect(wrapper.vm.chartVisible).toBe(false)
+    await wrapper.find('input[type="checkbox"]').trigger('change')
+    expect(wrapper.vm.chartVisible).toBe(true)
+  })
+
+  it('emits toggle-chart event when clicked', async () => {
+    const wrapper = mount(ToggleButton) as any
+    // Simulate clicking the toggle button
+    await wrapper.find('input[type="checkbox"]').trigger('change')
+    const emittedEvents = wrapper.emitted()
+    expect(emittedEvents).toBeTruthy()
+    const toggleChartEmit = emittedEvents['toggle-chart'] as any[] // Type assertion to any[]
+    expect(toggleChartEmit).toBeTruthy()
+    expect(wrapper.vm.chartVisible).toBe(true)
+
+    await wrapper.find('input[type="checkbox"]').trigger('change')
+
+
+    expect(wrapper.emitted('toggle-chart')).toBeTruthy()
+    expect(toggleChartEmit[1][0]).toBe(false)
+  })
+})
diff --git a/src/components/__tests__/economy/TransactionComponent.spec.ts b/src/components/__tests__/economy/TransactionComponent.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9e21ac448ed0aa7e286dd56adc71d7ac38c0cab7
--- /dev/null
+++ b/src/components/__tests__/economy/TransactionComponent.spec.ts
@@ -0,0 +1,63 @@
+import { mount } from '@vue/test-utils'
+import TransactionComponent from '@/components/economy/TransactionComponent.vue'
+import { describe, it, expect } from 'vitest'
+describe('TransactionComponent', () => {
+  it('renders correctly with props', async () => {
+    // Define props for testing
+    const title = 'Test Title'
+    const date = '2024-04-29'
+    const amount = 100
+    const category = 'Test Category'
+
+    // Mount the component with props
+    const wrapper = mount(TransactionComponent, {
+      props: {
+        title,
+        date,
+        amount,
+        category
+      }
+    })
+
+    // title rendering
+    const titleElement = wrapper.find('.component-title')
+    if (titleElement.exists()) {
+      expect(titleElement.text()).toContain(title)
+    } else {
+      throw new Error('Title element not found');
+    }
+
+    // Find all component-right-field elements
+    const rightFieldElements = wrapper.findAll('.component-right-field')
+
+    // Check if elements exist and have expected text content
+    if (rightFieldElements.length >= 3) {
+      // date rendering
+      const dateElement = rightFieldElements.at(0)
+      if (dateElement) {
+        expect(dateElement.text()).toContain(date)
+      } else {
+        throw new Error('Date element not found');
+      }
+
+      // amount rendering
+      const amountElement = rightFieldElements.at(1)
+      if (amountElement) {
+        expect(amountElement.text()).toContain(`${amount}kr`)
+      } else {
+        throw new Error('Amount element not found');
+      }
+
+      // category rendering
+      const categoryElement = rightFieldElements.at(2)
+      if (categoryElement) {
+        expect(categoryElement.text()).toContain(category)
+      } else {
+        throw new Error('Category element not found');
+      }
+    } else {
+      throw new Error('Expected elements not found');
+    }
+  })
+
+})
diff --git a/src/components/__tests__/milestonePath/MilestoneButton.spec.ts b/src/components/__tests__/milestonePath/MilestoneButton.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..523f41f1da2808eab47f688a7d06dd81c7fc67cf
--- /dev/null
+++ b/src/components/__tests__/milestonePath/MilestoneButton.spec.ts
@@ -0,0 +1,24 @@
+import { describe, it, expect } from 'vitest'
+import { mount } from '@vue/test-utils'
+import MilestoneButton from '@/components/MilestonePath/MilestoneButton.vue'
+
+describe('MilestoneButton', () => {
+  it('renders correctly with props', async () => {
+    const label = 'Save'
+    const buttonColor = 'blue'
+
+    const wrapper = mount(MilestoneButton, {
+      props: {
+        label,
+        buttonColor
+      }
+    })
+    // label rendering
+    expect(wrapper.text()).toContain(label)
+    expect(wrapper.text()).toBe('Save')
+
+    // button color
+    const buttonElement = wrapper.find('.save-button').element as HTMLElement
+    expect(buttonElement.style?.backgroundColor).toBe(buttonColor)
+  })
+})
diff --git a/src/components/challenge/ActiveChallengeDisplay.vue b/src/components/challenge/ActiveChallengeDisplay.vue
index 4923e3b821ed1cc2455233abd23c5ceea65deed8..0af09d7737e481f324fb8fa01883270dd106969b 100644
--- a/src/components/challenge/ActiveChallengeDisplay.vue
+++ b/src/components/challenge/ActiveChallengeDisplay.vue
@@ -14,8 +14,10 @@ const props = defineProps({
   challenge: {
     type: Object as () => Challenge,
     required: true
-  }
+  },
+  expanded: Boolean
 });
+
 const expirationDate = () => {
   return new Date(props.challenge?.expirationDate).
   toLocaleDateString('en-GB', { day: '2-digit', month: '2-digit', year: 'numeric' });
@@ -43,14 +45,21 @@ const deleteTheChallenge = () => {
       src="/src/components/icons/navigation/close.svg"
       alt="delete-button"
       @click="deleteTheChallenge()">
+    <h3 class="title">{{ props.challenge.challengeTitle }}</h3>
+
     <div class="content">
-      <h3 class="title">{{ props.challenge.challengeTitle }}</h3>
-      <h4 class="description">{{ props.challenge.challengeDescription }}</h4>
+      <div class="description-container">
+        <h4 class="description-title">Beskrivelse</h4>
+        <img src="/src/components/icons/navigation/info.svg" alt="show-more" class="show-more-icon">
+        <div class="description" :class="{'expanded':expanded}">
+          <h4 class="description-info" >{{ props.challenge.challengeDescription}}</h4>
+        </div>
+      </div>
       <div class="extra-info">
-        <h4 class="expiration-date">Utløpsdato: {{expirationDate()}} |</h4>
-        <h4 class="sum"> Sparesum: {{props.challenge.goalSum}} kr,-</h4>
+        <h4 class="expiration-date">Utløpsdato: {{expirationDate()}} | Sparesum: {{props.challenge.goalSum}}kr</h4>
       </div>
     </div>
+
     <div class="button-container">
       <button class="complete-button" @click="completeTheChallenge()">
         <h3 class="complete-button-text">Fullfør</h3>
@@ -65,17 +74,15 @@ const deleteTheChallenge = () => {
   display: flex;
   flex-direction: column;
   place-items: end;
-  place-content: space-between;
+  height: 100%;
+  width: 100%;
   padding: 1.5%;
-  gap: 1.0%;
 }
 
-.content{
-  display: flex;
-  flex-direction: column;
-  width: 100%;
-  height: 65%;
+h1:hover, h3:hover, h2:hover, h4:hover{
+  cursor: pointer;
 }
+
 .close-img{
   width: 5.0%;
 }
@@ -85,58 +92,72 @@ const deleteTheChallenge = () => {
 }
 
 .title{
+  width: 100%;
   text-align: center;
-
   color: var(--color-text-black);
 }
 
-.description{
+.content{
+  display: flex;
+  flex-direction: column;
+  place-items: center;
+  place-content: space-between;
+  width: 100%;
+  height: 75%;
+}
+
+.description-container{
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+}
+
+.description-title{
+  text-decoration: underline;
   text-align: center;
-  color: var(--color-text-black);
-  overflow: hidden;
+}
+
+.show-more-icon{
+  height: 1.5vh;
 }
 
 .extra-info{
-  display: none;
+  display: flex;
+  flex-direction: row;
+  place-content: center;
+  gap: 1.0%;
 }
 
 .expiration-date{
   color: var(--color-text-black);
 }
 
-.sum{
+.description{
+  display: none;
+  place-content: center;
   color: var(--color-text-black);
 }
 
-.potential-challenge-display:hover{
-  .extra-info{
-    display: flex;
-    flex-direction: row;
-    place-content: center;
-    gap: 1.0%;
-  }
-
-  .content{
-    overflow: scroll;
-  }
-
-  .description{
-    overflow: visible;
-  }
+.expanded{
+  display: flex;
+  place-content: center;
+}
 
+.description-info{
+  text-align: center;
+  color: var(--color-text-black);
 }
 
 .button-container{
+  margin-top: 1.5%;
   display: flex;
   width: 100%;
-  height: 25%;
   place-content: center;
 }
 
 .complete-button{
   border-radius: 20px;
   width: 50%;
-  height: 100%;
   border: none;
   background-color: var(--color-save-button);
 }
@@ -154,30 +175,4 @@ const deleteTheChallenge = () => {
   font-weight: bold;
 }
 
-@media only screen and (max-width: 1000px){
-  .extra-info{
-    display: flex;
-    flex-direction: row;
-    place-content: center;
-    gap: 1.0%;
-  }
-  .potential-challenge-display:hover{
-    .description{
-      text-align: center;
-      color: var(--color-text-black);
-    }
-  }
-
-  .potential-challenge-display:hover{
-    .extra-info{
-      display: flex;
-      flex-direction: row;
-      place-content: center;
-      gap: 1.0%;
-    }
-  }
-}
-
-
-
 </style>
\ No newline at end of file
diff --git a/src/components/challenge/ActiveChallengesList.vue b/src/components/challenge/ActiveChallengesList.vue
index 0bd1736cc4595306248f5a7c82f840649967fb51..94c531da55fb3f6f20f0cb383f809ed9259a4dc8 100644
--- a/src/components/challenge/ActiveChallengesList.vue
+++ b/src/components/challenge/ActiveChallengesList.vue
@@ -29,7 +29,9 @@ const activeChallenges = ref<Challenge[]>([])
 const challengeToBeCompleted = ref<number|any>(null)
 const challengeToBeDeleted = ref<number|any>(null)
 
-const SIZE = 4
+const expandedChallengeId = ref<number>(-1);
+
+const SIZE = 3
 const pages = ref<number>(1)
 const currentPage = ref<number>(0)
 
@@ -72,6 +74,7 @@ const closeDeletePopUp = async () => {
 }
 
 const handleChallengeCompleted = async () => {
+  eventBus.emit('updateMilestones');
   await closePopUp();
   await jsConfetti.addConfetti();
   await fetchActiveChallenges();
@@ -93,6 +96,14 @@ const nextPage = () =>{
   currentPage.value ++;
 }
 
+const toggleMilestoneHeight = (id: number) => {
+  if(expandedChallengeId.value == id){
+    expandedChallengeId.value = -1;
+  } else {
+    expandedChallengeId.value = id;
+  }
+};
+
 eventBus.on('updateChallenges', () => {
   fetchActiveChallenges();
 });
@@ -123,10 +134,13 @@ watch(currentPage, fetchActiveChallenges);
       <ActiveChallengeDisplay
         class="active-challenge"
         v-for="(activeChallenge, index) in activeChallenges"
+        :class="{'expanded': expandedChallengeId == activeChallenge.challengeId}"
         :key="index"
         :challenge="activeChallenge"
+        :expanded="expandedChallengeId == activeChallenge.challengeId"
         @challengeCompleted="handleRequestToCompleteChallenge(activeChallenge.challengeId)"
         @challengeDeleted ="handleRequestToDeleteChallenge(activeChallenge.challengeId)"
+        @click="toggleMilestoneHeight(activeChallenge.challengeId)"
       ></ActiveChallengeDisplay>
       <h4 class="challenge-placeholder" id="active-challenge-placeholder" v-if="activeChallenges.length == 0">
         Du har ingen aktive utfordringer.<br>
@@ -134,6 +148,7 @@ watch(currentPage, fetchActiveChallenges);
         Aktive utfordringer vil vises i denne boksen.
       </h4>
     </div>
+
     <div class="pagination">
       <button @click="previousPage" :disabled="currentPage === 0">Forige side</button>
       <div  v-if="pages>1" class="page-numbers">
@@ -169,20 +184,16 @@ watch(currentPage, fetchActiveChallenges);
 .active-challenge-component{
   display: flex;
   flex-direction: column;
-
   height: 100%;
   width: 100%;
-
   padding: 5.0%;
   gap: 2.5%;
-
-  place-content: space-between;
 }
 
 .active-challenges{
   display: flex;
   flex-direction: column;
-  height: 100%;
+  height: 90%;
   width: 100%;
   gap:2.5%
 }
@@ -192,13 +203,19 @@ watch(currentPage, fetchActiveChallenges);
   border: 2px solid var(--color-border);
   background-color: var(--color-background-white);
 
-  min-height: calc(calc(100% - 2.5*4%)/4);
+  height: calc(calc(100% - 2.5*2%)/3);
   width: 100%;
 }
 
 .active-challenge:hover{
-  transform: scale(1.05);
+  transform: scale(1.02);
+  cursor: pointer;
 }
+
+.expanded{
+  height: calc(calc(calc(100% - 2.5*2%)/3)*1.5);
+}
+
 #active-challenge-placeholder{
   color: var(--color-headerText);
 }
@@ -211,6 +228,7 @@ watch(currentPage, fetchActiveChallenges);
   justify-content: center;
   align-items: center;
   width: 100%;
+  height: 10%;
   flex: 1;
 }
 
diff --git a/src/components/challenge/InactiveChallengeDisplay.vue b/src/components/challenge/InactiveChallengeDisplay.vue
index 068dbdfef5615ad33b92ecba1b925c45aaf731e5..9109da5069feaebe8bc147d77bf9699abbc84b1e 100644
--- a/src/components/challenge/InactiveChallengeDisplay.vue
+++ b/src/components/challenge/InactiveChallengeDisplay.vue
@@ -97,7 +97,6 @@ const acceptChallenge = async () => {
   gap: 1.0%;
 }
 
-
 .options{
   display: flex;
   flex-direction: row;
diff --git a/src/components/icons/navigation/info.svg b/src/components/icons/navigation/info.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6e54744227ee65e826ddc523587dedb6027d7303
--- /dev/null
+++ b/src/components/icons/navigation/info.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
+<svg fill="#000000" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" 
+	 viewBox="0 0 330 330" xml:space="preserve">
+<path id="XMLID_225_" d="M325.607,79.393c-5.857-5.857-15.355-5.858-21.213,0.001l-139.39,139.393L25.607,79.393
+	c-5.857-5.857-15.355-5.858-21.213,0.001c-5.858,5.858-5.858,15.355,0,21.213l150.004,150c2.813,2.813,6.628,4.393,10.606,4.393
+	s7.794-1.581,10.606-4.394l149.996-150C331.465,94.749,331.465,85.251,325.607,79.393z"/>
+</svg>
\ No newline at end of file
diff --git a/src/components/milestone/ActiveMilestoneDisplay.vue b/src/components/milestone/ActiveMilestoneDisplay.vue
index 127924ed10b1ccaf1ef554d916fc8bc5673c463c..fe49971453bc3bb340c00adf995707e82825046f 100644
--- a/src/components/milestone/ActiveMilestoneDisplay.vue
+++ b/src/components/milestone/ActiveMilestoneDisplay.vue
@@ -13,34 +13,52 @@ const props = defineProps({
   startDate: Date,
   image: String
 });
-const imageUrl = "src/assets/pig.png"
 
 const openMilestone = () => {
   if (props.id !== undefined) {
-     useMilestoneStore().setMilestoneId(props.id)
+    useMilestoneStore().setMilestoneId(props.id)
     router.push("/homepage/path")
-
-    console.log(useMilestoneStore().$state.milestoneId)
   }
   console.log("Milestone id is not defined")
 }
 
+const daysLeft = () => {
+  if(props.deadline){
+    const today = new Date();
+    const deadlineDate = new Date(props.deadline);
+    // Calculate the difference in milliseconds
+    const differenceMs = deadlineDate.getTime() - today.getTime();
+    // Check if deadline is in the future
+    if (differenceMs > 0) {
+      // Convert milliseconds to days
+      return Math.ceil(differenceMs / (1000 * 60 * 60 * 24));
+    } else {
+      return 0; // Deadline has passed
+    }
+  }
+  return 0; // No deadline specified
+}
+
+const isToExpire = () => {
+  return (daysLeft() <= 7)
+}
 
 </script>
 
 <template>
-<div class="active-milestone-display"
-     @click="openMilestone"
-     @keyup.enter="openMilestone"
-     tabindex="0"
-     :style="{
-            backgroundImage: image ? 'url(' + image + ')' : 'url(' + imageUrl + ')'
-        }">
-  <h2 class="title">{{props.title}}</h2>
-  <div class="progress">
-  <h4 class="description" v-if="goalSum&&currentSum">{{props.currentSum}}kr av {{props.goalSum}}kr</h4>
-   <ProgressBar class="progress-bar" :Max="goalSum || 0" :Current="currentSum || 0"/>
+<div class="active-milestone-display" @click="openMilestone">
+  <h2 class="title" :class="{'expire': isToExpire()}">{{props.title}}</h2>
+  <div class="img">
+    <img src="/src/assets/background/img.png" alt="milestone-img" class="milestone-img">
+  </div>
+
+  <div class="progress-description">
+    <h4 class="description" v-if="goalSum&&currentSum">{{props.currentSum}}kr av {{props.goalSum}}kr</h4>
+    <h4 class="description" :class="{'expire': isToExpire()}">Dager igjen: {{daysLeft()}}</h4>
   </div>
+
+  <ProgressBar class="progress-bar" :Max="goalSum || 0" :Current="currentSum || 0"/>
+
 </div>
 </template>
 
@@ -49,20 +67,49 @@ const openMilestone = () => {
   display:flex;
   flex-direction: column;
   place-content: space-between;
+  height: 100%;
+  width: 100%;
   padding: 1.5%;
 }
+
+h1:hover, h3:hover, h2:hover, h4:hover{
+  cursor: pointer;
+}
+
 .title{
   text-align: left;
 }
+
+.img{
+  display: flex;
+  height: 100%;
+  width: 100%;
+  border-radius: 20px;
+  place-content: center;
+  place-items: center;
+  background-color: lightgrey;
+  overflow: hidden;
+}
+
+.milestone-img{
+  display: flex;
+  width: 100%;
+}
+
 .description{
   text-align: left;
-
 }
-.progress{
+.progress-description{
   display: flex;
-  flex-direction: column;
+  flex-direction: row;
   place-content: space-between;
-  gap: 2.5%;
-  transition: 0.3s;
+}
+
+.expire{
+  color: var(--color-text-error);
+}
+
+.progress-bar{
+  width: 100%;
 }
 </style>
\ No newline at end of file
diff --git a/src/components/milestone/ActiveMilestonesList.vue b/src/components/milestone/ActiveMilestonesList.vue
index 416bc7d15a2146945e8b0e55dda9582f89dcaa24..ac19d642984dd3f750d35f5e70cdd5325d17cbdb 100644
--- a/src/components/milestone/ActiveMilestonesList.vue
+++ b/src/components/milestone/ActiveMilestonesList.vue
@@ -4,6 +4,7 @@ import ActiveMilestoneDisplay from '@/components/milestone/ActiveMilestoneDispla
 import { onMounted, ref } from 'vue'
 import { useTokenStore } from '@/stores/token'
 import { getAllMilestonesPaginated } from '@/utils/MilestoneUtils'
+import eventBus from '@/components/service/eventBus.js'
 
 interface Milestone{
   milestoneId: number;
@@ -25,6 +26,7 @@ const pages = ref<number>(1)
 const SIZE = 3
 
 onMounted( () => {
+  currentPage.value = 0;
   fetchActiveMilestones();
 })
 
@@ -54,6 +56,11 @@ const nextPage = () =>{
   fetchActiveMilestones();
 }
 
+eventBus.on('updateMilestones', () => {
+  fetchActiveMilestones();
+});
+
+
 </script>
 
 <template>
@@ -110,7 +117,7 @@ const nextPage = () =>{
   display: flex;
   flex-direction: column;
   width: 100%;
-  height: 100%;
+  height: 90%;
 
   gap: 2.5%;
 }
@@ -120,21 +127,21 @@ const nextPage = () =>{
   border: 2px solid var(--color-border);
   box-shadow: 0 4px 4px var(--color-shadow);
 
-  height: calc(100%/3);
+  height: calc(95%/3);
   width: 100%;
 }
 
 .active-milestone:hover{
   transform: scale(1.02);
-  transition: 0.3s;
+  cursor: pointer;
 }
 
-
 .pagination {
   display: flex;
   justify-content: left;
   align-items: center;
   width: 100%;
+  height: 10%;
 }
 
 .pagination button {
diff --git a/src/components/milestone/CompletedMilestoneDisplay.vue b/src/components/milestone/CompletedMilestoneDisplay.vue
index 4866c4f360c8527cdfbe34daf34df0bb81721ed0..5875c9da39b75fab00fe7e1775c2de2b64ee73b0 100644
--- a/src/components/milestone/CompletedMilestoneDisplay.vue
+++ b/src/components/milestone/CompletedMilestoneDisplay.vue
@@ -1,5 +1,4 @@
 <script setup lang="ts">
-import {ref} from "vue";
 
 const props = defineProps({
   id: Number,
@@ -9,28 +8,28 @@ const props = defineProps({
   currentSum: Number,
   deadline: Date,
   startDate: Date,
-  image: String
+  image: String,
+  expanded: Boolean
 });
 
-const imageUrl = "src/assets/pig.png"
-const displayDescription = ref(false)
-
 </script>
 
 <template>
-<div class="completed-milestone-display"
-     @mouseover="displayDescription = true"
-      @mouseleave="displayDescription = false"
-     :style="{
-            backgroundImage: image ? 'url(' + image + ')' : 'url(' + imageUrl + ')'
-        }">
+<div class="completed-milestone-display">
   <h2 class="title">{{props.title}}</h2>
-  <div class="info" v-if="!displayDescription">
-    <h4  v-if="currentSum">Du sparte {{props.currentSum}}kr</h4>
-    <h4 v-if="deadline">{{new Date(deadline).getDate()}}/{{new Date(deadline).getMonth()}}-{{new Date(deadline).getFullYear()}}</h4>
+  <div class="center-content">
+    <div class="img">
+      <img src="/src/assets/background/img.png" alt="milestone-img" class="milestone-img">
+    </div>
+    <div class="description-info" :class="{'expanded':expanded}">
+      <h4 class="description-title">Beskrivelse: </h4>
+      <h4 class="description">{{props.description}}</h4>
+    </div>
   </div>
-  <div class="info" v-if="displayDescription">
-    <h4>{{props.description}}</h4>
+
+  <div class="info">
+    <h4  v-if="currentSum">Du sparte {{props.currentSum}}kr av {{props.goalSum}}kr</h4>
+    <h4 v-if="deadline">{{new Date(deadline).getDate()}}/{{new Date(deadline).getMonth()}}-{{new Date(deadline).getFullYear()}}</h4>
   </div>
 
 </div>
@@ -40,18 +39,76 @@ const displayDescription = ref(false)
 .completed-milestone-display{
   display:flex;
   flex-direction: column;
-  place-content: space-between;
+  place-items: start;
+  height: 100%;
+  width: 100%;
   padding: 1.5%;
   color: var(--color-text-black);
 }
+
+h1:hover, h3:hover, h2:hover, h4:hover{
+  cursor: pointer;
+}
+
 .title{
-  text-align: left;
+  place-content: start;
+}
+
+.center-content{
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  height: 50%;
+}
+
+.img{
+  display: flex;
+  border-radius: 10px;
+  background-color: lightgrey;
+  place-content: center;
+  place-items: center;
+  height: 10vh;
+  min-height: 50px;
+  overflow: hidden;
 }
+
+.milestone-img{
+  display: flex;
+  filter: grayscale(100%);
+  width: 100%;
+}
+
+.description-info{
+  display: none;
+}
+
+.expanded{
+  display: flex;
+  flex-direction: column;
+  height: 50%;
+  width: 100%;
+  align-content: start;
+  place-content: start;
+  text-align: start;
+}
+
+.description-title{
+  text-decoration: underline;
+}
+
+.description{
+  overflow-y: scroll;
+}
+
 .info{
   display: flex;
   flex-direction: row;
+  height: 100%;
+  width: 100%;
   text-align: left;
   justify-content: space-between;
+  align-content: end;
+  place-items: end;
 
 }
 
diff --git a/src/components/milestone/MilestoneLogList.vue b/src/components/milestone/MilestoneLogList.vue
index 13619f57401857598ee2bc4ee112ffed71c6529d..979b416a877bd7b432f56741b9a1f8c39499d899 100644
--- a/src/components/milestone/MilestoneLogList.vue
+++ b/src/components/milestone/MilestoneLogList.vue
@@ -18,11 +18,11 @@ interface Milestone{
 }
 
 const token = useTokenStore().jwtToken
-
+const expandedMileStoneId = ref<number>(-1);
 const completedMilestones = ref<Milestone[]>([])
 const currentPage = ref<number>(0)
 const pages = ref<number>(1)
-const SIZE = 4
+const SIZE = 3
 
 onMounted( () => {
   fetchActiveMilestones();
@@ -54,27 +54,23 @@ const nextPage = () =>{
   fetchActiveMilestones();
 }
 
+const toggleMilestoneHeight = (id: number) => {
+  if(expandedMileStoneId.value == id){
+    expandedMileStoneId.value = -1;
+  } else {
+    expandedMileStoneId.value = id;
+  }
+};
+
 </script>
 
 <template>
   <div class="completed-milestones-component">
     <div class="milestones">
       <CompletedMilestoneDisplay
-        class="completed-milestone"
         v-for="(completedMilestone, index) in completedMilestones"
-        :key="index"
-        :id="completedMilestone.milestoneId"
-        :title="completedMilestone.milestoneTitle"
-        :description="completedMilestone.milestoneDescription"
-        :current-sum="completedMilestone.milestoneCurrentSum"
-        :goal-sum="completedMilestone.milestoneGoalSum"
-        :deadline="completedMilestone.deadlineDate"
-        :start-date="completedMilestone.startDate"
-        :image="completedMilestone.milestoneImage"
-      ></CompletedMilestoneDisplay>
-      <CompletedMilestoneDisplay
         class="completed-milestone"
-        v-for="(completedMilestone, index) in completedMilestones"
+        :class="{'expanded': expandedMileStoneId == completedMilestone.milestoneId}"
         :key="index"
         :id="completedMilestone.milestoneId"
         :title="completedMilestone.milestoneTitle"
@@ -84,8 +80,9 @@ const nextPage = () =>{
         :deadline="completedMilestone.deadlineDate"
         :start-date="completedMilestone.startDate"
         :image="completedMilestone.milestoneImage"
+        :expanded="expandedMileStoneId == completedMilestone.milestoneId"
+        @click="toggleMilestoneHeight(completedMilestone.milestoneId)"
       ></CompletedMilestoneDisplay>
-
       <h4 class="milestone-placeholder" v-if="completedMilestones.length == 0">
         Du har ingen fullførte sparemål
         <br>Avsluttede sparemål ender opp her sånn at du får full oversikt.
@@ -117,8 +114,6 @@ const nextPage = () =>{
   height: 100%;
   width: 100%;
 
-  place-content: space-between;
-
   padding: 5.0%;
   gap: 2.5%;
 }
@@ -127,9 +122,8 @@ const nextPage = () =>{
   display: flex;
   flex-direction: column;
   gap: 2.5%;
-
   width: 100%;
-  height: 100%;
+  height: 90%;
 }
 
 .completed-milestone{
@@ -137,13 +131,18 @@ const nextPage = () =>{
   border: 2px solid var(--color-border);
   background-color: var(--color-background-white);
 
-  min-height: calc(calc(100% - 2.5*4%)/4);
+  height: calc(calc(100% - 2.5*2%)/3);
   width: 100%;
 }
 
 .completed-milestone:hover{
-  transform: scale(1.05);
-  transition: 0.3s;
+  transform: scale(1.02);
+  cursor: pointer;
+  transition: none;
+}
+
+.expanded{
+  height: calc(calc(calc(100% - 2.5*2%)/3)*1.5);
 }
 
 .milestone-placeholder{
@@ -155,6 +154,7 @@ const nextPage = () =>{
   justify-content: center;
   align-items: center;
   width: 100%;
+  height: 10%;
   flex: 1;
 }
 
diff --git a/src/components/popups/DeleteUserPopUp.vue b/src/components/popups/DeleteUserPopUp.vue
new file mode 100644
index 0000000000000000000000000000000000000000..49299d614494c66e768a2fd3d8dd5a0443006638
--- /dev/null
+++ b/src/components/popups/DeleteUserPopUp.vue
@@ -0,0 +1,119 @@
+<script setup lang="ts">
+
+import { useTokenStore } from '@/stores/token'
+import { deleteUser } from '@/utils/profileutils'
+
+const token:string = useTokenStore().jwtToken;
+const emit = defineEmits(['closeDeletePopUp', 'challengeDeleted']);
+
+const cancelCompleteThisChallenge = () => {
+  emit('closeDeletePopUp');
+}
+
+const deleteThisUser = async () => {
+  try{
+    await deleteUser(token);
+    useTokenStore().logout();
+  }catch (error){
+    console.log(error)
+  }
+}
+
+</script>
+
+<template>
+  <div class="popup-content">
+    <!-- Pop-up content goes here -->
+    <h2>Er du sikker på at du vil slette brukeren?</h2>
+
+    <div class="content">
+      <img class="sad-pig-img" src="/src/assets/png/sad-pig.png" alt="sad-pig" >
+      <h3> Husk! Dagens små sparinger kan føre til morgendagens store drømmer.</h3>
+    </div>
+
+    <div class="option-buttons">
+      <button class="option-button" id="cancel-button" @click="cancelCompleteThisChallenge()">
+        <h2 class="option-button-title">Avbryt</h2>
+      </button>
+      <button class="option-button" id="delete-button" @click="deleteThisUser()">
+        <h2 class="option-button-title">Slett</h2>
+      </button>
+    </div>
+  </div>
+
+</template>
+
+<style scoped>
+.popup-content {
+  display: flex;
+  flex-direction: column;
+
+  width: 50%;
+  height: 50%;
+  background-color: var(--color-background);
+
+  padding: 20px;
+  border-radius: 10px;
+  border: 2px solid var(--color-border);
+
+  place-content: space-between;
+
+}
+
+.content{
+  display: flex;
+  flex-direction: row;
+  place-items: center;
+}
+
+.sad-pig-img{
+  width:30%;
+}
+
+
+.option-buttons{
+  display: flex;
+  flex-direction: row;
+
+  width: 100%;
+  place-content: space-between;
+}
+
+.option-button{
+  border: none;
+  border-radius: 20px;
+  width: 35%;
+
+}
+
+.option-button-title{
+  color: var(--color-headerText);
+  font-weight: bold;
+}
+
+#cancel-button{
+  background-color: var(--color-cancel-button);
+}
+#cancel-button:active{
+  background-color: var(--color-cancel-button-click);
+}
+
+#delete-button{
+  background-color: var(--color-confirm-button);
+}
+#delete-button:active{
+  background-color: var(--color-confirm-button-click);
+}
+
+#delete-button:hover, #cancel-button:hover{
+  transform: scale(1.02);
+}
+
+@media only screen and (max-width: 1000px){
+  .popup-content {
+    width: 90%;
+    height: 60%;
+  }
+}
+
+</style>
\ No newline at end of file
diff --git a/src/components/profile/BadgeInfo.vue b/src/components/profile/BadgeInfo.vue
index 1a4ea4c4403c3555820a6fa2c4ce0e818b4294c9..eca9790cffc0f57473ec824f1b552dfed0799aee 100644
--- a/src/components/profile/BadgeInfo.vue
+++ b/src/components/profile/BadgeInfo.vue
@@ -3,9 +3,9 @@ import { onMounted, ref } from 'vue'
 import { getUserInfo } from '@/utils/profileutils'
 import { useTokenStore } from '@/stores/token'
 interface Achievement{
-  id: number,
-  title: string,
-  img: string
+  achievementId: number,
+  achievementTitle: string,
+  badge: string
 }
 
 const props = defineProps <{
@@ -28,8 +28,7 @@ onMounted(async () => {
 const fetchBadgeInfo = async ()=>{
   try {
     const response = await getUserInfo(token)
-    console.log(response)
-    achievements.value = response.achievements;
+    achievements.value = response.achievementDTOList;
   } catch (error){
     console.error('Error fetching achievements:')
   }
@@ -41,9 +40,9 @@ const fetchBadgeInfo = async ()=>{
   <div class="badge-container">
     <h3 class="title">{{title}}</h3>
     <div class="badges">
-      <div class="badge" v-for="(achievement) in achievements" :key="achievement.id">
-        <img class="badge-img" :src="achievement.img" :alt="achievement.title">
-        <h3 class="badge-title"> {{achievement.title}}</h3>
+      <div class="badge" v-for="achievement in achievements" :key="achievement.achievementId">
+        <img v-if="achievement.badge" class="badge-img" :src="achievement.badge" :alt="achievement.achievementTitle">
+        <h3 class="badge-title"> {{achievement.achievementTitle}}</h3>
       </div>
     </div>
     
diff --git a/src/views/HomePage/ChallengeView.vue b/src/views/HomePage/ChallengeView.vue
index f93052d967d05cef423df0999ad41ef9fc78c225..ff172a1c4397cb82091f97a7279264a3246d97fb 100644
--- a/src/views/HomePage/ChallengeView.vue
+++ b/src/views/HomePage/ChallengeView.vue
@@ -89,6 +89,7 @@ const closeHelpPopUp = async () => {
 
 .help-icon:hover{
   transform: scale(1.05);
+  cursor: pointer;
 }
 
 .popup-container {
@@ -117,7 +118,7 @@ const closeHelpPopUp = async () => {
   display: flex;
   flex-direction: row;
   width: 100%;
-  min-height: 115%;
+  min-height: 120%;
   padding-bottom: 1.5%;
   gap: 2.5%;
 }
@@ -135,7 +136,7 @@ const closeHelpPopUp = async () => {
   background-color: var(--color-confirm-button);
   border: 2px solid var(--color-border);
   color: var(--color-button-text);
-  min-height: 12%;
+  min-height: 10%;
 }
 
 .create-challenge-button:active{
@@ -160,7 +161,7 @@ const closeHelpPopUp = async () => {
   box-shadow: 0 4px 4px var(--color-shadow);
   background-color: var(--color-heading);
 
-  height: 100%;
+  min-height: 100%;
   width: 40%;
 }
 
diff --git a/src/views/HomePage/DiscoverView.vue b/src/views/HomePage/DiscoverView.vue
index e8fd9e753c94fd8601f254478ef37f2e1e262c79..c7f219562b640af3dab7caded0b5438e5d43a360 100644
--- a/src/views/HomePage/DiscoverView.vue
+++ b/src/views/HomePage/DiscoverView.vue
@@ -104,6 +104,7 @@ onMounted(async () => {
 
 .help-icon:hover{
   transform: scale(1.05);
+  cursor: pointer;
 }
 
 .popup-container {
@@ -142,6 +143,9 @@ onMounted(async () => {
 .article-item {
   width: calc(calc(100% - 2 * 1.5%) / 3);
   height: 7.0%;
+  h1:hover, h3:hover, h2:hover, h4:hover{
+    cursor: pointer;
+  }
 }
 
 .article-content {
@@ -192,6 +196,9 @@ onMounted(async () => {
 .article-link {
   text-decoration: none;
   color: inherit;
+  background: none;
   transition: none;
+  border-radius: 20px;
 }
+
 </style>
\ No newline at end of file
diff --git a/src/views/HomePage/EconomyView.vue b/src/views/HomePage/EconomyView.vue
index 08034028e2626e4e87c2c4cd2a8eab41c5cd02fc..65ab83aa0e8037793dcd957b37fa4614231e4173 100644
--- a/src/views/HomePage/EconomyView.vue
+++ b/src/views/HomePage/EconomyView.vue
@@ -254,6 +254,7 @@ const getRandomColor = () => {
 
 .help-icon:hover{
   transform: scale(1.05);
+  cursor: pointer;
 }
 
 .title{
diff --git a/src/views/HomePage/EditMilestoneView.vue b/src/views/HomePage/EditMilestoneView.vue
index 8ef3fa30e7d25c82269d3388fe194c19c4e2bc01..c1344eeba6401d8c8a67babfddda6cf1e96f7977 100644
--- a/src/views/HomePage/EditMilestoneView.vue
+++ b/src/views/HomePage/EditMilestoneView.vue
@@ -38,7 +38,7 @@ onMounted(async () => {
   current_sum.value = data.milestoneCurrentSum
   start_date.value = data.startDate
   end_date.value = data.deadlineDate
-  image.value = `data:image/png;base64,${data.milestoneImage}`
+  image.value = data.milestoneImage ? `data:image/png;base64,${data.milestoneImage}` : null;
   console.log(image.value)
   console.log(data.milestoneImage)
 })
@@ -80,7 +80,7 @@ const milestoneData = computed(() => ({
   milestoneDescription: description.value,
   milestoneGoalSum: goal_sum.value,
   milestoneCurrentSum: current_sum.value,
-  milestoneImage: image.value,
+  milestoneImage: image.value ? image.value : null,
   deadlineDate: end_date.value ? end_date.value : null,
   startDate: start_date.value ? start_date.value : null
 }));
@@ -90,6 +90,7 @@ const saveInput = () => {
     console.log(milestoneData.value)
     const response = updateMilestoneDetails(milestoneData.value)
     console.log(response)
+    router.push('/homepage/milestone')
   } else {
     console.log('fail')
   }
@@ -324,6 +325,7 @@ label {
 }
 #literal-image{
   height: 100%;
+  max-height: 300px;
   width: 100%;
 }
 
diff --git a/src/views/HomePage/HomeView.vue b/src/views/HomePage/HomeView.vue
index 8af2f93be8d24b3285b9c1e317504bce4c41a05d..9877cf7aa3cb29a783e0e840849eb4cfa1fc7444 100644
--- a/src/views/HomePage/HomeView.vue
+++ b/src/views/HomePage/HomeView.vue
@@ -70,7 +70,7 @@ userSavings()
             Ny til Sparesti? Klikk her!
           </h2>
         </button>
-        <ActiveMilestonesList></ActiveMilestonesList>
+        <ActiveMilestonesList class="active-challenges"></ActiveMilestonesList>
       </div>
       <div class="right" :class="{ 'mobile-hide': displayType }">
         <h2 class="active-challenges-title">Aktive utfordringer</h2>
@@ -100,6 +100,7 @@ userSavings()
 
 .help-icon:hover{
   transform: scale(1.05);
+  cursor: pointer;
 }
 
 .popup-container {
@@ -146,7 +147,7 @@ userSavings()
   background-color: var(--color-confirm-button);
   border: 2px solid var(--color-border);
   color: var(--color-button-text);
-  min-height: 12%;
+  min-height: 10%;
 }
 
 .create-challenge-button:active{
@@ -157,6 +158,10 @@ userSavings()
   transform: scale(1.02);
 }
 
+.active-challenges{
+  height: 90%;
+}
+
 .display-help-button{
   font-weight: bold;
 }
diff --git a/src/views/HomePage/MilestonePathView.vue b/src/views/HomePage/MilestonePathView.vue
index f6ca1232587adf40ac3468d64c94de91ecd95a1c..6ffa826a8a3f9c7f507ee0db79b94db8bd105e43 100644
--- a/src/views/HomePage/MilestonePathView.vue
+++ b/src/views/HomePage/MilestonePathView.vue
@@ -9,7 +9,9 @@ import { getMilestoneDetails } from '@/utils/MilestonePathUtils'
 import { useMilestoneStore } from '@/stores/currentMilestone'
 import PathHelpPopUp from '@/components/popups/help/PathHelpPopUp.vue'
 import HomeHelpPopUp from '@/components/popups/help/HomeHelpPopUp.vue'
-
+import MilestoneButton from '@/components/MilestonePath/MilestoneButton.vue'
+import { useRouter } from 'vue-router'
+const router = useRouter()
 const displayType = ref<boolean>(false)
 const displayHelpPopUp = ref<boolean>(false)
 
@@ -99,6 +101,10 @@ const closeHelpPopUp = async () => {
         <div id = Transfer>
           <DirectTransfer @transfer-value="updateTotalSaved"/>
         </div>
+        <div id = buttons>
+          <milestone-button :label="editLabel" :button-color="editColor" @click="router.push('/homepage/edit-milestone')"></milestone-button>
+          <milestone-button :label="deleteLabel" :button-color="deleteColor"></milestone-button>
+        </div>
       </div>
 
     </div>
@@ -131,6 +137,7 @@ const closeHelpPopUp = async () => {
 
   .help-icon:hover{
     transform: scale(1.05);
+    cursor: pointer;
   }
 
   .popup-container {
@@ -226,6 +233,9 @@ const closeHelpPopUp = async () => {
     .mobile-hide{
       display: none;
     }
+    #buttons{
+      flex-direction: column;
+    }
   }
 
 </style>
diff --git a/src/views/HomePage/MilestoneView.vue b/src/views/HomePage/MilestoneView.vue
index 156602146592b8a149388a3d7ec33c47340c0254..dd090a985a6be7b5a1a7b8e335bfaeb491ab1324 100644
--- a/src/views/HomePage/MilestoneView.vue
+++ b/src/views/HomePage/MilestoneView.vue
@@ -88,6 +88,7 @@ const closeHelpPopUp = () => {
 
 .help-icon:hover{
   transform: scale(1.05);
+  cursor: pointer;
 }
 
 .popup-container {
@@ -134,7 +135,7 @@ const closeHelpPopUp = () => {
   background-color: var(--color-confirm-button);
   border: 2px solid var(--color-border);
   color: var(--color-button-text);
-  min-height: 12%;
+  min-height: 10%;
 }
 
 .create-milestone-button:active{
@@ -149,6 +150,10 @@ const closeHelpPopUp = () => {
   font-weight: bold;
 }
 
+.active-milestones{
+  height: 90%;
+}
+
 .right{
   display: flex;
   flex-direction: column;
@@ -159,7 +164,7 @@ const closeHelpPopUp = () => {
   box-shadow: 0 4px 4px var(--color-shadow);
   background-color: var(--color-heading);
 
-  height: 100%;
+  min-height: 100%;
   width: 40%;
 }
 
diff --git a/src/views/HomePage/ProfileView.vue b/src/views/HomePage/ProfileView.vue
index 2995a2dc7bdb499e35f3ddea70478be50036a682..797ed760902555796ef98ffaa4a1ab041739cd1d 100644
--- a/src/views/HomePage/ProfileView.vue
+++ b/src/views/HomePage/ProfileView.vue
@@ -8,12 +8,16 @@ import BadgeInfo from '@/components/profile/BadgeInfo.vue'
 import PasswordInfo from '@/components/profile/PasswordInfo.vue'
 import { deleteUser, getUserInfo } from '@/utils/profileutils'
 import { useTokenStore } from '@/stores/token'
+import DeleteChallengePopUp from '@/components/popups/DeleteChallengePopUp.vue'
+import DeleteUserPopUp from '@/components/popups/DeleteUserPopUp.vue'
 
 const token:string = useTokenStore().jwtToken;
 
 const firstName = ref<string>('Profile');
 const lastName = ref<string>('');
 
+const displayDeletePopUp = ref<boolean>(false)
+
 onMounted(async () => {
   try {
     await fetchUserInfo();
@@ -37,19 +41,21 @@ const logout = () => {
   useTokenStore().logout();
 }
 
-const deleteUserAccount = async () => {
-  try{
-    const response = await deleteUser(token);
-    console.log(response);
-    useTokenStore().logout();
-  } catch (error){
-    console.error('Error deleting user:', error);
-  }
+const handleRequestToDeleteUser = async () => {
+  displayDeletePopUp.value = true;
+}
+const closeDeletePopUp = async () => {
+  displayDeletePopUp.value = false;
 }
 
 </script>
 
 <template>
+  <div v-if="displayDeletePopUp" class="popup-container">
+    <DeleteUserPopUp
+      @closeDeletePopUp="closeDeletePopUp"
+    ></DeleteUserPopUp>
+  </div>
   <div class="profile-view">
     <div class="header">
       <h2 class="view-title">{{firstName}} {{lastName}}</h2>
@@ -78,7 +84,7 @@ const deleteUserAccount = async () => {
         <BadgeInfo title="Mynter"></BadgeInfo>
       </div>
       <div class="delete-user-button-box">
-        <button class="user-button" id="delete-user-button" @click="deleteUserAccount">
+        <button class="user-button" id="delete-user-button" @click="handleRequestToDeleteUser">
           <h3 class="user-button-title">Slett bruker</h3>
         </button>
       </div>
@@ -87,6 +93,20 @@ const deleteUserAccount = async () => {
 </template>
 
 <style scoped>
+.popup-container {
+  position: fixed; /* Change to fixed to cover the entire viewport */
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  justify-content: center;
+  background-color: rgba(64, 64, 64, 0.5);
+
+  align-items: center;
+  z-index: 1000; /* Adjust z-index as needed */
+}
+
 
 .profile-view{
   display: flex;
diff --git a/src/views/HomePageView.vue b/src/views/HomePageView.vue
index 88d5ba975353a8978ddbb68986215a0e2f600585..a842747537c46acaf5035f42a3d26f66fd431e57 100644
--- a/src/views/HomePageView.vue
+++ b/src/views/HomePageView.vue
@@ -91,7 +91,7 @@ const closePopup = () => {
   flex-direction: row;
   height: 88%;
   width: 100%;
-  min-height: 650px;
+  min-height: 700px;
 }
 
 .side-nav{