diff --git a/.gitignore b/.gitignore
index 50d77de72..2bd84373f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,6 @@
node_modules/
.env
+.env.local
+.vercel/
.DS_Store
.vscode/
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 000000000..3994ea9fe
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,11 @@
+{
+ "sqltools.connections": [
+ {
+ "previewLimit": 50,
+ "driver": "SQLite",
+ "name": "db sql",
+ "database": "db.sql"
+ }
+ ],
+ "cSpell.words": ["apod", "Desta", "Galactica"]
+}
diff --git a/courses/backend/advanced-javascript/README.md b/assets/courses/backend/advanced-javascript/README.md
similarity index 100%
rename from courses/backend/advanced-javascript/README.md
rename to assets/courses/backend/advanced-javascript/README.md
diff --git a/courses/backend/advanced-team-processes/README.md b/assets/courses/backend/advanced-team-processes/README.md
similarity index 100%
rename from courses/backend/advanced-team-processes/README.md
rename to assets/courses/backend/advanced-team-processes/README.md
diff --git a/courses/backend/collaboration-via-github/README.md b/assets/courses/backend/collaboration-via-github/README.md
similarity index 100%
rename from courses/backend/collaboration-via-github/README.md
rename to assets/courses/backend/collaboration-via-github/README.md
diff --git a/courses/backend/databases/README.md b/assets/courses/backend/databases/README.md
similarity index 100%
rename from courses/backend/databases/README.md
rename to assets/courses/backend/databases/README.md
diff --git a/courses/backend/databases/database/tasks-postgres.sql b/assets/courses/backend/databases/database/tasks-postgres.sql
similarity index 100%
rename from courses/backend/databases/database/tasks-postgres.sql
rename to assets/courses/backend/databases/database/tasks-postgres.sql
diff --git a/courses/backend/databases/database/tasks-sample-data.sql b/assets/courses/backend/databases/database/tasks-sample-data.sql
similarity index 100%
rename from courses/backend/databases/database/tasks-sample-data.sql
rename to assets/courses/backend/databases/database/tasks-sample-data.sql
diff --git a/courses/backend/databases/example-api/.env.example b/assets/courses/backend/databases/example-api/.env.example
similarity index 100%
rename from courses/backend/databases/example-api/.env.example
rename to assets/courses/backend/databases/example-api/.env.example
diff --git a/courses/backend/databases/example-api/index.js b/assets/courses/backend/databases/example-api/index.js
similarity index 100%
rename from courses/backend/databases/example-api/index.js
rename to assets/courses/backend/databases/example-api/index.js
diff --git a/courses/backend/databases/example-api/package-lock.json b/assets/courses/backend/databases/example-api/package-lock.json
similarity index 100%
rename from courses/backend/databases/example-api/package-lock.json
rename to assets/courses/backend/databases/example-api/package-lock.json
diff --git a/courses/backend/databases/example-api/package.json b/assets/courses/backend/databases/example-api/package.json
similarity index 100%
rename from courses/backend/databases/example-api/package.json
rename to assets/courses/backend/databases/example-api/package.json
diff --git a/courses/backend/node/README.md b/assets/courses/backend/node/README.md
similarity index 100%
rename from courses/backend/node/README.md
rename to assets/courses/backend/node/README.md
diff --git a/courses/backend/using-ai-in-development/README.md b/assets/courses/backend/using-ai-in-development/README.md
similarity index 100%
rename from courses/backend/using-ai-in-development/README.md
rename to assets/courses/backend/using-ai-in-development/README.md
diff --git a/assets/courses/foundation/Intro-to-agile/Trello.txt b/assets/courses/foundation/Intro-to-agile/Trello.txt
new file mode 100644
index 000000000..c097ed692
--- /dev/null
+++ b/assets/courses/foundation/Intro-to-agile/Trello.txt
@@ -0,0 +1,2 @@
+
+https://trello.com/b/opBYR6Ge/bake-birthday-cake
\ No newline at end of file
diff --git a/courses/foundation/databases/README.md b/assets/courses/foundation/databases/README.md
similarity index 100%
rename from courses/foundation/databases/README.md
rename to assets/courses/foundation/databases/README.md
diff --git a/assets/courses/foundation/databases/db.sql b/assets/courses/foundation/databases/db.sql
new file mode 100644
index 000000000..a34ee37cb
--- /dev/null
+++ b/assets/courses/foundation/databases/db.sql
@@ -0,0 +1,30 @@
+--1 How many tasks are in the task table?
+SELECT COUNT(*) FROM task;
+
+--2 How many tasks in the task table do not have a valid due date?
+ SELECT COUNT(*) AS invalid_due_dates FROM task WHERE due_date IS NULL;
+
+--3 Find all the tasks that are marked as done.
+ SELECT * FROM task WHERE status_id = 3;
+
+--4 Find all the tasks that are not marked as done.
+SELECT * FROM task WHERE status_id != 3;
+
+--5 Get all the tasks, sorted with the most recently created first.
+SELECT * FROM task ORDER BY created DESC;
+
+--6 Get the single most recently created task.
+SELECT * FROM task ORDER BY created DESC LIMIT 1;
+
+--7 Get the title and due date of all tasks where the title or description contains database.
+SELECT title, due_date FROM task WHERE title LIKE '%database%' OR description LIKE '%database%';
+
+--8 Get the title and status (as text) of all tasks.
+SELECT t.title, s.name FROM task t LEFT JOIN status s ON t.status_id = s.id;
+
+--9 Get the name of each status, along with a count of how many tasks have that status.
+SELECT s.name AS status, COUNT(t.id) AS status_count FROM status s LEFT JOIN task t ON t.status_id = s.id GROUP BY s.id, s.name;
+
+--10 Get the names of all statuses, sorted by the status with most tasks first.
+SELECT s.name, COUNT(*) AS status_count FROM task t JOIN status s ON t.status_id = s.id
+GROUP BY s.name ORDER BY status_count DESC;
\ No newline at end of file
diff --git a/courses/foundation/git/README.md b/assets/courses/foundation/git/README.md
similarity index 100%
rename from courses/foundation/git/README.md
rename to assets/courses/foundation/git/README.md
diff --git a/assets/courses/foundation/git/week1/countries.txt b/assets/courses/foundation/git/week1/countries.txt
new file mode 100644
index 000000000..45c0aeba5
--- /dev/null
+++ b/assets/courses/foundation/git/week1/countries.txt
@@ -0,0 +1,3 @@
+Ethiopia
+USA
+Sweden
\ No newline at end of file
diff --git a/assets/courses/foundation/git/week1/my-favourite-food.txt b/assets/courses/foundation/git/week1/my-favourite-food.txt
new file mode 100644
index 000000000..e56a4c1c2
--- /dev/null
+++ b/assets/courses/foundation/git/week1/my-favourite-food.txt
@@ -0,0 +1,26 @@
+Fish Balls (Simple Home Recipe)
+
+Ingredients:
+- 500 g white fish fillets (cod, pollock or haddock), skin removed
+- 1 egg, lightly beaten
+- 2 spring onions, finely chopped
+- 2 cloves garlic, minced
+- 1 teaspoon soy sauce
+- 1 teaspoon sesame oil
+- 1/2 teaspoon salt (adjust to taste)
+- 1/4 teaspoon white or black pepper
+- 3 tablespoons cornstarch (plus extra for dusting)
+- Vegetable oil, for frying or cooking
+
+Instructions:
+1. Chop the fish into small pieces and place into a large bowl or food processor.
+2. Add the egg, spring onions, garlic, soy sauce, sesame oil, salt and pepper.
+3. Pulse or mix until you get a smooth, sticky paste. If too loose, add 1 tablespoon cornstarch at a time until the mixture holds together.
+4. Wet your hands and shape the mixture into small balls (about 1" / 2–3 cm diameter).
+5. Option A — Boil: Bring a pot of water to a gentle boil and drop the fish balls in. Cook until they float (3–5 minutes). Remove with a slotted spoon.
+ Option B — Pan-fry: Heat 2–3 tablespoons vegetable oil in a skillet and shallow-fry the fish balls, turning occasionally, until golden and cooked through (about 6–8 minutes).
+6. Serve hot with dipping sauce, in noodle soup, or as a snack.
+
+Tips:
+- For a springier texture, chill the fish paste for 30 minutes before shaping.
+- You can substitute a mixture of fish and shrimp for a different flavor.
\ No newline at end of file
diff --git a/assets/courses/foundation/git/week1/my-second-favorite-food.txt b/assets/courses/foundation/git/week1/my-second-favorite-food.txt
new file mode 100644
index 000000000..925ae38b2
--- /dev/null
+++ b/assets/courses/foundation/git/week1/my-second-favorite-food.txt
@@ -0,0 +1,27 @@
+Vegetable Stir-Fry with Garlic Sauce
+
+Ingredients:
+- 3 cups mixed vegetables (broccoli florets, bell peppers, carrots, snap peas)
+- 200 g firm tofu or sliced mushrooms (optional)
+- 3 cloves garlic, minced
+- 1 tbsp fresh ginger, minced
+- 2 tbsp soy sauce
+- 1 tbsp oyster sauce (or vegetarian alternative)
+- 1 tsp sugar
+- 1 tbsp sesame oil
+- 2 tbsp vegetable oil for frying
+- 1 tbsp cornstarch mixed with 3 tbsp water (slurry)
+
+Instructions:
+1. Prepare all vegetables and proteins, cutting into bite-sized pieces.
+2. Heat vegetable oil in a wok or large skillet over high heat.
+3. Add garlic and ginger, stir-fry briefly until fragrant (20–30 seconds).
+4. Add tofu or mushrooms, fry until lightly browned.
+5. Add vegetables and stir-fry for 3–5 minutes until crisp-tender.
+6. Mix soy sauce, oyster sauce, sugar and sesame oil; pour over the vegetables.
+7. Add cornstarch slurry and stir until the sauce thickens and coats the vegetables.
+8. Serve immediately over steamed rice or noodles.
+
+Variations:
+- Add chili flakes or fresh chilies for heat.
+- Swap tofu for chicken or shrimp for a non-vegetarian version.
\ No newline at end of file
diff --git a/courses/foundation/intro-to-backend/.gitignore b/assets/courses/foundation/intro-to-backend/.gitignore
similarity index 100%
rename from courses/foundation/intro-to-backend/.gitignore
rename to assets/courses/foundation/intro-to-backend/.gitignore
diff --git a/courses/foundation/intro-to-backend/README.md b/assets/courses/foundation/intro-to-backend/README.md
similarity index 100%
rename from courses/foundation/intro-to-backend/README.md
rename to assets/courses/foundation/intro-to-backend/README.md
diff --git a/courses/foundation/intro-to-backend/database.sqlite3 b/assets/courses/foundation/intro-to-backend/database.sqlite3
similarity index 100%
rename from courses/foundation/intro-to-backend/database.sqlite3
rename to assets/courses/foundation/intro-to-backend/database.sqlite3
diff --git a/courses/foundation/intro-to-backend/exercise1.js b/assets/courses/foundation/intro-to-backend/exercise1.js
similarity index 100%
rename from courses/foundation/intro-to-backend/exercise1.js
rename to assets/courses/foundation/intro-to-backend/exercise1.js
diff --git a/courses/foundation/intro-to-backend/exercise2.js b/assets/courses/foundation/intro-to-backend/exercise2.js
similarity index 100%
rename from courses/foundation/intro-to-backend/exercise2.js
rename to assets/courses/foundation/intro-to-backend/exercise2.js
diff --git a/courses/foundation/intro-to-backend/package-lock.json b/assets/courses/foundation/intro-to-backend/package-lock.json
similarity index 100%
rename from courses/foundation/intro-to-backend/package-lock.json
rename to assets/courses/foundation/intro-to-backend/package-lock.json
diff --git a/courses/foundation/intro-to-backend/package.json b/assets/courses/foundation/intro-to-backend/package.json
similarity index 100%
rename from courses/foundation/intro-to-backend/package.json
rename to assets/courses/foundation/intro-to-backend/package.json
diff --git a/assets/courses/foundation/intro-to-backend/tasks.sqlite3 b/assets/courses/foundation/intro-to-backend/tasks.sqlite3
new file mode 100644
index 000000000..34bfe1019
Binary files /dev/null and b/assets/courses/foundation/intro-to-backend/tasks.sqlite3 differ
diff --git a/courses/foundation/intro-to-frontend/HYFBay/hyfBayHelpers.js b/assets/courses/foundation/intro-to-frontend/HYFBay/hyfBayHelpers.js
similarity index 97%
rename from courses/foundation/intro-to-frontend/HYFBay/hyfBayHelpers.js
rename to assets/courses/foundation/intro-to-frontend/HYFBay/hyfBayHelpers.js
index a981c968a..574a396fa 100644
--- a/courses/foundation/intro-to-frontend/HYFBay/hyfBayHelpers.js
+++ b/assets/courses/foundation/intro-to-frontend/HYFBay/hyfBayHelpers.js
@@ -57,7 +57,7 @@ window.getAvailableProducts = function () {
const numberOfAvailableProducts = getRandomInt(0, 30);
const availableProducts = Array.apply(
null,
- Array(numberOfAvailableProducts),
+ Array(numberOfAvailableProducts)
).map(() => {
const name = getRandomProductName();
return {
diff --git a/courses/foundation/intro-to-frontend/HYFBay/index.html b/assets/courses/foundation/intro-to-frontend/HYFBay/index.html
similarity index 59%
rename from courses/foundation/intro-to-frontend/HYFBay/index.html
rename to assets/courses/foundation/intro-to-frontend/HYFBay/index.html
index 07f60fe48..201308bc8 100644
--- a/courses/foundation/intro-to-frontend/HYFBay/index.html
+++ b/assets/courses/foundation/intro-to-frontend/HYFBay/index.html
@@ -8,7 +8,16 @@
/>
-
+
+
+
HYF-Bay🤑
+
Your Favorite Marketplace
+
+
+
Products
+
+
+
diff --git a/assets/courses/foundation/intro-to-frontend/HYFBay/main.css b/assets/courses/foundation/intro-to-frontend/HYFBay/main.css
new file mode 100644
index 000000000..4bb3474c9
--- /dev/null
+++ b/assets/courses/foundation/intro-to-frontend/HYFBay/main.css
@@ -0,0 +1,31 @@
+body {
+ font-family: "Open Sans", sans-serif;
+ background-color: #f9fbfd;
+ padding: 20px;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body,
+h1,
+h2 {
+ margin: 0;
+ text-align: center;
+}
+.products-section {
+ max-width: 1200px;
+ margin: 0 auto;
+}
+.product-item {
+ display: flex;
+ flex-direction: column;
+ margin: 20px 0 10px 30px;
+ list-style-type: none;
+ background-color: lightyellow;
+ padding: 15px;
+ border-radius: 8px;
+ box-shadow: 0 0 10px rgba(0, 0,
+ 0, 0.1);
+}
diff --git a/assets/courses/foundation/intro-to-frontend/HYFBay/main.js b/assets/courses/foundation/intro-to-frontend/HYFBay/main.js
new file mode 100644
index 000000000..5a0b4376e
--- /dev/null
+++ b/assets/courses/foundation/intro-to-frontend/HYFBay/main.js
@@ -0,0 +1,22 @@
+console.log("Script loaded");
+
+const products = getAvailableProducts();
+console.log(products);
+
+// This should create the ul and the li's with the individual products details
+
+function renderProducts(products) {
+ const productList = document.getElementById("product-list");
+
+ products.forEach((product) => {
+ const listItem = document.createElement("li");
+ listItem.classList.add("product-item");
+ listItem.innerHTML = `${product.name}
+ Price: $${product.price.toFixed(2)}
+Rating: ${product.rating} / 10
+ `;
+ productList.appendChild(listItem);
+ });
+}
+
+renderProducts(products);
diff --git a/courses/foundation/intro-to-frontend/HogwartsHouseGenerator/README.md b/assets/courses/foundation/intro-to-frontend/HogwartsHouseGenerator/README.md
similarity index 100%
rename from courses/foundation/intro-to-frontend/HogwartsHouseGenerator/README.md
rename to assets/courses/foundation/intro-to-frontend/HogwartsHouseGenerator/README.md
diff --git a/assets/courses/foundation/intro-to-frontend/HogwartsHouseGenerator/hogwarts.js b/assets/courses/foundation/intro-to-frontend/HogwartsHouseGenerator/hogwarts.js
new file mode 100644
index 000000000..e4fda8c96
--- /dev/null
+++ b/assets/courses/foundation/intro-to-frontend/HogwartsHouseGenerator/hogwarts.js
@@ -0,0 +1,74 @@
+const houses = [
+ {
+ name: "Gryffindor",
+ description:
+ "Gryffindor values courage, bravery, nerve and chivalry. Its mascot is the lion, and its colours are scarlet and gold. The Gryffindor motto is Their daring, nerve and chivalry set Gryffindors apart. The Head of this house is the Transfiguration teacher and Deputy Headmistress, Minerva McGonagall, and the house ghost is Sir Nicholas de Mimsy-Porpington, more commonly known as Nearly Headless Nick. According to Rowling, Gryffindor corresponds roughly to the element of fire. The founder of the house is Godric Gryffindhighest towers, the entrance to which is located on the seventh floor in the east wing of the castle and is guarded by a painting of The Fat Lady, who is garbed in a pink dress. She permits entry only after being given the correct password, as was distinguished in the third book, when Sirius Black tried forcing entry into the tower, only to be blocked by The Fat Lady after he could not give the correct password. In the first book, Neville Longbottom tends to forget the password and must wait near the painting until other Gryffindors arrive to open the way.",
+ image:
+ "https://harrypottercrazies.weebly.com/uploads/1/8/4/4/18445957/4778832.jpg",
+ },
+ {
+ name: "Hufflepuff",
+ description:
+ "Hufflepuff house values hard work, patience, justice, and loyalty. The house mascot is the badger, and the house colours are yellow and black. The Hufflepuff motto is Those patient Hufflepuffs are true and unafraid of toil. The head of this house is the Herbology professor, Pomona Sprout, and the house ghost is the Fat Friar. According to Rowling, Hufflepuff corresponds roughly to the element of earth. The founder of this house is Helga Hufflepuff. The Hufflepuff dormitories and common room are located near the castle kitchens, in a cozy nook that can be reached through a stack of large barrels in a nook near the kitchens. The entrance is concealed by a large barrel; to gain entry, one must tap the barrel in a certain rhythm (which changes from time to time) to open it up. The common room is a vast underground cavern with earthy tones, low ceilings, and numerous plants and fungi growing from the walls. There are many cozy chairs and sofas around small fireplaces, as well as low tables for studying and socializing.",
+ image:
+ "https://harrypottercrazies.weebly.com/uploads/1/8/4/4/18445957/3077859.jpg?303",
+ },
+ {
+ name: "Ravenclaw",
+ description:
+ 'Ravenclaw values intelligence, creativity, learning, and wit. The house mascot is an eagle and the house colours are blue and bronze blue and grey in the films. The Ravenclaw motto is "Wit beyond measure is man\'s greatest treasure." The head of this house is the Charms professor, Filius Flitwick, and the house ghost is The Grey Lady. According to Rowling, Ravenclaw corresponds roughly to the element of air. The founder of this house is Rowena Ravenclaw. The dormitories are located in Ravenclaw Tower, on the west side of Hogwarts. The common room, which went undescribed in the series until the climax of Deathly Hallows, is round and filled with blue hangings and armchairs, has a domed ceiling painted with stars and features a replica statue of Rowena wearing her diadem. Harry also notes that Ravenclaws "have a spectacular view of the surrounding mountains"',
+ image:
+ "https://harrypottercrazies.weebly.com/uploads/1/8/4/4/18445957/1177755.jpg?264",
+ },
+ {
+ name: "Slytherin",
+ description:
+ "Slytherin house values ambition, cunning, leadership, and resourcefulness; the Sorting Hat said in Harry Potter and the Philosopher's Stone that Slytherins will do anything to get their way. The house mascot of Slytherin is the serpent, and the house colours are green and silver. The Slytherin motto is Slytherin will help you on your way to greatness. Salazar Slytherin founded the house. The Head of House is Severus Snape until near the end of the sixth book. Then, Horace Slughorn, the previous Head of House, comes out of retirement re-assuming authority. The ghost of Slytherin house is The Bloody Baron. According to Rowling, Slytherin corresponds roughly to the element of water. The Slytherin dormitories and common room are reached through a bare stone wall in the dungeons. The Slytherin common room is a long, low, dungeon-style room, located under the Hogwarts Lake, furnished with green lamps and carved armchairs. The room is described in the second book as having a greenish glow.",
+ image:
+ "https://harrypottercrazies.weebly.com/uploads/1/8/4/4/18445957/987119.jpg?250",
+ },
+];
+
+const usernameInput = document.getElementById("username");
+const getHouseBtn = document.getElementById("getHouseBtn");
+const retryBtn = document.getElementById("retryBtn");
+const houseResult = document.getElementById("houseResult");
+const houseName = document.getElementById("houseName");
+const houseDescription = document.getElementById("houseDescription");
+const houseImage = document.getElementById("houseImage");
+
+let lastHouseIndex = -1; // Track the last selected house index
+
+function getRandomHouse() {
+ const username = usernameInput.value.trim();
+ if (username === "") {
+ houseResult.textContent = "Please enter your name to get sorted!";
+ houseResult.classList.remove("hidden");
+ return;
+ }
+
+ // Generate a new random index that is not the same as the last one
+ let randomIndex;
+ do {
+ randomIndex = Math.floor(Math.random() * houses.length);
+ } while (randomIndex === lastHouseIndex);
+ lastHouseIndex = randomIndex; // Update last index
+
+ const house = houses[randomIndex];
+
+ houseName.textContent = `You belong in ${house.name}!`;
+ houseDescription.textContent = house.description;
+ houseImage.src = house.image;
+
+ houseResult.textContent = `${username} belongs in ${house.name}!`;
+ houseResult.classList.remove("error", "hidden");
+
+ // Change button text after first click
+ if (getHouseBtn.textContent === "Get a House") {
+ getHouseBtn.textContent = "Assign New House";
+ }
+ retryBtn.classList.remove("hidden");
+}
+
+getHouseBtn.addEventListener("click", getRandomHouse);
+retryBtn.addEventListener("click", getRandomHouse);
diff --git a/assets/courses/foundation/intro-to-frontend/HogwartsHouseGenerator/index.html b/assets/courses/foundation/intro-to-frontend/HogwartsHouseGenerator/index.html
new file mode 100644
index 000000000..6e198039f
--- /dev/null
+++ b/assets/courses/foundation/intro-to-frontend/HogwartsHouseGenerator/index.html
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+ Hogwarts House generator
+
+
+
+
Hogwarts House generator
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/courses/foundation/intro-to-frontend/HogwartsHouseGenerator/styles.css b/assets/courses/foundation/intro-to-frontend/HogwartsHouseGenerator/styles.css
new file mode 100644
index 000000000..f95e627ac
--- /dev/null
+++ b/assets/courses/foundation/intro-to-frontend/HogwartsHouseGenerator/styles.css
@@ -0,0 +1,98 @@
+@import url("https://fonts.googleapis.com/css2?family=Bitter:ital,wght@0,100..900;1,100..900&family=Playwrite+US+Modern:wght@100..400&display=swap");
+
+body {
+ font-family: Bitter;
+ background-color: #0e0e0e;
+ margin: 0 auto;
+ padding: 50px;
+ color: #fff;
+}
+h1 {
+ text-align: center;
+ color: #fff;
+}
+.container {
+ max-width: 800px;
+ margin: 0 auto;
+ background-color: #7f2c2c;
+ padding: 20px;
+ border-radius: 8px;
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+}
+.input-text {
+ width: 50%;
+ height: auto;
+ padding: 8px;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ font-size: 1rem;
+}
+
+#getHouseBtn {
+ background-color: #d3d35d;
+ padding: 10px 20px;
+ border: none;
+ border-radius: 6px;
+ cursor: pointer;
+ font-size: 1rem;
+ transition: background-color 0.3s ease;
+}
+#getHouseBtn:hover {
+ background-color: #b5b53f;
+ color: #fff;
+}
+#retryBtn {
+ background-color: #4fb2d3;
+ padding: 10px 20px;
+ border: none;
+ border-radius: 6px;
+ cursor: pointer;
+ font-size: 1rem;
+ transition: background-color 0.3s ease;
+}
+#retryBtn:hover {
+ background-color: #3f8fa9;
+ color:#fff;
+}
+.house-info {
+ display: flex;
+ align-items: center;
+ margin-top: 20px;
+ gap: 25px;
+}
+.house-img {
+ width: 200px;
+ height: auto;
+ border-radius: 8px;
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
+}
+
+@media (max-width: 768px) {
+ body {
+ padding: 10px;
+ }
+ .container {
+ max-width: 100%;
+ padding: 15px;
+ }
+ .house-info {
+ flex-direction: column;
+ gap: 10px;
+ }
+ h1 {
+ font-size: 1.5rem;
+ }
+ .input-text {
+ width: 100%;
+ font-size: 1rem;
+ padding: 8px;
+ }
+ button {
+ width: 100%;
+ margin-top: 10px;
+ }
+}
+
+.hidden {
+ display: none;
+}
diff --git a/courses/foundation/intro-to-frontend/README.md b/assets/courses/foundation/intro-to-frontend/README.md
similarity index 100%
rename from courses/foundation/intro-to-frontend/README.md
rename to assets/courses/foundation/intro-to-frontend/README.md
diff --git a/assets/courses/foundation/intro-to-frontend/codewar.txt b/assets/courses/foundation/intro-to-frontend/codewar.txt
new file mode 100644
index 000000000..fb70cb136
--- /dev/null
+++ b/assets/courses/foundation/intro-to-frontend/codewar.txt
@@ -0,0 +1 @@
+Codewar https://www.codewars.com/users/Idesta1
\ No newline at end of file
diff --git a/assets/courses/foundation/intro-to-javascript/README.md b/assets/courses/foundation/intro-to-javascript/README.md
new file mode 100644
index 000000000..d42039874
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/README.md
@@ -0,0 +1,18 @@
+🧠 JavaScript Basics — Week 1 @ Hack Your Future
+
+Welcome to my JavaScript Week 1 project!
+
+This assignment is part of my learning journey at Hack Your Future, where I’m exploring the foundations of programming with JavaScript — focusing on variables, arrays, and basic operations.
+
+🚀 About Smart-ease
+
+Smart-ease is a fictional startup tech company created for this assignment.
+
+Our mission is to solve small but smart problems with simple, effective JavaScript solutions.
+
+As part of our work, we completed a series of JavaScript tasks demonstrating core programming concepts.
+
+learned declaring and using variables
+creating and manipulating arrays
+performing mathematical operations
+practice console.log and debugging
diff --git a/assets/courses/foundation/intro-to-javascript/excercise/exc.js b/assets/courses/foundation/intro-to-javascript/excercise/exc.js
new file mode 100644
index 000000000..78e2b9e54
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/excercise/exc.js
@@ -0,0 +1,10 @@
+const input = ["God", "Wolf", "Rail", "Gum", "Maps", "Live"];
+
+function reverseWords(words) {
+ const length = words.length;
+ let reverse = " ";
+ for (let i = words.length - 1; i >= 0; i--) {}
+ return reverse;
+}
+
+console.log(reverseWords(input));
diff --git a/assets/courses/foundation/intro-to-javascript/excercise/pizza.js b/assets/courses/foundation/intro-to-javascript/excercise/pizza.js
new file mode 100644
index 000000000..057eb167a
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/excercise/pizza.js
@@ -0,0 +1,32 @@
+const favoritePizza = "margarita";
+let margaritaPrice = 100;
+let pizzaCount = 5;
+let takeAway = true;
+
+const totalPrice = margaritaPrice * pizzaCount;
+
+if (takeAway) {
+ console.log(
+ "New pizza order: TakeAway" +
+ " " +
+ pizzaCount +
+ " " +
+ favoritePizza +
+ "." +
+ " Total cost for your order is " +
+ totalPrice +
+ " Kroner."
+ );
+} else {
+ console.log(
+ "New pizza order: In store" +
+ " " +
+ pizzaCount +
+ " " +
+ favoritePizza +
+ "." +
+ "Total cost for your pizza is " +
+ totalPrice +
+ " Kroner."
+ );
+}
diff --git a/assets/courses/foundation/intro-to-javascript/week1/agify.html b/assets/courses/foundation/intro-to-javascript/week1/agify.html
new file mode 100644
index 000000000..b16b9c800
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week1/agify.html
@@ -0,0 +1,204 @@
+
+
+
+
+
+ Agi-fy
+
+
+
+
+
Agi-fy(Future Age Calculator)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/courses/foundation/intro-to-javascript/week1/eznamey.js b/assets/courses/foundation/intro-to-javascript/week1/eznamey.js
new file mode 100644
index 000000000..d8b554491
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week1/eznamey.js
@@ -0,0 +1,32 @@
+let firstWords = [
+ "meta",
+ "tech",
+ "awesome",
+ "Easy",
+ "solution",
+ "Happy",
+ "solve",
+ "world",
+ "Best",
+ "terminal",
+];
+let secondWords = [
+ "lab",
+ "bbq",
+ "geek",
+ "norse",
+ "buddy",
+ "dog",
+ "memo",
+ "star",
+ "space",
+ "c",
+];
+
+const randomNumber = Math.floor(Math.random() * 10);
+const randomFirst = firstWords[Math.floor(Math.random() * 10)];
+const randomSecond = secondWords[Math.floor(Math.random() * 10)];
+
+const startupName = `${randomFirst} ${randomSecond}`;
+
+console.log("Your startup name is:", startupName);
diff --git a/assets/courses/foundation/intro-to-javascript/week1/goodboy.js b/assets/courses/foundation/intro-to-javascript/week1/goodboy.js
new file mode 100644
index 000000000..42efe9e55
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week1/goodboy.js
@@ -0,0 +1,13 @@
+const yearOfBirth = 2010;
+const yearFuture = 2025;
+const age = yearFuture - yearOfBirth;
+const shouldShowResultInDogYears = true;
+const dogYearsEquivalent = age * 7;
+
+if (shouldShowResultInDogYears) {
+ console.log(
+ "Your dog will be " + dogYearsEquivalent + " dog years old in " + yearFuture
+ );
+} else if (age) {
+ console.log("Your dog will be " + age + " human years old in " + yearFuture);
+}
diff --git a/assets/courses/foundation/intro-to-javascript/week1/housey.js b/assets/courses/foundation/intro-to-javascript/week1/housey.js
new file mode 100644
index 000000000..a8cc66d93
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week1/housey.js
@@ -0,0 +1,39 @@
+//peter's estimate
+
+const peterWidth = 8;
+const peterDepth = 10;
+const peterHeight = 10;
+
+const peterGardenSizeInM2 = 100;
+const peterHouseCosts = 25000000;
+const peterVolumeInMeters = peterWidth * peterDepth * peterHeight;
+const peterHousePrice =
+ peterVolumeInMeters * 2.5 * 1000 + peterGardenSizeInM2 * 300;
+
+if (peterHouseCosts > peterHousePrice) {
+ console.log("You are paying more");
+} else if (peterHouseCosts < peterHousePrice) {
+ console.log("You are paying less");
+} else {
+ console.log("You are paying fair!");
+}
+
+//Julia's estimate
+
+const juliaWidth = 5;
+const juliaDepth = 8;
+const juliaHeight = 11;
+
+const juliaGardenSizeInM2 = 100;
+const juliaHouseCosts = 2000000;
+const juliaVolumeInMeters = juliaWidth * juliaDepth * juliaHeight;
+const juliaHousePrice =
+ juliaVolumeInMeters * 2.5 * 1000 + juliaGardenSizeInM2 * 300;
+
+if (juliaHouseCosts > juliaHousePrice) {
+ console.log("You are paying more");
+} else if (juliaHouseCosts < juliaHousePrice) {
+ console.log("You are paying less");
+} else {
+ console.log("You have paid fair!");
+}
diff --git a/assets/courses/foundation/intro-to-javascript/week2/candy.js b/assets/courses/foundation/intro-to-javascript/week2/candy.js
new file mode 100644
index 000000000..66f18f62c
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week2/candy.js
@@ -0,0 +1,31 @@
+const boughtCandyPrices = [];
+
+function addCandy(candyType, weight) {
+ let pricePerGram;
+ if (candyType === "sweet") {
+ pricePerGram = 0.5;
+ } else if (candyType === "chocolate") {
+ pricePerGram = 0.7;
+ } else if (candyType === "toffee") {
+ pricePerGram = 1.1;
+ } else if (candyType === "chewing-gum") {
+ pricePerGram = 0.03;
+ } else {
+ console.log("Unknown candy type");
+ return;
+ }
+
+ const totalPrice = pricePerGram * weight;
+ boughtCandyPrices.push(candyType, totalPrice.toFixed());
+ return boughtCandyPrices;
+}
+
+const amountToSpend = Math.random() * 100;
+console.log(`You have ${amountToSpend.toFixed(2)} kroner to spend on candy.`);
+
+console.log(canBuyMoreCandy());
+
+console.log(addCandy("sweet", 20));
+console.log(addCandy("chocolate", 15));
+console.log(addCandy("toffee", 10));
+console.log(addCandy("chewing-gum", 5));
diff --git a/assets/courses/foundation/intro-to-javascript/week2/event.js b/assets/courses/foundation/intro-to-javascript/week2/event.js
new file mode 100644
index 000000000..626643881
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week2/event.js
@@ -0,0 +1,24 @@
+function getEventWeekday(daysToAdd) {
+ const weekDays = [
+ "Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday",
+ ];
+
+ const date = new Date();
+ const WeekDay = date.getDay();
+ const EventDay = (WeekDay + daysToAdd) % weekDays.length;
+
+ return weekDays[EventDay];
+}
+
+console.log(getEventWeekday(7));
+console.log(getEventWeekday(1));
+
+//function getEventWeekday with daysToAdd parameter,
+// declared variable in array weekDays Sunday - Saturday,
+// use new date() to access current date and getDay() to get current weekday 0-6,
diff --git a/assets/courses/foundation/intro-to-javascript/week2/flight.js b/assets/courses/foundation/intro-to-javascript/week2/flight.js
new file mode 100644
index 000000000..f3fbfed41
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week2/flight.js
@@ -0,0 +1,28 @@
+//Flight booking fullname function
+function getFullName(firstName, surName, useFormalName, gender) {
+ const formalName1 = "Lord";
+ const formalName2 = "Madam";
+ const fullName = firstName + " " + surName;
+ if (useFormalName === true && gender === "man") {
+ return formalName1 + " " + fullName;
+ } else if (useFormalName === true && gender === "woman") {
+ return formalName2 + " " + fullName;
+ } else {
+ return fullName;
+ }
+}
+
+const fullName1 = "Sam";
+const fullName2 = "David";
+
+console.log(getFullName("Benjamin", "Hughes", true, "man"));
+console.log(getFullName("Sarah", "Johnson", false, "woman"));
+console.log(getFullName("Dina", "Smith", true, "woman"));
+
+console.log(getFullName(fullName1, fullName2));
+
+//Formal fullname
+//to add formal name i added useFormalName another parameter and used if else condition and added boolean value to check if true to add formal name if false then just fullname.
+// i declared two variables formalName1 and formalName2 to store "Lord" and "Madam".
+//i called the function twice with different values to check if it works correctly.
+// to add gender options i added another parameter gender and used if else condition with "man" and "woman".
diff --git a/assets/courses/foundation/intro-to-javascript/week2/freecodecamp.txt b/assets/courses/foundation/intro-to-javascript/week2/freecodecamp.txt
new file mode 100644
index 000000000..fe8786db7
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week2/freecodecamp.txt
@@ -0,0 +1 @@
+https://www.freecodecamp.org/idesta
\ No newline at end of file
diff --git a/assets/courses/foundation/intro-to-javascript/week2/student.js b/assets/courses/foundation/intro-to-javascript/week2/student.js
new file mode 100644
index 000000000..fab9e2368
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week2/student.js
@@ -0,0 +1,49 @@
+const class07Students = ["Sam", "John", "Ben", "Rob", "Nancy", "Nova"];
+//total
+
+function addStudentToClass(studentName) {
+ // can not add empty string
+ if (!studentName) {
+ console.log("Cannot add empty string");
+ return;
+ }
+ //student already exists
+ if (class07Students.includes(studentName)) {
+ console.log(`Student ${studentName} is already in the class`);
+ return;
+ }
+ // can not add more than 6 students
+ if (class07Students.length >= 6 && studentName !== "QueenMary") {
+ console.log("Cannot add more students to class 07");
+ return;
+ }
+ //exceptional rule only for the Queen
+ if (studentName === "QueenMary") {
+ class07Students.push(studentName);
+ console.log("The Queen has to be added");
+ return;
+ }
+}
+
+//add student to class
+addStudentToClass("Susan");
+addStudentToClass("Ben");
+addStudentToClass("QueenMary");
+addStudentToClass("");
+
+// to add more students
+function getNumberOfStudents(studentName) {
+ if (class07Students.push(studentName)) {
+ console.log(`Add ${studentName} to the class`);
+ return;
+ }
+}
+// get total of students
+const total = class07Students.length;
+console.log(total);
+getNumberOfStudents("Jared");
+getNumberOfStudents("Lisa");
+getNumberOfStudents("Gelila");
+getNumberOfStudents("Sam");
+getNumberOfStudents("QueenMary");
+getNumberOfStudents(total);
diff --git a/assets/courses/foundation/intro-to-javascript/week2/weatherwear.js b/assets/courses/foundation/intro-to-javascript/week2/weatherwear.js
new file mode 100644
index 000000000..8cb974cf7
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week2/weatherwear.js
@@ -0,0 +1,19 @@
+function whatToWear(temperature) {
+ const winter = `Jacket , pants and sweater`;
+ const summer = `t-shirt , shorts and summer-dress`; //using template literals
+
+ if (temperature >= 17) {
+ return `You can wear ${summer}`;
+ } else if (temperature < 17) {
+ return `You can wear ${winter}`;
+ } else {
+ return "You can always decide what to wear";
+ }
+}
+
+console.log(whatToWear(20));
+console.log(whatToWear(10));
+console.log(whatToWear());
+
+//added temperature parameter and used if else condition to return whatToWear,
+//used template literal to concatenating strings
diff --git a/assets/courses/foundation/intro-to-javascript/week3/array.js b/assets/courses/foundation/intro-to-javascript/week3/array.js
new file mode 100644
index 000000000..876686af1
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week3/array.js
@@ -0,0 +1,92 @@
+// Item array removal...
+const names = [
+ "Peter",
+ "Ahmad",
+ "Yana",
+ "kristina",
+ "Rasmus",
+ "Samuel",
+ "Katrine",
+ "Tala",
+];
+
+const namesToRemove = "Ahmed";
+const index = names.indexOf(namesToRemove);
+
+if (index !== -1) {
+ names.splice(index, 1);
+}
+console.log(names.splice(1, 1));
+console.log(names); // ['Peter', 'Yana', 'kristina', 'Rasmus', 'Samuel', 'Katrine', 'Tala']
+
+//When will we be there??
+const travelInformation = {
+ speed: 50,
+ destinationDistance: 432,
+};
+const distance = travelInformation.destinationDistance;
+const speed = travelInformation.speed;
+const travelTime = distance / speed;
+
+function showTime() {
+ const hours = Math.floor(travelTime);
+ console.log(hours);
+ const minutes = Math.round((travelTime - hours) * 60);
+ console.log(minutes);
+ return `${hours} hours and ${minutes} minutes`;
+}
+console.log(showTime()); // 8 hours and 38 minutes
+
+// Series duration of my life...
+const seriesDurations = [
+ {
+ title: "Game of thrones",
+ days: 3,
+ hours: 1,
+ minutes: 0,
+ },
+ {
+ title: "Vikings",
+ days: 7,
+ hours: 3,
+ minutes: 29,
+ },
+ {
+ title: "Good Girls",
+ days: 1,
+ hours: 11,
+ minutes: 0,
+ },
+];
+
+const averageLifeSpan = 80;
+const daysInYear = 365;
+const hoursInDay = 24;
+const minutesInHour = 60;
+const averageLifeSpanInMinutes =
+ averageLifeSpan * daysInYear * hoursInDay * minutesInHour;
+
+function logOutSeriesText() {
+ seriesDurations.forEach((series) => {
+ const seriesDurationInMinutes =
+ series.days * hoursInDay * minutesInHour +
+ series.hours * minutesInHour +
+ series.minutes;
+ const percentageOfLife = (
+ (seriesDurationInMinutes / averageLifeSpanInMinutes) *
+ 100
+ ).toFixed(3);
+ console.log(`${series.title} took ${percentageOfLife}% of my life`);
+ });
+}
+
+const totalPercentage = seriesDurations.reduce((total, series) => {
+ const seriesDurationInMinutes =
+ series.days * hoursInDay * minutesInHour +
+ series.hours * minutesInHour +
+ series.minutes;
+ return total + (seriesDurationInMinutes / averageLifeSpanInMinutes) * 100;
+}, 0);
+console.log(`In total that is ${totalPercentage.toFixed(3)}% of my life`);
+
+logOutSeriesText();
diff --git a/assets/courses/foundation/intro-to-javascript/week3/cactus.js b/assets/courses/foundation/intro-to-javascript/week3/cactus.js
new file mode 100644
index 000000000..2d1306cd9
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week3/cactus.js
@@ -0,0 +1,63 @@
+// add activity using date, activity and duration parameters.
+const activities = [];
+const date = new Date().toISOString().split("T")[0];
+function addActivity(activity, duration) {
+ activities.push({
+ date: date,
+ activity: activity,
+ duration: duration,
+ });
+}
+
+console.log(addActivity("YouTube", 20));
+console.log(addActivity("Instagram", 40));
+console.log(addActivity("Duolingo", 10));
+
+console.log(activities);
+console.log(showStatus());
+// if we want to test or trigger add some activities before calling showStatus,
+// we also need to make activities 0 by uncommenting add activities
+
+// created show status function to show total duration, number of activities and date.
+function showStatus() {
+ let totalDuration = 0;
+ for (let i = 0; i < activities.length; i++) {
+ totalDuration += activities[i].duration;
+ }
+
+ if (activities.length === 0)
+ return "Add some activities before calling showStatus";
+ if (totalDuration >= 90)
+ return `You have reached your limit, no more activities for you!`;
+ if (activities.length !== 0 && totalDuration < 90)
+ return `You have added ${activities.length} activities on ${activities[0].date}, which totals to ${totalDuration} minutes.`;
+}
+
+console.log(showStatus());
+
+// created spentMostTimeOn function to find the activity with the most time spent.
+
+function spentMostTimeOn() {
+ const activityDuration = {};
+
+ for (let i = 0; i < activities.length; i++) {
+ const activity = activities[i].activity;
+ const duration = activities[i].duration;
+ if (activityDuration[activity]) {
+ activityDuration[activity] += duration;
+ } else {
+ activityDuration[activity] = duration;
+ }
+ }
+ let maxActivity = null;
+ let maxDuration = 0;
+ for (const activity in activityDuration) {
+ if (activityDuration[activity] > maxDuration) {
+ maxDuration = activityDuration[activity];
+ maxActivity = activity;
+ }
+ }
+ return maxActivity;
+}
+
+console.log(`You spent the most time on: ${spentMostTimeOn()}`);
diff --git a/assets/courses/foundation/intro-to-javascript/week3/note.js b/assets/courses/foundation/intro-to-javascript/week3/note.js
new file mode 100644
index 000000000..7b96a9526
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week3/note.js
@@ -0,0 +1,34 @@
+// save a note
+const notes = [];
+function saveNote(content, id) {
+ notes.push({ content: content, id: id });
+}
+
+saveNote("Pick up groceries", 1);
+saveNote("Do laundry", 2);
+
+console.log(notes);
+
+// get a note
+
+function getNote(id) {
+ return notes.find((note) => note.id === id);
+}
+
+const firstNote = getNote(1);
+const secondNote = getNote(2);
+console.log(firstNote);
+console.log(secondNote);
+
+// log out notes
+function logOutNotesFormatted() {
+ notes.forEach((note) => {
+ console.log(
+ `The note with id: ${note.id}, has the following note text: ${note.content}`
+ );
+ });
+}
+
+logOutNotesFormatted();
+
+// codepen https://codepen.io/Iglesia-Desta/pen/yyOombR?editors=1010
diff --git a/assets/courses/foundation/intro-to-javascript/week4/sandbox.txt b/assets/courses/foundation/intro-to-javascript/week4/sandbox.txt
new file mode 100644
index 000000000..f92a087ca
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week4/sandbox.txt
@@ -0,0 +1,2 @@
+CodeSandbox
+https://codesandbox.io/p/devbox/talk-to-your-computer-forked-xsl8vt?workspaceId=ws_99uGEcaND6m1NvYKq1Qadr
\ No newline at end of file
diff --git a/assets/courses/foundation/intro-to-javascript/week4/voiceasst.js b/assets/courses/foundation/intro-to-javascript/week4/voiceasst.js
new file mode 100644
index 000000000..2cd22d134
--- /dev/null
+++ b/assets/courses/foundation/intro-to-javascript/week4/voiceasst.js
@@ -0,0 +1,99 @@
+const user = {}; // store a user's name and array of names provided through commands.
+const todos = [];
+function getReply(argument) {
+ if (!argument || !argument.trim()) return `Please provide a command.`; //if argument is empty or whitespace
+ const command = argument.toLowerCase(); //converts input command to lowercase to make it case insensitive
+
+ if (command.startsWith("hello my name is ")) {
+ const name = argument.slice(17).trim().split(" "); //retrieves the name part starting from the 17th character
+ user.name = name
+ .map((n) => n.charAt(0).toUpperCase() + n.slice(1)) //capitalizing the first letter and then joining them back into a single string
+ .join(" ");
+
+ const nameArray = []; // loops through name and creates an array of unique names , storing it in user.nameArray
+ for (let i = 0; i < name.length; i++) {
+ if (!nameArray.includes(name[i])) {
+ nameArray.push(name[i]);
+ }
+ }
+ user.nameArray = nameArray;
+ return `Nice to meet you ${user.name}`;
+ } else if (command === "what is my name?") {
+ // checks if the user's name is stored
+ if (user.name) {
+ return `Your name is ${user.name}`; //if name exists it returns name
+ } else {
+ return `I don't know your name yet.`; //if name does not exist
+ }
+ } else if (command.startsWith("add ")) {
+ const item = argument.slice(4, command.indexOf(" to my todo")).trim();
+ todos.push(item);
+ return `${item} added to your todo`;
+ } else if (command.startsWith("remove ")) {
+ const item = argument.slice(7, command.indexOf(" from my todo")).trim();
+ const index = todos.indexOf(item);
+ if (index > -1) {
+ todos.splice(index, 1);
+ return `${item} removed from your todo`;
+ } else {
+ return `${item} is not in your todo`;
+ }
+ } else if (command === "what is on my todo?") {
+ if (todos.length === 0) {
+ return `Your todo is empty.`;
+ } else {
+ return `You have ${todos.length} todos - ${todos.join(", ")}`;
+ }
+ } else if (command === "what day is it today?") {
+ const today = new Date();
+ const options = {
+ weekday: "long",
+ year: "numeric",
+ month: "long",
+ day: "numeric",
+ };
+ return `Today is ${today.toLocaleDateString("en-US", options)}`;
+ } else if (command.startsWith("what is ")) {
+ const expression = argument.slice(8).trim();
+ try {
+ const result = Function(`"use strict"; return (${expression})`)();
+ return `The answer is ${result}`;
+ } catch (error) {
+ return `I cannot compute that expression.`;
+ }
+ } else if (command.startsWith("set a timer for ")) {
+ const timePart = command.slice(16);
+ const timeComponents = timePart.split(" ");
+ const duration = parseInt(timeComponents[0]);
+ const unit = timeComponents[1];
+ let milliseconds = 0;
+ if (unit === "seconds") {
+ milliseconds = duration * 1000;
+ } else if (unit === "minutes") {
+ milliseconds = duration * 60 * 1000;
+ } else if (unit === "hours") {
+ milliseconds = duration * 60 * 60 * 1000;
+ }
+ setTimeout(() => {
+ console.log("Timer done");
+ }, milliseconds);
+ return `Timer set for ${duration} ${unit}`;
+ } else {
+ return `Please specify a valid time unit (seconds, minutes, hours).`;
+ }
+}
+
+console.log(getReply("hello my name is Benjamin L Smith"));
+console.log(getReply("What is my name?"));
+console.log(getReply("Add fishing to my todo"));
+console.log(getReply("Add singing in the shower to my todo"));
+console.log(getReply("Remove fishing from my todo"));
+console.log(getReply("What is on my todo?"));
+console.log(getReply("What day is it today?"));
+console.log(getReply("What is + 3"));
+console.log(getReply("set a timer for 4 minutes"));
+console.log(getReply("Add dancing to my todo"));
+console.log(getReply("Add hiking to my todo"));
+console.log(getReply("What is 3 * 3"));
+console.log(getReply("what is 6 / 2"));
+console.log(getReply("what is 6-2"));
diff --git a/courses/foundation/intro-to-javascript/README.md b/assets/courses/foundation/intro-to-using-ai/README.md
similarity index 100%
rename from courses/foundation/intro-to-javascript/README.md
rename to assets/courses/foundation/intro-to-using-ai/README.md
diff --git a/assets/courses/foundation/intro-to-using-ai/portfolio/assets/art-website.PNG b/assets/courses/foundation/intro-to-using-ai/portfolio/assets/art-website.PNG
new file mode 100644
index 000000000..bdae836f0
Binary files /dev/null and b/assets/courses/foundation/intro-to-using-ai/portfolio/assets/art-website.PNG differ
diff --git a/assets/courses/foundation/intro-to-using-ai/portfolio/assets/travel vlog.PNG b/assets/courses/foundation/intro-to-using-ai/portfolio/assets/travel vlog.PNG
new file mode 100644
index 000000000..ca0fda005
Binary files /dev/null and b/assets/courses/foundation/intro-to-using-ai/portfolio/assets/travel vlog.PNG differ
diff --git a/assets/courses/foundation/intro-to-using-ai/portfolio/assets/weather_app.PNG b/assets/courses/foundation/intro-to-using-ai/portfolio/assets/weather_app.PNG
new file mode 100644
index 000000000..3e6932a07
Binary files /dev/null and b/assets/courses/foundation/intro-to-using-ai/portfolio/assets/weather_app.PNG differ
diff --git a/assets/courses/foundation/intro-to-using-ai/portfolio/index.html b/assets/courses/foundation/intro-to-using-ai/portfolio/index.html
new file mode 100644
index 000000000..cf354b8c7
--- /dev/null
+++ b/assets/courses/foundation/intro-to-using-ai/portfolio/index.html
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+ About Me
+
+
+
+
+
+
+
+
+
+ Hello, I am Iglesia
+
+
+ A Front-end Developer based in Denmark
+
+
+ I am an aspiring travel specialist transitioning into a tech career
+ with a passion for creating intuitive and visually engaging digital
+ experiences. Currently living in Denmark, I am actively expanding my
+ skills through hands-on projects, online courses, and a commitment
+ to continuous learning. My focus is on mastering key front-end
+ technologies like HTML, CSS, JavaScript, and modern frameworks such
+ as React and Vue.js.
+
+
+
+
+
+
+
+
+
+
+
+ About me👩🏽💻
+
+
+ In my free time, I love drawing and visiting places with my
+ family. I’m passionate about web developing and my goal is to help
+ clients by creating seamless and visually appealing websites.
+
+ );
+};
+
+export default Crew;
diff --git a/assets/courses/frontend/react/space-galactica-app/src/pages/AboutUsPage/AboutUsPage.module.css b/assets/courses/frontend/react/space-galactica-app/src/pages/AboutUsPage/AboutUsPage.module.css
new file mode 100644
index 000000000..e84b96ffb
--- /dev/null
+++ b/assets/courses/frontend/react/space-galactica-app/src/pages/AboutUsPage/AboutUsPage.module.css
@@ -0,0 +1,125 @@
+.app {
+ background-color: black;
+ width: 100vw;
+ height: 100vh;
+}
+
+h1 {
+ font-weight: 200;
+}
+
+h2 {
+ font-size: 21px;
+ opacity: 0.9;
+}
+
+p {
+ font-size: 14px;
+}
+
+.valuesContainer {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ background-color: #080c24;
+ padding: 30px;
+ gap: 20px;
+ margin-top: 30px;
+}
+
+.valueCard {
+ background: #111;
+ border: 1px solid #2f2f2f;
+ border-radius: 12px;
+ padding: 18px;
+}
+
+.valueNumber {
+ font-size: 3rem;
+ font-weight: 200;
+ line-height: 1;
+ margin: 0 0 8px;
+ color: #ffffff;
+ opacity: 0.9;
+}
+
+.valueTitle {
+ font-size: 1.05rem;
+ margin: 0 0 10px;
+ color: #ffffff;
+}
+
+.valueDescription {
+ font-size: 0.9rem;
+ line-height: 1.5;
+ margin: 0;
+ color: #d4d4d4;
+}
+
+.crewGrid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 20px;
+ margin-top: 24px;
+}
+
+.crewCard {
+ border: 1px solid #333;
+ border-radius: 12px;
+ padding: 16px;
+ background: #111;
+ color: #fff;
+}
+
+.crewImage {
+ width: 100%;
+ max-width: 220px;
+ height: auto;
+ display: block;
+ margin-bottom: 12px;
+}
+
+.partnersGrid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 20px;
+ margin-top: 30px;
+ align-items: center;
+}
+
+.partnerLogo {
+ width: 100%;
+ max-width: 150px;
+ display: block;
+ margin: 0 auto;
+}
+
+@media (max-width: 768px) {
+ .valuesContainer {
+ grid-template-columns: 1fr;
+ font-size: 12px;
+ }
+ .valueCard {
+ padding: 14px;
+ font-size: 12px;
+ }
+ .valueNumber {
+ font-size: 1.8rem;
+ }
+
+ .crewGrid {
+ grid-template-columns: 1fr;
+ }
+ .crewCard {
+ padding: 14px;
+ font-size: 12px;
+ }
+ .crewImage {
+ max-width: 180%;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .partnerLogo {
+ max-width: 120px;
+ width: 70px;
+ }
+}
diff --git a/assets/courses/frontend/react/space-galactica-app/src/pages/AboutUsPage/OurCrew.jsx b/assets/courses/frontend/react/space-galactica-app/src/pages/AboutUsPage/OurCrew.jsx
new file mode 100644
index 000000000..9cd40dcbe
--- /dev/null
+++ b/assets/courses/frontend/react/space-galactica-app/src/pages/AboutUsPage/OurCrew.jsx
@@ -0,0 +1,64 @@
+import styles from "./AboutUsPage.module.css";
+
+const crewMembers = [
+ {
+ id: 1,
+ name: "Captain Sarah Vega",
+ Title: "Astronaut",
+ description:
+ "A former NASA astronaut with over 15 years of experience, Captain Vega leads our missions with unparalleled expertise and a passion for space exploration.",
+ image: "/crew/image-sarah-vega.png",
+ },
+ {
+ id: 2,
+ name: "Dr.Leo Redding",
+ Title: "Chief astroPhysicist",
+ description:
+ "Dr. Redding is a renowned astrophysicist whose groundbreaking research on black holes and dark matter has earned him international acclaim.",
+ image: "/crew/image-leo-redding.png",
+ },
+ {
+ id: 3,
+ name: " Mark Shuttleworth",
+ Title: "Chief Engineer",
+ description:
+ "With his extensive background in aerospace engineering, He is responsible for the state-of-the-art technology that powers our spacecraft. Her innovation ensures that our travelers are always in safe hands.",
+ image: "/crew/image-mark-shuttleworth.png",
+ },
+ {
+ id: 4,
+ name: "Alex Santos",
+ Title: "Mission Specialist",
+ description:
+ " As a mission specialist, Alex’s job is to ensure that every aspect of the journey runs smoothly. With a background in both science and adventure tourism, Alex is the perfect guide for our space travelers.",
+ image: "/crew/image-alex-santos.png",
+ },
+];
+
+const OurCrew = () => {
+ return (
+
+
+ Our crew is the heart and soul of Galactica. We are a diverse team of
+ seasoned space explorers, engineers, and visionaries who are united by a
+ common goal: to make space travel accessible and exciting for all.
+
+ We collaborate with some of the most respected names in the space and
+ technology industries to make every journey extraordinary.
+
+
+ {partners.map((partner) => (
+
+ ))}
+
+
+ );
+};
+
+export default OurPartners;
diff --git a/assets/courses/frontend/react/space-galactica-app/src/pages/AboutUsPage/OurValues.jsx b/assets/courses/frontend/react/space-galactica-app/src/pages/AboutUsPage/OurValues.jsx
new file mode 100644
index 000000000..b51df5a9d
--- /dev/null
+++ b/assets/courses/frontend/react/space-galactica-app/src/pages/AboutUsPage/OurValues.jsx
@@ -0,0 +1,49 @@
+import styles from "./AboutUsPage.module.css";
+
+const values = [
+ {
+ number: "01",
+ title: "Exploration",
+ description:
+ "We are driven by a deep-seated desire to explore the unknown. We believe that the pursuit of discovery is at the heart of human nature, and we are committed to pushing the boundaries of what is possible.",
+ },
+ {
+ number: "02",
+ title: "Innovation",
+ description:
+ "At Galactica, we prioritize cutting-edge technology and innovation. We are constantly evolving our spacecraft, safety protocols, and services to ensure that our travelers experience the most advanced and secure space journeys available.",
+ },
+ {
+ number: "03",
+ title: "Sustainability",
+ description:
+ "We are committed to making space exploration sustainable for future generations. Our space missions are designed to minimize environmental impact, both on Earth and in space, and to foster a spirit of responsibility towards our universe.",
+ },
+ {
+ number: "04",
+ title: "Community",
+ description:
+ "We believe in the power of collective exploration. Our journeys are not just about reaching new destinations; they are about building a community of space enthusiasts who share a passion for the stars.",
+ },
+];
+
+const OurValues = () => {
+ return (
+
+
+ );
+};
diff --git a/assets/courses/frontend/react/space-galactica-app/src/pages/DestinationPage/DestinationPage.jsx b/assets/courses/frontend/react/space-galactica-app/src/pages/DestinationPage/DestinationPage.jsx
new file mode 100644
index 000000000..d42d615d3
--- /dev/null
+++ b/assets/courses/frontend/react/space-galactica-app/src/pages/DestinationPage/DestinationPage.jsx
@@ -0,0 +1,130 @@
+import { useState } from "react";
+import styles from "./DestinationPage.module.css";
+import PlanetCard from "./PlanetCard";
+import { AddWishlistItem } from "./AddWishlistItem";
+
+const planetsData = [
+ {
+ name: "Europa",
+ description:
+ "Europa, one of Jupiter’s moons, is an icy world with a hidden ocean beneath its surface. This mysterious moon is a prime candidate for the search for extraterrestrial life, making it a thrilling destination for space explorers.",
+ thumbnail: "/destination/image-europa.png",
+ },
+ {
+ name: "Mars",
+ description:
+ "Mars, the Red Planet, is a barren yet fascinating world with vast deserts, towering volcanoes, and the deepest canyon in the solar system. As humanity’s next frontier, Mars invites us to dream of colonization and the possibilities of life beyond Earth.",
+ thumbnail: "/destination/image-mars.png",
+ },
+ {
+ name: "Moon",
+ description:
+ "Our closest celestial neighbor, the Moon, is a silent witness to Earth's history. With its stunning craters and desolate landscapes, the Moon offers a unique glimpse into space exploration's past and future, making it a perfect destination for lunar adventurers.",
+ thumbnail: "/destination/image-moon.png",
+ },
+ {
+ name: "Titan",
+ description:
+ "Titan, Saturn's largest moon, is a world of dense atmosphere and liquid methane lakes. This enigmatic moon is shrouded in a thick orange haze, concealing a landscape that is both alien and strangely familiar, beckoning explorers to uncover its secrets.",
+ thumbnail: "/destination/image-titan.png",
+ },
+];
+
+const PlanetsWishlistItem = ({ name, thumbnail, onRemove }) => {
+ return (
+
+ I am an aspiring travel specialist transitioning into a tech career
+ with a passion for creating intuitive and visually engaging digital
+ experiences. Currently living in Denmark, I am actively expanding my
+ skills through hands-on projects, online courses, and a commitment
+ to continuous learning. My focus is on mastering key front-end
+ technologies like HTML, CSS, JavaScript, and modern frameworks such
+ as React and Vue.js.
+
+
+
+
+
+
+
+
+
+
+
+
About Me
+
+ With a background in travel and a passion for technology, I am
+ dedicated to building a career in front-end development. I have
+ honed my skills through various projects, online courses, and
+ continuous learning, focusing on creating engaging and responsive
+ web applications.
+
+
+ I thrive on building user-friendly websites and applications that
+ not only look great but also deliver exceptional functionality. My
+ goal is to help clients bring their visions to life through clean,
+ efficient, and innovative code.
+
+ A React-based dictionary app for quick word definitions, synonyms, and antonyms. Features a clean, responsive design and improved my skills in React, API integration, and responsive web design.
+
+
+ A travel vlog website showcasing Copenhagen's top attractions. This project enhanced my skill in responsive web design, multimedia integration, and user experience optimization.
+
+ A weather forecast app that provides real-time weather updates for any location. This project improved my skills in API integration, asynchronous JavaScript, and responsive design.
+
-
-
-
- );
-}
\ No newline at end of file
diff --git a/courses/frontend/react/space-galactica-app/src/pages/AboutUsPage/AboutUsPage.jsx b/courses/frontend/react/space-galactica-app/src/pages/AboutUsPage/AboutUsPage.jsx
deleted file mode 100644
index 9cfb53dc9..000000000
--- a/courses/frontend/react/space-galactica-app/src/pages/AboutUsPage/AboutUsPage.jsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import styles from './AboutUsPage.module.css';
-
-// 🧑🏽🚀 Task - Week 1
-// After you are finished with creating the page, move the OurValues, OurCrew, OurPartners components into their own files in this folder.
-// Import and use the components from the newly created files.
-
-const OurValues = () => {
- // 🧑🏽🚀 Task - Week 1
- // Create the "Our Values" section.
- // Use the descriptions provided in /src/pages/AboutUsPage/README.md.
- // Some inspiration ideas can be found in /data/inspiration_about_us.
- return (
-
ADD OUR VALUES HERE
- );
-};
-
-const OurCrew = () => {
- // 🧑🏽🚀 Task - Week 1
- // Create the "Our Crew section".
- // Use the descriptions provided in /src/pages/AboutUsPage/README.md.
- // Use the pictures from /public/crew.
- // Some inspiration ideas can be found in /data/inspiration_about_us.
- return (
-
ADD OUR CREW HERE
- );
-}
-
-const OurPartners = () => {
- // 🧑🏽🚀 Task - Week 1
- // Create the "Our Partners section".
- // Use the descriptions provided in /src/pages/AboutUsPage/README.md.
- // Use the pictures from /public/business_partners.
- // Some inspiration ideas can be found in /data/inspiration_about_us.
- return (
-