Index: frontend/src/components/Navbar.tsx
===================================================================
--- frontend/src/components/Navbar.tsx	(revision 4f59a58017fe45923d55e066e2dd9f821de74277)
+++ frontend/src/components/Navbar.tsx	(revision 30a7df0656c54cce36be6925e7ce15d9b4cf84e6)
@@ -2,149 +2,149 @@
 import { useState } from "react";
 import { Link, useNavigate } from "react-router-dom";
+import { toast } from "react-toastify";
 import IOimage from "../assets/IOLogo.png";
 import { useAuth } from "../hooks/useAuth";
-import { toast } from "react-toastify";
 
 const Navbar: React.FC = () => {
-  const [menuOpen, setMenuOpen] = useState(false);
-  const { isAuthenticated, logout } = useAuth();
-  const navigate = useNavigate();
-  const { login } = useAuth();
+	const [menuOpen, setMenuOpen] = useState(false);
+	const { isAuthenticated, logout } = useAuth();
+	const navigate = useNavigate();
+	const { login } = useAuth();
 
-  const handleLogout = () => {
-    logout();
-    navigate("/");
-    toast.success("Успешно сте одјавени!");
-  };
+	const handleLogout = () => {
+		logout();
+		navigate("/");
+		toast.success("Успешно сте одјавени!");
+	};
 
-  const testAccountLogin = async () => {
-    if (isAuthenticated) return;
-    try {
-      const response = await axios.post("http://localhost:8000/auth/login/", {
-        email: "fffff@finki.ukim.mk",
-        password: "testTestTEST123",
-      });
-      const { access, refresh } = response.data;
-      login(access, refresh);
-      navigate("/");
-    } catch (err: unknown) {
-      console.log(err);
-    }
-  };
+	const testAccountLogin = async () => {
+		if (isAuthenticated) return;
+		try {
+			const response = await axios.post("http://localhost:8000/auth/login/", {
+				email: "fffff@finki.ukim.mk",
+				password: "testTestTEST123",
+			});
+			const { access, refresh } = response.data;
+			login(access, refresh);
+			navigate("/");
+		} catch (err: unknown) {
+			console.log(err);
+		}
+	};
 
-  return (
-    <nav className="bg-blue-600 text-white p-4">
-      <div className="flex justify-between items-center">
-        <div className="flex items-center space-x-4">
-          <Link to="/">
-            <img
-              src={IOimage}
-              alt="Дома"
-              className="w-10 h-10 object-cover rounded-lg shadow-md hover:scale-110 transition duration-300"
-            />
-          </Link>
-        </div>
-        <button
-          onClick={() => setMenuOpen(!menuOpen)}
-          className="sm:hidden focus:outline-none"
-        >
-          <svg
-            className="w-6 h-6"
-            fill="none"
-            stroke="currentColor"
-            viewBox="0 0 24 24"
-          >
-            {menuOpen ? (
-              <path
-                strokeLinecap="round"
-                strokeLinejoin="round"
-                strokeWidth="2"
-                d="M6 18L18 6M6 6l12 12"
-              />
-            ) : (
-              <path
-                strokeLinecap="round"
-                strokeLinejoin="round"
-                strokeWidth="2"
-                d="M4 6h16M4 12h16M4 18h16"
-              />
-            )}
-          </svg>
-        </button>
+	return (
+		<nav className="bg-blue-600 text-white p-4">
+			<div className="flex justify-between items-center">
+				<div className="flex items-center space-x-4">
+					<Link to="/">
+						<img
+							src={IOimage}
+							alt="Дома"
+							className="w-10 h-10 object-cover hover:scale-110 transition duration-300"
+						/>
+					</Link>
+				</div>
+				<button
+					onClick={() => setMenuOpen(!menuOpen)}
+					className="sm:hidden focus:outline-none"
+				>
+					<svg
+						className="w-6 h-6"
+						fill="none"
+						stroke="currentColor"
+						viewBox="0 0 24 24"
+					>
+						{menuOpen ? (
+							<path
+								strokeLinecap="round"
+								strokeLinejoin="round"
+								strokeWidth="2"
+								d="M6 18L18 6M6 6l12 12"
+							/>
+						) : (
+							<path
+								strokeLinecap="round"
+								strokeLinejoin="round"
+								strokeWidth="2"
+								d="M4 6h16M4 12h16M4 18h16"
+							/>
+						)}
+					</svg>
+				</button>
 
-        <div className="hidden sm:flex space-x-4 items-center text-sm sm:text-base">
-          <button onClick={testAccountLogin}>quick login</button>
-          <Link to="/subjects" className="hover:underline">
-            Предмети
-          </Link>
-          {isAuthenticated && (
-            <Link to="/recommendations" className="hover:underline">
-              Препораки
-            </Link>
-          )}
-          {isAuthenticated && (
-            <Link to="/account" className="hover:underline">
-              Профил
-            </Link>
-          )}
-          {isAuthenticated ? (
-            <button
-              onClick={handleLogout}
-              className="bg-red-500 hover:bg-red-600 px-3 py-1 rounded"
-            >
-              Одјави се
-            </button>
-          ) : (
-            <>
-              <Link to="/login" className="hover:underline">
-                Најави се
-              </Link>
-              <Link to="/register" className="hover:underline">
-                Регистрирај се
-              </Link>
-            </>
-          )}
-        </div>
-      </div>
+				<div className="hidden sm:flex space-x-4 items-center text-sm sm:text-base">
+					<button onClick={testAccountLogin}>quick login</button>
+					<Link to="/subjects" className="hover:underline">
+						Предмети
+					</Link>
+					{isAuthenticated && (
+						<Link to="/recommendations" className="hover:underline">
+							Препораки
+						</Link>
+					)}
+					{isAuthenticated && (
+						<Link to="/account" className="hover:underline">
+							Профил
+						</Link>
+					)}
+					{isAuthenticated ? (
+						<button
+							onClick={handleLogout}
+							className="bg-red-500 hover:bg-red-600 px-3 py-1 rounded"
+						>
+							Одјави се
+						</button>
+					) : (
+						<>
+							<Link to="/login" className="hover:underline">
+								Најави се
+							</Link>
+							<Link to="/register" className="hover:underline">
+								Регистрирај се
+							</Link>
+						</>
+					)}
+				</div>
+			</div>
 
-      {menuOpen && (
-        <div className="sm:hidden mt-3 flex flex-col space-y-2 text-sm">
-          <Link to="/subjects" className="hover:underline">
-            Предмети
-          </Link>
-          {isAuthenticated && (
-            <Link to="/account" className="hover:underline">
-              Профил
-            </Link>
-          )}
-          {isAuthenticated && (
-            <Link to="/recommendations" className="hover:underline">
-              Препораки
-            </Link>
-          )}
-          {isAuthenticated ? (
-            <button
-              onClick={() => {
-                handleLogout();
-                setMenuOpen(false);
-              }}
-              className="bg-red-500 hover:bg-red-600 px-3 py-1 rounded"
-            >
-              Одјави се
-            </button>
-          ) : (
-            <>
-              <Link to="/login" onClick={() => setMenuOpen(false)}>
-                Најави се
-              </Link>
-              <Link to="/register" onClick={() => setMenuOpen(false)}>
-                Регистрирај се
-              </Link>
-            </>
-          )}
-        </div>
-      )}
-    </nav>
-  );
+			{menuOpen && (
+				<div className="sm:hidden mt-3 flex flex-col space-y-2 text-sm">
+					<Link to="/subjects" className="hover:underline">
+						Предмети
+					</Link>
+					{isAuthenticated && (
+						<Link to="/account" className="hover:underline">
+							Профил
+						</Link>
+					)}
+					{isAuthenticated && (
+						<Link to="/recommendations" className="hover:underline">
+							Препораки
+						</Link>
+					)}
+					{isAuthenticated ? (
+						<button
+							onClick={() => {
+								handleLogout();
+								setMenuOpen(false);
+							}}
+							className="bg-red-500 hover:bg-red-600 px-3 py-1 rounded"
+						>
+							Одјави се
+						</button>
+					) : (
+						<>
+							<Link to="/login" onClick={() => setMenuOpen(false)}>
+								Најави се
+							</Link>
+							<Link to="/register" onClick={() => setMenuOpen(false)}>
+								Регистрирај се
+							</Link>
+						</>
+					)}
+				</div>
+			)}
+		</nav>
+	);
 };
 
Index: frontend/src/components/StudentForm/StudentForm.tsx
===================================================================
--- frontend/src/components/StudentForm/StudentForm.tsx	(revision 4f59a58017fe45923d55e066e2dd9f821de74277)
+++ frontend/src/components/StudentForm/StudentForm.tsx	(revision 30a7df0656c54cce36be6925e7ce15d9b4cf84e6)
@@ -1,9 +1,9 @@
 import { useEffect, useState } from "react";
 import {
-  EVALUATIONS,
-  EVALUATIONS_MAP,
-  STUDY_EFFORT,
-  STUDY_TRACKS,
-  YEARS,
+	EVALUATIONS,
+	EVALUATIONS_MAP,
+	STUDY_EFFORT,
+	STUDY_TRACKS,
+	YEARS,
 } from "../../constants/subjects";
 import { useAuth } from "../../hooks/useAuth";
@@ -13,645 +13,645 @@
 import SubjectsSelector from "./SubjectsSelector";
 import {
-  getPassedSubjectsByID,
-  LatinToCyrillic,
-  mapToID,
-  validateForm,
+	getPassedSubjectsByID,
+	LatinToCyrillic,
+	mapToID,
+	validateForm,
 } from "./utils";
 
 interface StudentFormProps {
-  formData: StudentData | null;
-  isLoading: boolean;
-  setIsLoading?: (b: boolean) => void;
+	formData: StudentData | null;
+	isLoading: boolean;
+	setIsLoading?: (b: boolean) => void;
 }
 
 interface DistinctSubjectData {
-  tags: string[];
-  professors: string[];
-  technologies: string[];
+	tags: string[];
+	professors: string[];
+	technologies: string[];
 }
 
 const StudentForm = ({ formData, isLoading }: StudentFormProps) => {
-  const { accessToken } = useAuth();
-  const [isSubmitted, setIsSubmitted] = useState(false);
-  const [validationErrors, setValidationErrors] = useState<{
-    [key: string]: string;
-  }>({});
-  const [index, setIndex] = useState(formData?.index || "");
-  const [studyTrack, setStudyTrack] = useState<StudyTrack | "">(
-    (formData?.study_track as StudyTrack) || ""
-  );
-  const [year, setYear] = useState(formData?.current_year || 1);
-  const [passedSubjectsPerSemester, setPassedSubjectsPerSemester] = useState<
-    Record<number, Subject[]>
-  >(
-    formData?.passed_subjects_per_semester ??
-      Object.fromEntries(Array.from({ length: 8 }, (_, i) => [[i + 1], []]))
-  );
-  const [studyEffort, setStudyEffort] = useState(formData?.study_effort || "");
-  const [domains, setDomains] = useState<string[]>(formData?.tags || []);
-  const [semesterSearchTerms, setSemesterSearchTerms] = useState<
-    Record<number, string>
-  >({});
-  const [professorsSearchTerm, setProfessorSearchTerm] = useState("");
-  const [technologies, setTechnologies] = useState<string[]>(
-    formData?.technologies || []
-  );
-  const [evaluation, setEvaluation] = useState(formData?.evaluation || []);
-  const [favoriteProfs, setFavoriteProfs] = useState<string[]>(
-    formData?.professors || []
-  );
-  const [isNemamSelected, setIsNemamSelected] = useState({
-    domains: false,
-    tech: false,
-    eval: false,
-    prof: false,
-  });
-  const [formStatus, setFormStatus] = useState<{
-    isSubmitting: boolean;
-    message: string;
-    isError: boolean;
-  }>({
-    isSubmitting: false,
-    message: "",
-    isError: false,
-  });
-  const [showProfessors, setShowProfessors] = useState(false);
-  const [subjects, setSubjects] = useState<Subject[]>([]);
-  const [distinctSubjectData, setDistinctSubjectData] =
-    useState<DistinctSubjectData>({
-      tags: [],
-      professors: [],
-      technologies: [],
-    });
-  const [hasExtracurricular, setHasExtracurricular] = useState(false);
-  const [invalidSubjects, setInvalidSubjects] = useState<Subject[]>([]);
-
-  // Update form when formData changes (e.g., after fetching user data)
-  useEffect(() => {
-    if (formData) {
-      setIndex(formData.index || "");
-      setStudyTrack((formData.study_track as StudyTrack) || "");
-      setYear(formData.current_year || 1);
-      setStudyEffort(formData.study_effort || "");
-
-      const domains_ = (formData.tags || []).includes("None")
-        ? []
-        : formData.tags || [];
-      setDomains(domains_);
-
-      const technologies_ = (formData.technologies || []).includes("None")
-        ? []
-        : formData.technologies || [];
-      setTechnologies(technologies_);
-
-      const eval_ = (formData.evaluation || []).map(
-        (val: string) =>
-          Object.keys(EVALUATIONS_MAP).find(
-            (key) =>
-              EVALUATIONS_MAP[key as keyof typeof EVALUATIONS_MAP] === val
-          ) || val
-      );
-      setEvaluation(
-        eval_.includes("Немам") || eval_.includes("None") ? [] : eval_
-      );
-
-      const favoriteProfs_ = (formData.professors || []).includes("None")
-        ? []
-        : formData.professors || [];
-      setFavoriteProfs(favoriteProfs_);
-
-      setPassedSubjectsPerSemester(formData.passed_subjects_per_semester || []);
-    }
-  }, [formData]);
-
-  useEffect(() => {
-    const fetchSubjects = async () => {
-      try {
-        const resSubjects = await fetch("http://localhost:8000/subjects");
-        if (resSubjects.ok) {
-          const subJson: Subject[] = await resSubjects.json();
-          setSubjects(subJson || []);
-          const allProfessors: string[] = subJson
-            .flatMap((subject: Subject) => subject.subject_info.professors)
-            .filter((p): p is string => typeof p === "string");
-          const uniqueProfessors = Array.from(new Set(allProfessors));
-          const allProfessors_ = uniqueProfessors
-            .filter((prof) => prof.trim().toLowerCase() !== "сите професори")
-            .sort((a, b) => a.localeCompare(b));
-          setDistinctSubjectData(() => ({
-            tags: Array.from(
-              new Set(subJson.flatMap((subject) => subject.subject_info.tags))
-            ).sort((a, b) => a.localeCompare(b)),
-            technologies: Array.from(
-              new Set(
-                subJson
-                  .flatMap((subject) => subject.subject_info.technologies)
-                  .filter((tech) => tech != "any" && tech != "")
-              )
-            ).sort((a, b) => a.localeCompare(b)),
-            professors: allProfessors_,
-          }));
-        }
-      } catch (error) {
-        console.error("Error fetching subjects:", error);
-      }
-    };
-
-    fetchSubjects();
-  }, []);
-
-  const toggleSubject = (subject: Subject, semester: number) => {
-    const exists = (passedSubjectsPerSemester[semester] || []).some(
-      (s) => s.id === subject.id
-    );
-    if (exists) {
-      setPassedSubjectsPerSemester({
-        ...passedSubjectsPerSemester,
-        [semester]: passedSubjectsPerSemester[semester].filter(
-          (s) => s.id != subject.id
-        ),
-      });
-    } else {
-      setPassedSubjectsPerSemester({
-        ...passedSubjectsPerSemester,
-        [semester]: [...(passedSubjectsPerSemester[semester] || []), subject],
-      });
-    }
-  };
-
-  const handleSubmit = async (e: React.FormEvent) => {
-    e.preventDefault();
-    const totalCredits = { value: -1 };
-    const creditsByLevel = { value: [0, 0, 0] };
-    const errors = validateForm({
-      index,
-      studyTrack,
-      year,
-      studyEffort,
-      passedSubjectsPerSemester,
-      hasExtracurricular,
-      setInvalidSubjects,
-      totalCredits,
-      creditsByLevel,
-    });
-    if (Object.keys(errors).length > 0) {
-      setValidationErrors(errors);
-      window.scrollTo({ top: 0, behavior: "smooth" });
-      if (errors.invalidSubjects)
-        setFormStatus({
-          isSubmitting: false,
-          message: errors.invalidSubjects,
-          isError: true,
-        });
-      else
-        setFormStatus({
-          isSubmitting: false,
-          message: `Пополни ги сите задолжителни полиња`,
-          isError: true,
-        });
-      return;
-    }
-    setValidationErrors({});
-    setFormStatus({
-      isSubmitting: true,
-      message: "",
-      isError: false,
-    });
-
-    const payload = {
-      index,
-      study_track: studyTrack,
-      current_year: year,
-      passed_subjects: getPassedSubjectsByID(passedSubjectsPerSemester),
-      study_effort: studyEffort,
-      tags: domains,
-      technologies: technologies,
-      evaluation: evaluation.map(
-        (ev) => EVALUATIONS_MAP[ev as keyof typeof EVALUATIONS_MAP] ?? ev
-      ),
-      professors: favoriteProfs,
-      passed_subjects_per_semester: mapToID(passedSubjectsPerSemester),
-      has_extracurricular: hasExtracurricular,
-      total_credits: totalCredits.value,
-      level_credits: creditsByLevel.value,
-    };
-    try {
-      // For updating existing form data use PATCH instead of PUT for partial updates
-      const method = formData?.current_year || isSubmitted ? "PATCH" : "POST";
-      const endpoint = "http://localhost:8000/auth/form/";
-      const res = await fetch(endpoint, {
-        method,
-        headers: {
-          "Content-Type": "application/json",
-          Authorization: `Bearer ${accessToken}`,
-        },
-        body: JSON.stringify(payload),
-      });
-
-      if (res.ok) {
-        setFormStatus({
-          isSubmitting: false,
-          message: "Формата е успешно зачувана!",
-          isError: false,
-        });
-        setTimeout(() => {
-          setFormStatus((prev) => ({ ...prev, message: "" }));
-        }, 5000);
-      } else {
-        const errorData = await res.json();
-        throw new Error(errorData.message || "Error submitting form");
-      }
-      setIsSubmitted(true);
-      window.scrollTo({ top: 0, behavior: "smooth" });
-    } catch (error) {
-      console.error("Form submission error:", error);
-
-      setFormStatus({
-        isSubmitting: false,
-        message: `Грешка при зачувување: ${(error as Error).message}`,
-        isError: true,
-      });
-      window.scrollTo({ top: 0, behavior: "smooth" });
-    }
-  };
-
-  const filteredMandatorySubjects = studyTrack
-    ? subjects
-        .filter(
-          (subj) =>
-            subj.subject_info.mandatory_for.includes(studyTrack) &&
-            subj.subject_info.semester <= year * 2
-        )
-        .sort((a, b) => a.subject_info.semester - b.subject_info.semester)
-    : [];
-  const filteredElectiveSubjects = studyTrack
-    ? subjects.filter((subj) =>
-        subj.subject_info.elective_for.includes(studyTrack)
-      )
-    : [];
-
-  const filteredProfessors = distinctSubjectData.professors.filter(
-    (prof) =>
-      professorsSearchTerm == "" ||
-      prof
-        .toLowerCase()
-        .includes(LatinToCyrillic(professorsSearchTerm).toLowerCase())
-  );
-
-  if (isLoading) {
-    return <SkeletonForm />;
-  }
-
-  return (
-    <form onSubmit={handleSubmit} className="space-y-6 max-w-4xl mx-auto">
-      <h2 className="text-2xl font-bold mb-4 text-center">
-        {isSubmitted || formData?.current_year
-          ? "Ажурирај ги податоците"
-          : "Внеси податоци"}
-      </h2>
-      {formStatus.message && (
-        <div
-          className={`px-4 py-3 rounded mb-4 font-bold ${
-            formStatus.isError
-              ? "bg-red-100 border border-red-400 text-red-700"
-              : "bg-green-100 border border-green-400 text-green-700"
-          }`}
-        >
-          {formStatus.message}
-        </div>
-      )}
-      <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
-        <div>
-          <h3 className="text-lg font-medium text-gray-900 mb-2">Индекс</h3>
-          <input
-            type="text"
-            placeholder="Внеси индекс"
-            value={index}
-            onChange={(e) => setIndex(e.target.value)}
-            className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500"
-          />
-          {validationErrors.index && (
-            <p className="mt-1 text-sm text-red-600 font-bold">
-              {validationErrors.index}
-            </p>
-          )}
-        </div>
-
-        <div>
-          <h3 className="text-lg font-medium text-gray-900 mb-2">Смер</h3>
-          <select
-            value={studyTrack}
-            onChange={(e) => {
-              const newTrack = e.target.value as StudyTrack;
-              const filteredPassedSubjectsPerSemester = Object.fromEntries(
-                Object.entries(passedSubjectsPerSemester).map(
-                  ([semester, subjects]) => {
-                    const filteredSubjects = subjects.filter(
-                      (subj) =>
-                        subj.subject_info.mandatory_for.includes(newTrack) ||
-                        subj.subject_info.elective_for.includes(newTrack)
-                    );
-                    return [
-                      semester,
-                      filteredSubjects.length > 0 ? filteredSubjects : [],
-                    ];
-                  }
-                )
-              );
-              setPassedSubjectsPerSemester(filteredPassedSubjectsPerSemester);
-              setStudyTrack(newTrack);
-            }}
-            className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 custom-select"
-          >
-            <option value="">Одбери смер</option>
-            {STUDY_TRACKS.map((track) => (
-              <option key={track} value={track}>
-                {track}
-              </option>
-            ))}
-          </select>
-          {validationErrors.studyTrack && (
-            <p className="mt-1 text-sm text-red-600 font-bold">
-              {validationErrors.studyTrack}
-            </p>
-          )}
-        </div>
-      </div>
-      <div>
-        <h3 className="text-lg font-medium text-gray-900 mb-2 flex items-center gap-2">
-          Година на студии
-          <span
-            className="relative group cursor-pointer"
-            tabIndex={0}
-            aria-label="Објаснување за година на студии"
-          >
-            <svg
-              xmlns="http://www.w3.org/2000/svg"
-              width="18"
-              height="18"
-              fill="currentColor"
-              viewBox="0 0 20 20"
-              className="text-gray-400"
-            >
-              <circle
-                cx="10"
-                cy="10"
-                r="9"
-                stroke="currentColor"
-                strokeWidth="2"
-                fill="none"
-              />
-              <text
-                x="10"
-                y="15"
-                textAnchor="middle"
-                fontSize="13"
-                fill="currentColor"
-              >
-                ?
-              </text>
-            </svg>
-            <span className="absolute left-1/2 -translate-x-1/2 mt-2 w-64 bg-gray-800 text-white text-xs rounded px-3 py-2 opacity-0 group-hover:opacity-100 group-focus:opacity-100 pointer-events-none transition-opacity z-10">
-              Ако моментално е јуни/јули/август/септември, за да добиеш
-              препораки одбери дека си твојата година + 1. Пример ако си 2
-              година и е јуни, одбери дека си 3 година.
-            </span>
-          </span>
-        </h3>
-        <select
-          value={year}
-          onChange={(e) => setYear(Number(e.target.value))}
-          className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 custom-select"
-        >
-          {YEARS.map((y) => (
-            <option key={y} value={y}>
-              {y}. година
-            </option>
-          ))}
-        </select>
-        {validationErrors.year && (
-          <p className="mt-1 text-sm text-red-600 font-bold">
-            {validationErrors.year}
-          </p>
-        )}
-      </div>
-      <SubjectsSelector
-        studyTrack={studyTrack}
-        year={year}
-        filteredMandatorySubjects={filteredMandatorySubjects}
-        filteredElectiveSubjects={filteredElectiveSubjects}
-        toggleSubject={toggleSubject}
-        semesterSearchTerms={semesterSearchTerms}
-        setSemesterSearchTerms={setSemesterSearchTerms}
-        validationErrors={validationErrors}
-        passedSubjectsPerSemester={passedSubjectsPerSemester}
-        invalidSubjects={invalidSubjects}
-      />
-      <div>
-        <label className="flex items-center gap-2 text-lg font-medium text-gray-900 mb-2">
-          <input
-            type="checkbox"
-            checked={hasExtracurricular}
-            onChange={() => setHasExtracurricular(!hasExtracurricular)}
-            className="form-checkbox h-4 w-5 mr-2 accent-green-600"
-          />
-          Имам завршено HPC курсеви, или некои други екстракурикуларни
-          активности кои носат вкупно 6 кредити.
-        </label>
-      </div>
-      <div>
-        <h3 className="text-lg font-medium text-gray-900 mb-2">
-          Вложен труд при учење
-        </h3>
-        <div className="flex flex-wrap gap-3">
-          {STUDY_EFFORT.map((effort) => (
-            <label
-              key={effort}
-              className={`flex items-center px-3 py-2 rounded-md cursor-pointer transition-colors ${
-                studyEffort == effort && "font-bold"
-              }`}
-            >
-              <input
-                type="radio"
-                checked={studyEffort == effort}
-                onChange={() =>
-                  setStudyEffort(studyEffort == effort ? "" : effort)
-                }
-                className="h-4 w-5 mr-2 accent-green-600"
-              />
-              <span>{effort}</span>
-            </label>
-          ))}
-        </div>
-        {validationErrors.studyEffort && (
-          <p className="mt-1 text-sm text-red-600 font-bold">
-            {validationErrors.studyEffort}
-          </p>
-        )}
-      </div>
-      <div>
-        <h3 className="text-lg font-medium text-gray-900 mb-2">
-          Полиња на интерес
-        </h3>
-        <div className="flex flex-wrap gap-2">
-          {["Немам", ...distinctSubjectData.tags].map((item) => {
-            const isSelected =
-              domains.includes(item) ||
-              (item === "Немам" && isNemamSelected["domains"]);
-            const shouldBeDisabled =
-              isNemamSelected["domains"] && item !== "Немам";
-            return (
-              <FieldButton
-                key={item}
-                keyProp={item}
-                state={domains}
-                stateSetter={setDomains}
-                field="domains"
-                isSelected={isSelected}
-                isDisabled={shouldBeDisabled}
-                setIsNemamSelected={setIsNemamSelected}
-              />
-            );
-          })}
-        </div>
-        {validationErrors.domains && (
-          <p className="mt-1 text-sm text-red-600 font-bold">
-            {validationErrors.domains}
-          </p>
-        )}
-      </div>
-      <div>
-        <h3 className="text-lg font-medium text-gray-900 mb-2">
-          Преферирани технологии
-        </h3>
-        <div className="flex flex-wrap gap-2">
-          {["Немам", ...distinctSubjectData.technologies].map((item) => {
-            const isSelected =
-              technologies.includes(item) ||
-              (item === "Немам" && isNemamSelected["tech"]);
-            const shouldBeDisabled =
-              isNemamSelected["tech"] && item !== "Немам";
-            return (
-              <FieldButton
-                key={item}
-                keyProp={item}
-                state={technologies}
-                stateSetter={setTechnologies}
-                field="tech"
-                isSelected={isSelected}
-                isDisabled={shouldBeDisabled}
-                setIsNemamSelected={setIsNemamSelected}
-              />
-            );
-          })}
-        </div>
-        {validationErrors.technologies && (
-          <p className="mt-1 text-sm text-red-600 font-bold">
-            {validationErrors.technologies}
-          </p>
-        )}
-      </div>
-      <div>
-        <h3 className="text-lg font-medium text-gray-900 mb-2">
-          Преферирани начин на оценување
-        </h3>
-        <div className="flex flex-wrap gap-2">
-          {["Немам", ...EVALUATIONS].map((item) => {
-            const isSelected =
-              evaluation.includes(item) ||
-              (item === "Немам" && isNemamSelected["eval"]);
-            const shouldBeDisabled =
-              isNemamSelected["eval"] && item !== "Немам";
-            return (
-              <FieldButton
-                key={item}
-                keyProp={item}
-                state={evaluation}
-                stateSetter={setEvaluation}
-                field="eval"
-                isSelected={isSelected}
-                isDisabled={shouldBeDisabled}
-                setIsNemamSelected={setIsNemamSelected}
-              />
-            );
-          })}
-        </div>
-        {validationErrors.evaluation && (
-          <p className="mt-1 text-sm text-red-600 font-bold">
-            {validationErrors.evaluation}
-          </p>
-        )}
-      </div>
-      <div>
-        <div className="flex items-center mb-2 gap-7">
-          <h3 className="text-lg font-medium text-gray-900 mb-2">
-            Омилени професори
-          </h3>
-          {
-            <input
-              onChange={(e) => setProfessorSearchTerm(e.target.value)}
-              value={professorsSearchTerm}
-              disabled={isNemamSelected["prof"]}
-              type="text"
-              className="w-60 px-3 py-2.5 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 text-gray-900 text-sm"
-              placeholder="Пребарај професор"
-            />
-          }
-        </div>
-        <div className="flex flex-wrap gap-2">
-          {["Немам", ...filteredProfessors]
-            .slice(0, showProfessors ? undefined : 10)
-            .map((item) => {
-              // hides "Nemam" when searching
-              if (item == "Немам" && professorsSearchTerm !== "") return;
-              const isSelected =
-                favoriteProfs.includes(item) ||
-                (item === "Немам" && isNemamSelected["prof"]);
-              const shouldBeDisabled =
-                isNemamSelected["prof"] && item !== "Немам";
-              return (
-                <FieldButton
-                  key={item}
-                  keyProp={item}
-                  state={favoriteProfs}
-                  stateSetter={setFavoriteProfs}
-                  field="prof"
-                  isSelected={isSelected}
-                  isDisabled={shouldBeDisabled}
-                  setIsNemamSelected={setIsNemamSelected}
-                />
-              );
-            })}
-          {filteredProfessors.length == 0 && (
-            <p className="text-gray-500 italic">Нема таков професор</p>
-          )}
-          {filteredProfessors.length > 10 && (
-            <button
-              type="button"
-              onClick={() => setShowProfessors(!showProfessors)}
-              className="px-3 py-2 rounded-md transition-colors duration-200 bg-blue text-blue-500"
-            >
-              {showProfessors ? "Прикажи помалку" : "Прикажи повеќе"}
-            </button>
-          )}
-        </div>
-      </div>
-      <div className="pt-4">
-        <button
-          type="submit"
-          disabled={formStatus.isSubmitting}
-          className={`w-full md:w-auto px-6 py-3 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-md shadow focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-colors ${
-            formStatus.isSubmitting ? "opacity-70 cursor-not-allowed" : ""
-          }`}
-        >
-          {formStatus.isSubmitting
-            ? "Се зачувува..."
-            : formData?.current_year
-            ? "Ажурирај"
-            : "Зачувај"}
-        </button>
-      </div>
-    </form>
-  );
+	const { accessToken } = useAuth();
+	const [isSubmitted, setIsSubmitted] = useState(false);
+	const [validationErrors, setValidationErrors] = useState<{
+		[key: string]: string;
+	}>({});
+	const [index, setIndex] = useState(formData?.index || "");
+	const [studyTrack, setStudyTrack] = useState<StudyTrack | "">(
+		(formData?.study_track as StudyTrack) || ""
+	);
+	const [year, setYear] = useState(formData?.current_year || 1);
+	const [passedSubjectsPerSemester, setPassedSubjectsPerSemester] = useState<
+		Record<number, Subject[]>
+	>(
+		formData?.passed_subjects_per_semester ??
+			Object.fromEntries(Array.from({ length: 8 }, (_, i) => [[i + 1], []]))
+	);
+	const [studyEffort, setStudyEffort] = useState(formData?.study_effort || "");
+	const [domains, setDomains] = useState<string[]>(formData?.tags || []);
+	const [semesterSearchTerms, setSemesterSearchTerms] = useState<
+		Record<number, string>
+	>({});
+	const [professorsSearchTerm, setProfessorSearchTerm] = useState("");
+	const [technologies, setTechnologies] = useState<string[]>(
+		formData?.technologies || []
+	);
+	const [evaluation, setEvaluation] = useState(formData?.evaluation || []);
+	const [favoriteProfs, setFavoriteProfs] = useState<string[]>(
+		formData?.professors || []
+	);
+	const [isNemamSelected, setIsNemamSelected] = useState({
+		domains: false,
+		tech: false,
+		eval: false,
+		prof: false,
+	});
+	const [formStatus, setFormStatus] = useState<{
+		isSubmitting: boolean;
+		message: string;
+		isError: boolean;
+	}>({
+		isSubmitting: false,
+		message: "",
+		isError: false,
+	});
+	const [showProfessors, setShowProfessors] = useState(false);
+	const [subjects, setSubjects] = useState<Subject[]>([]);
+	const [distinctSubjectData, setDistinctSubjectData] =
+		useState<DistinctSubjectData>({
+			tags: [],
+			professors: [],
+			technologies: [],
+		});
+	const [hasExtracurricular, setHasExtracurricular] = useState(false);
+	const [invalidSubjects, setInvalidSubjects] = useState<Subject[]>([]);
+
+	// Update form when formData changes (e.g., after fetching user data)
+	useEffect(() => {
+		if (formData) {
+			setIndex(formData.index || "");
+			setStudyTrack((formData.study_track as StudyTrack) || "");
+			setYear(formData.current_year || 1);
+			setStudyEffort(formData.study_effort || "");
+
+			const domains_ = (formData.tags || []).includes("None")
+				? []
+				: formData.tags || [];
+			setDomains(domains_);
+
+			const technologies_ = (formData.technologies || []).includes("None")
+				? []
+				: formData.technologies || [];
+			setTechnologies(technologies_);
+
+			const eval_ = (formData.evaluation || []).map(
+				(val: string) =>
+					Object.keys(EVALUATIONS_MAP).find(
+						(key) =>
+							EVALUATIONS_MAP[key as keyof typeof EVALUATIONS_MAP] === val
+					) || val
+			);
+			setEvaluation(
+				eval_.includes("Немам") || eval_.includes("None") ? [] : eval_
+			);
+
+			const favoriteProfs_ = (formData.professors || []).includes("None")
+				? []
+				: formData.professors || [];
+			setFavoriteProfs(favoriteProfs_);
+
+			setPassedSubjectsPerSemester(formData.passed_subjects_per_semester || []);
+		}
+	}, [formData]);
+
+	useEffect(() => {
+		const fetchSubjects = async () => {
+			try {
+				const resSubjects = await fetch("http://localhost:8000/subjects");
+				if (resSubjects.ok) {
+					const subJson: Subject[] = await resSubjects.json();
+					setSubjects(subJson || []);
+					const allProfessors: string[] = subJson
+						.flatMap((subject: Subject) => subject.subject_info.professors)
+						.filter((p): p is string => typeof p === "string");
+					const uniqueProfessors = Array.from(new Set(allProfessors));
+					const allProfessors_ = uniqueProfessors
+						.filter((prof) => prof.trim().toLowerCase() !== "сите професори")
+						.sort((a, b) => a.localeCompare(b));
+					setDistinctSubjectData(() => ({
+						tags: Array.from(
+							new Set(subJson.flatMap((subject) => subject.subject_info.tags))
+						).sort((a, b) => a.localeCompare(b)),
+						technologies: Array.from(
+							new Set(
+								subJson
+									.flatMap((subject) => subject.subject_info.technologies)
+									.filter((tech) => tech != "any" && tech != "")
+							)
+						).sort((a, b) => a.localeCompare(b)),
+						professors: allProfessors_,
+					}));
+				}
+			} catch (error) {
+				console.error("Error fetching subjects:", error);
+			}
+		};
+
+		fetchSubjects();
+	}, []);
+
+	const toggleSubject = (subject: Subject, semester: number) => {
+		const exists = (passedSubjectsPerSemester[semester] || []).some(
+			(s) => s.id === subject.id
+		);
+		if (exists) {
+			setPassedSubjectsPerSemester({
+				...passedSubjectsPerSemester,
+				[semester]: passedSubjectsPerSemester[semester].filter(
+					(s) => s.id != subject.id
+				),
+			});
+		} else {
+			setPassedSubjectsPerSemester({
+				...passedSubjectsPerSemester,
+				[semester]: [...(passedSubjectsPerSemester[semester] || []), subject],
+			});
+		}
+	};
+
+	const handleSubmit = async (e: React.FormEvent) => {
+		e.preventDefault();
+		const totalCredits = { value: -1 };
+		const creditsByLevel = { value: [0, 0, 0] };
+		const errors = validateForm({
+			index,
+			studyTrack,
+			year,
+			studyEffort,
+			passedSubjectsPerSemester,
+			hasExtracurricular,
+			setInvalidSubjects,
+			totalCredits,
+			creditsByLevel,
+		});
+		if (Object.keys(errors).length > 0) {
+			setValidationErrors(errors);
+			window.scrollTo({ top: 0, behavior: "smooth" });
+			if (errors.invalidSubjects)
+				setFormStatus({
+					isSubmitting: false,
+					message: errors.invalidSubjects,
+					isError: true,
+				});
+			else
+				setFormStatus({
+					isSubmitting: false,
+					message: `Пополни ги сите задолжителни полиња`,
+					isError: true,
+				});
+			return;
+		}
+		setValidationErrors({});
+		setFormStatus({
+			isSubmitting: true,
+			message: "",
+			isError: false,
+		});
+
+		const payload = {
+			index,
+			study_track: studyTrack,
+			current_year: year,
+			passed_subjects: getPassedSubjectsByID(passedSubjectsPerSemester),
+			study_effort: studyEffort,
+			tags: domains,
+			technologies: technologies,
+			evaluation: evaluation.map(
+				(ev) => EVALUATIONS_MAP[ev as keyof typeof EVALUATIONS_MAP] ?? ev
+			),
+			professors: favoriteProfs,
+			passed_subjects_per_semester: mapToID(passedSubjectsPerSemester),
+			has_extracurricular: hasExtracurricular,
+			total_credits: totalCredits.value,
+			level_credits: creditsByLevel.value,
+		};
+		try {
+			// For updating existing form data use PATCH instead of PUT for partial updates
+			const method = formData?.current_year || isSubmitted ? "PATCH" : "POST";
+			const endpoint = "http://localhost:8000/auth/form/";
+			const res = await fetch(endpoint, {
+				method,
+				headers: {
+					"Content-Type": "application/json",
+					Authorization: `Bearer ${accessToken}`,
+				},
+				body: JSON.stringify(payload),
+			});
+
+			if (res.ok) {
+				setFormStatus({
+					isSubmitting: false,
+					message: "Формата е успешно зачувана!",
+					isError: false,
+				});
+				setTimeout(() => {
+					setFormStatus((prev) => ({ ...prev, message: "" }));
+				}, 5000);
+			} else {
+				const errorData = await res.json();
+				throw new Error(errorData.message || "Error submitting form");
+			}
+			setIsSubmitted(true);
+			window.scrollTo({ top: 0, behavior: "smooth" });
+		} catch (error) {
+			console.error("Form submission error:", error);
+
+			setFormStatus({
+				isSubmitting: false,
+				message: `Грешка при зачувување: ${(error as Error).message}`,
+				isError: true,
+			});
+			window.scrollTo({ top: 0, behavior: "smooth" });
+		}
+	};
+
+	const filteredMandatorySubjects = studyTrack
+		? subjects
+				.filter(
+					(subj) =>
+						subj.subject_info.mandatory_for.includes(studyTrack) &&
+						subj.subject_info.semester <= year * 2
+				)
+				.sort((a, b) => a.subject_info.semester - b.subject_info.semester)
+		: [];
+	const filteredElectiveSubjects = studyTrack
+		? subjects.filter((subj) =>
+				subj.subject_info.elective_for.includes(studyTrack)
+		  )
+		: [];
+
+	const filteredProfessors = distinctSubjectData.professors.filter(
+		(prof) =>
+			professorsSearchTerm == "" ||
+			prof
+				.toLowerCase()
+				.includes(LatinToCyrillic(professorsSearchTerm).toLowerCase())
+	);
+
+	if (isLoading) {
+		return <SkeletonForm />;
+	}
+
+	return (
+		<form onSubmit={handleSubmit} className="space-y-6 max-w-4xl mx-auto">
+			<h2 className="text-2xl font-bold mb-4 text-center">
+				{isSubmitted || formData?.current_year
+					? "Ажурирај ги податоците"
+					: "Внеси податоци"}
+			</h2>
+			{formStatus.message && (
+				<div
+					className={`px-4 py-3 rounded mb-4 font-bold ${
+						formStatus.isError
+							? "bg-red-100 border border-red-400 text-red-700"
+							: "bg-green-100 border border-green-400 text-green-700"
+					}`}
+				>
+					{formStatus.message}
+				</div>
+			)}
+			<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
+				<div>
+					<h3 className="text-lg font-medium text-gray-900 mb-2">Индекс</h3>
+					<input
+						type="text"
+						placeholder="Внеси индекс"
+						value={index}
+						onChange={(e) => setIndex(e.target.value)}
+						className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500"
+					/>
+					{validationErrors.index && (
+						<p className="mt-1 text-sm text-red-600 font-bold">
+							{validationErrors.index}
+						</p>
+					)}
+				</div>
+
+				<div>
+					<h3 className="text-lg font-medium text-gray-900 mb-2">Смер</h3>
+					<select
+						value={studyTrack}
+						onChange={(e) => {
+							const newTrack = e.target.value as StudyTrack;
+							const filteredPassedSubjectsPerSemester = Object.fromEntries(
+								Object.entries(passedSubjectsPerSemester).map(
+									([semester, subjects]) => {
+										const filteredSubjects = subjects.filter(
+											(subj) =>
+												subj.subject_info.mandatory_for.includes(newTrack) ||
+												subj.subject_info.elective_for.includes(newTrack)
+										);
+										return [
+											semester,
+											filteredSubjects.length > 0 ? filteredSubjects : [],
+										];
+									}
+								)
+							);
+							setPassedSubjectsPerSemester(filteredPassedSubjectsPerSemester);
+							setStudyTrack(newTrack);
+						}}
+						className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 custom-select"
+					>
+						<option value="">Избери смер</option>
+						{STUDY_TRACKS.map((track) => (
+							<option key={track} value={track}>
+								{track}
+							</option>
+						))}
+					</select>
+					{validationErrors.studyTrack && (
+						<p className="mt-1 text-sm text-red-600 font-bold">
+							{validationErrors.studyTrack}
+						</p>
+					)}
+				</div>
+			</div>
+			<div>
+				<h3 className="text-lg font-medium text-gray-900 mb-2 flex items-center gap-2">
+					Година на студии
+					<span
+						className="relative group cursor-pointer"
+						tabIndex={0}
+						aria-label="Објаснување за година на студии"
+					>
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							width="18"
+							height="18"
+							fill="currentColor"
+							viewBox="0 0 20 20"
+							className="text-gray-400"
+						>
+							<circle
+								cx="10"
+								cy="10"
+								r="9"
+								stroke="currentColor"
+								strokeWidth="2"
+								fill="none"
+							/>
+							<text
+								x="10"
+								y="15"
+								textAnchor="middle"
+								fontSize="13"
+								fill="currentColor"
+							>
+								?
+							</text>
+						</svg>
+						<span className="absolute left-1/2 -translate-x-1/2 mt-2 w-64 bg-gray-800 text-white text-xs rounded px-3 py-2 opacity-0 group-hover:opacity-100 group-focus:opacity-100 pointer-events-none transition-opacity z-10">
+							Ако моментално е јуни/јули/август/септември, за да добиеш
+							соодветни препораки избери дека си твојата година + 1. Пример ако
+							си 2 година и е јуни, избери дека си 3 година.
+						</span>
+					</span>
+				</h3>
+				<select
+					value={year}
+					onChange={(e) => setYear(Number(e.target.value))}
+					className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 custom-select"
+				>
+					{YEARS.map((y) => (
+						<option key={y} value={y}>
+							{y}. година
+						</option>
+					))}
+				</select>
+				{validationErrors.year && (
+					<p className="mt-1 text-sm text-red-600 font-bold">
+						{validationErrors.year}
+					</p>
+				)}
+			</div>
+			<SubjectsSelector
+				studyTrack={studyTrack}
+				year={year}
+				filteredMandatorySubjects={filteredMandatorySubjects}
+				filteredElectiveSubjects={filteredElectiveSubjects}
+				toggleSubject={toggleSubject}
+				semesterSearchTerms={semesterSearchTerms}
+				setSemesterSearchTerms={setSemesterSearchTerms}
+				validationErrors={validationErrors}
+				passedSubjectsPerSemester={passedSubjectsPerSemester}
+				invalidSubjects={invalidSubjects}
+			/>
+			<div>
+				<label className="flex items-center gap-2 text-lg font-medium text-gray-900 mb-2">
+					<input
+						type="checkbox"
+						checked={hasExtracurricular}
+						onChange={() => setHasExtracurricular(!hasExtracurricular)}
+						className="form-checkbox h-4 w-5 mr-2 accent-green-600"
+					/>
+					Имам завршено HPC курсеви, или некои други екстракурикуларни
+					активности кои носат вкупно 6 кредити.
+				</label>
+			</div>
+			<div>
+				<h3 className="text-lg font-medium text-gray-900 mb-2">
+					Вложен труд при учење
+				</h3>
+				<div className="flex flex-wrap gap-3">
+					{STUDY_EFFORT.map((effort) => (
+						<label
+							key={effort}
+							className={`flex items-center px-3 py-2 rounded-md cursor-pointer transition-colors ${
+								studyEffort == effort && "font-bold"
+							}`}
+						>
+							<input
+								type="radio"
+								checked={studyEffort == effort}
+								onChange={() =>
+									setStudyEffort(studyEffort == effort ? "" : effort)
+								}
+								className="h-4 w-5 mr-2 accent-green-600"
+							/>
+							<span>{effort}</span>
+						</label>
+					))}
+				</div>
+				{validationErrors.studyEffort && (
+					<p className="mt-1 text-sm text-red-600 font-bold">
+						{validationErrors.studyEffort}
+					</p>
+				)}
+			</div>
+			<div>
+				<h3 className="text-lg font-medium text-gray-900 mb-2">
+					Полиња на интерес
+				</h3>
+				<div className="flex flex-wrap gap-2">
+					{["Немам", ...distinctSubjectData.tags].map((item) => {
+						const isSelected =
+							domains.includes(item) ||
+							(item === "Немам" && isNemamSelected["domains"]);
+						const shouldBeDisabled =
+							isNemamSelected["domains"] && item !== "Немам";
+						return (
+							<FieldButton
+								key={item}
+								keyProp={item}
+								state={domains}
+								stateSetter={setDomains}
+								field="domains"
+								isSelected={isSelected}
+								isDisabled={shouldBeDisabled}
+								setIsNemamSelected={setIsNemamSelected}
+							/>
+						);
+					})}
+				</div>
+				{validationErrors.domains && (
+					<p className="mt-1 text-sm text-red-600 font-bold">
+						{validationErrors.domains}
+					</p>
+				)}
+			</div>
+			<div>
+				<h3 className="text-lg font-medium text-gray-900 mb-2">
+					Преферирани технологии
+				</h3>
+				<div className="flex flex-wrap gap-2">
+					{["Немам", ...distinctSubjectData.technologies].map((item) => {
+						const isSelected =
+							technologies.includes(item) ||
+							(item === "Немам" && isNemamSelected["tech"]);
+						const shouldBeDisabled =
+							isNemamSelected["tech"] && item !== "Немам";
+						return (
+							<FieldButton
+								key={item}
+								keyProp={item}
+								state={technologies}
+								stateSetter={setTechnologies}
+								field="tech"
+								isSelected={isSelected}
+								isDisabled={shouldBeDisabled}
+								setIsNemamSelected={setIsNemamSelected}
+							/>
+						);
+					})}
+				</div>
+				{validationErrors.technologies && (
+					<p className="mt-1 text-sm text-red-600 font-bold">
+						{validationErrors.technologies}
+					</p>
+				)}
+			</div>
+			<div>
+				<h3 className="text-lg font-medium text-gray-900 mb-2">
+					Преферирани начин на оценување
+				</h3>
+				<div className="flex flex-wrap gap-2">
+					{["Немам", ...EVALUATIONS].map((item) => {
+						const isSelected =
+							evaluation.includes(item) ||
+							(item === "Немам" && isNemamSelected["eval"]);
+						const shouldBeDisabled =
+							isNemamSelected["eval"] && item !== "Немам";
+						return (
+							<FieldButton
+								key={item}
+								keyProp={item}
+								state={evaluation}
+								stateSetter={setEvaluation}
+								field="eval"
+								isSelected={isSelected}
+								isDisabled={shouldBeDisabled}
+								setIsNemamSelected={setIsNemamSelected}
+							/>
+						);
+					})}
+				</div>
+				{validationErrors.evaluation && (
+					<p className="mt-1 text-sm text-red-600 font-bold">
+						{validationErrors.evaluation}
+					</p>
+				)}
+			</div>
+			<div>
+				<div className="flex items-center mb-2 gap-7">
+					<h3 className="text-lg font-medium text-gray-900 mb-2">
+						Омилени професори
+					</h3>
+					{
+						<input
+							onChange={(e) => setProfessorSearchTerm(e.target.value)}
+							value={professorsSearchTerm}
+							disabled={isNemamSelected["prof"]}
+							type="text"
+							className="w-60 px-3 py-2.5 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 text-gray-900 text-sm"
+							placeholder="Пребарај професор"
+						/>
+					}
+				</div>
+				<div className="flex flex-wrap gap-2">
+					{["Немам", ...filteredProfessors]
+						.slice(0, showProfessors ? undefined : 10)
+						.map((item) => {
+							// hides "Nemam" when searching
+							if (item == "Немам" && professorsSearchTerm !== "") return;
+							const isSelected =
+								favoriteProfs.includes(item) ||
+								(item === "Немам" && isNemamSelected["prof"]);
+							const shouldBeDisabled =
+								isNemamSelected["prof"] && item !== "Немам";
+							return (
+								<FieldButton
+									key={item}
+									keyProp={item}
+									state={favoriteProfs}
+									stateSetter={setFavoriteProfs}
+									field="prof"
+									isSelected={isSelected}
+									isDisabled={shouldBeDisabled}
+									setIsNemamSelected={setIsNemamSelected}
+								/>
+							);
+						})}
+					{filteredProfessors.length == 0 && (
+						<p className="text-gray-500 italic">Нема таков професор</p>
+					)}
+					{filteredProfessors.length > 10 && (
+						<button
+							type="button"
+							onClick={() => setShowProfessors(!showProfessors)}
+							className="px-3 py-2 rounded-md transition-colors duration-200 bg-blue text-blue-500"
+						>
+							{showProfessors ? "Прикажи помалку" : "Прикажи повеќе"}
+						</button>
+					)}
+				</div>
+			</div>
+			<div className="pt-4">
+				<button
+					type="submit"
+					disabled={formStatus.isSubmitting}
+					className={`w-full md:w-auto px-6 py-3 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-md shadow focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-colors ${
+						formStatus.isSubmitting ? "opacity-70 cursor-not-allowed" : ""
+					}`}
+				>
+					{formStatus.isSubmitting
+						? "Се зачувува..."
+						: formData?.current_year
+						? "Ажурирај"
+						: "Зачувај"}
+				</button>
+			</div>
+		</form>
+	);
 };
 
Index: frontend/src/components/StudentForm/SubjectsSelector.tsx
===================================================================
--- frontend/src/components/StudentForm/SubjectsSelector.tsx	(revision 4f59a58017fe45923d55e066e2dd9f821de74277)
+++ frontend/src/components/StudentForm/SubjectsSelector.tsx	(revision 30a7df0656c54cce36be6925e7ce15d9b4cf84e6)
@@ -286,5 +286,5 @@
 			) : (
 				<p className="text-gray-500 italic">
-					Одбери смер и година за да се прикажат предметите.
+					Избери смер и година за да се прикажат предметите.
 				</p>
 			)}
Index: frontend/src/components/StudentForm/utils.ts
===================================================================
--- frontend/src/components/StudentForm/utils.ts	(revision 4f59a58017fe45923d55e066e2dd9f821de74277)
+++ frontend/src/components/StudentForm/utils.ts	(revision 30a7df0656c54cce36be6925e7ce15d9b4cf84e6)
@@ -89,11 +89,11 @@
 		errors.index = "Индексот треба да има точно 6 цифри.";
 	}
-	if (!studyTrack) errors.studyTrack = "Одбери насока.";
-	if (!year) errors.year = "Одбери година.";
-	if (!studyEffort) errors.studyEffort = "Одбери пожелен вложен труд.";
+	if (!studyTrack) errors.studyTrack = "Избери насока.";
+	if (!year) errors.year = "Избери година.";
+	if (!studyEffort) errors.studyEffort = "Избери пожелен вложен труд.";
 	// passedSubjectsPerSemester is a map, not an array, that's why index 1 is needed, not 0
 	if (passedSubjectsPerSemester[1].length === 0)
 		errors.passedSubjectsPerSemester =
-			"Одбери барем еден предмет од прв семестар.";
+			"Избери барем еден предмет од прв семестар.";
 
 	const passedSubjects = getPassedSubjects(passedSubjectsPerSemester);
Index: frontend/src/pages/Home.tsx
===================================================================
--- frontend/src/pages/Home.tsx	(revision 4f59a58017fe45923d55e066e2dd9f821de74277)
+++ frontend/src/pages/Home.tsx	(revision 30a7df0656c54cce36be6925e7ce15d9b4cf84e6)
@@ -1,9 +1,135 @@
-const Home = () => {
-  return (
-    <div className="flex justify-center items-center h-[80vh] text-lg text-center font-bold">
-      <p> Избравте ли изборен? </p>
-    </div>
-  );
-};
+import { ArrowRight, BookOpen, Lightbulb, Users } from "lucide-react";
+import { Link } from "react-router-dom";
+import { useAuth } from "../hooks/useAuth";
 
-export default Home;
+export default function Homepage() {
+	const { isAuthenticated } = useAuth();
+	return (
+		<div className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100">
+			{/* Main Content */}
+			<main className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-16">
+				{/* Hero Section */}
+				<div className="text-center mb-16">
+					<h2 className="text-4xl font-bold text-gray-900 mb-4">
+						Најди го изборниот предмет за тебе
+					</h2>
+					<p className="text-xl text-gray-600 max-w-2xl mx-auto">
+						ИзбериИзборен е веб апликација која помага на студентите на ФИНКИ да
+						се запознаат со изборните предмети кои ги нуди факултетот, и да им
+						помогне да го изберат најдобриот.
+					</p>
+				</div>
+
+				<section className="bg-white rounded-2xl p-8 shadow-sm mb-8">
+					<div className="flex items-start space-x-4">
+						<div className="flex-shrink-0">
+							<div className="w-12 h-12 bg-red-100 rounded-xl flex items-center justify-center">
+								<Users className="h-6 w-6 text-red-600" />
+							</div>
+						</div>
+						<div>
+							<h3 className="text-xl font-semibold text-gray-900 mb-3">
+								Зошто ИзбериИзборен?
+							</h3>
+							<p className="text-gray-600 leading-relaxed">
+								Студентите на ФИНКИ се соочуваат со огромен избор при
+								селекцијата на изборни предмети. Со многу достапни опции,
+								ограничени описи на предметите и минимален увид во тоа што
+								всушност се изучува, донесувањето информирана одлука е речиси
+								невозможно. Многу студенти избираат на случаен избор или врз
+								основа на нецелосни информации, што често доведува до
+								разочарување и избирање нешто несоодветно за нив. Ова е
+								проблемот којшто ние го решаваме.
+							</p>
+						</div>
+					</div>
+				</section>
+
+				<section className="bg-white rounded-2xl p-8 shadow-sm mb-8">
+					<div className="flex items-start space-x-4">
+						<div className="flex-shrink-0">
+							<div className="w-12 h-12 bg-green-100 rounded-xl flex items-center justify-center">
+								<Lightbulb className="h-6 w-6 text-green-600" />
+							</div>
+						</div>
+						<div className="flex-1">
+							<h3 className="text-xl font-semibold text-gray-900 mb-3">
+								Како работи нашиот алгоритам?
+							</h3>
+							<p className="text-gray-600 leading-relaxed mb-4">
+								Нашиот систем ги анализира вашите положени предмети, интереси и
+								преференци, и ги споредува со деталните информации за сите
+								достапни предмети што може да ги запишете. Секој релевантен
+								фактор добива соодветна тежина при анализата. На крај, системот
+								ги прикажува шесте најсоодветни предмети, подредени според
+								нивната усогласеност со вашите параметри — почнувајќи од
+								најпрепорачаниот.
+							</p>
+
+							{isAuthenticated ? (
+								<Link to="/recommendations">
+									<button className="inline-flex items-center space-x-2 px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-900 transition-colors font-medium">
+										Види препораки
+										<ArrowRight className="h-4 w-4" />
+									</button>
+								</Link>
+							) : (
+								<div className="bg-gray-50 rounded-lg p-4">
+									<p className="text-gray-600 font-medium">
+										<Link
+											to="/login"
+											className="text-blue-600 hover:underline font-semibold"
+										>
+											Најавете се
+										</Link>{" "}
+										за да добиете персонализирани препораки и да го најдете
+										најсоодветниот предмет за вас.
+									</p>
+								</div>
+							)}
+						</div>
+					</div>
+				</section>
+
+				<section className="bg-white rounded-2xl p-8 shadow-sm">
+					<div className="flex items-start space-x-4">
+						<div className="flex-shrink-0">
+							<div className="w-12 h-12 bg-blue-100 rounded-xl flex items-center justify-center">
+								<BookOpen className="h-6 w-6 text-blue-600" />
+							</div>
+						</div>
+						<div className="flex-1">
+							<h3 className="text-xl font-semibold text-gray-900 mb-3">
+								База на сите предмети на ФИНКИ
+							</h3>
+							<p className="text-gray-600 leading-relaxed mb-4">
+								Прелистајте ги сите предмети што факултетот моментално ги нуди.
+								За секој предмет нудиме информации како што се начинот на
+								полагање, изучуваните технологии, професорите и асистентите,
+								предусловите и слично. Достапни се опции за пребарување и
+								филтрирање за полесна и поефикасна навигација низ базата.
+							</p>
+
+							<button className="inline-flex items-center space-x-2 px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-900 transition-colors font-medium">
+								<span>Види предмети</span>
+								<ArrowRight className="h-4 w-4" />
+							</button>
+						</div>
+					</div>
+				</section>
+			</main>
+
+			{/* Footer
+			<footer className="bg-white border-t border-gray-200 mt-16">
+				<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
+					<div className="text-center text-gray-600">
+						<p>
+							&copy; 2025 IzberiIzboren. Made for FINKI students, by FINKI
+							students.
+						</p>
+					</div>
+				</div>
+			</footer> */}
+		</div>
+	);
+}
Index: frontend/src/pages/Recommendations.tsx
===================================================================
--- frontend/src/pages/Recommendations.tsx	(revision 4f59a58017fe45923d55e066e2dd9f821de74277)
+++ frontend/src/pages/Recommendations.tsx	(revision 30a7df0656c54cce36be6925e7ce15d9b4cf84e6)
@@ -1,266 +1,267 @@
-import { useState, useEffect, useMemo } from "react";
+import { useEffect, useMemo, useState } from "react";
 import { useNavigate } from "react-router-dom";
-import { Subject } from "../components/types";
 import SubjectModal from "../components/SubjectCatalog/SubjectModal";
 import { getSubjectPrerequisites } from "../components/SubjectCatalog/utils";
+import { Subject } from "../components/types";
 import useAxiosAuth from "../hooks/useAxiosAuth";
 
 const Recommendations = () => {
-  const axiosAuth = useAxiosAuth();
-  const navigate = useNavigate();
-  const [subjectData, setSubjectData] = useState<Subject[]>([]);
-  const [recommendations, setRecommendations] = useState<Subject[]>([]);
-  const [season_, setSeason] = useState<"winter" | "summer" | "all">("all");
-  const [isLoading, setIsLoading] = useState(false);
-  const [showModal, setShowModal] = useState(false);
-
-  const mapToSeasonInt = (season: "winter" | "summer" | "all") => {
-    if (season == "summer") return 0;
-    if (season == "winter") return 1;
-    return 2;
-  };
-
-  const fetchRecommendations = async () => {
-    setIsLoading(true);
-    try {
-      const season = mapToSeasonInt(season_);
-      const response = await axiosAuth.get("/suggestion", {
-        params: { season },
-      });
-      setRecommendations(response.data.data);
-    } catch (error) {
-      console.error("Error fetching recommendations:", error);
-    } finally {
-      setIsLoading(false);
-    }
-  };
-
-  // need to fetch subject data so that we can compare the subject IDs (prerequisites store IDs, but we need names)
-  //  in the modals for the recommendations
-  useEffect(() => {
-    const fetchData = async () => {
-      const response = await axiosAuth.get("/subjects");
-      setSubjectData(response.data);
-    };
-    fetchData();
-  }, [axiosAuth]);
-
-  const subjectIdToNameMap = useMemo(() => {
-    const map = new Map<number, string>();
-    subjectData.forEach((subject) => {
-      map.set(subject.id, subject.name);
-    });
-    return map;
-  }, [subjectData]);
-
-  const cycleSeason = () => {
-    if (season_ === "all") setSeason("winter");
-    else if (season_ === "winter") setSeason("summer");
-    else setSeason("all");
-  };
-
-  const openSubjectView = (subject: Subject) => {
-    navigate(`/subjects/${subject.id}`, {
-      state: { from: "/recommendations" },
-    });
-  };
-
-  const [selectedSubject, setSelectedSubject] = useState<Subject | null>(null);
-
-  const openSubjectDetails = (subject: Subject) => {
-    setSelectedSubject(subject);
-    setShowModal(true);
-  };
-
-  const closeModal = () => {
-    setSelectedSubject(null);
-    setShowModal(false);
-  };
-
-  const getSeasonText = () => {
-    switch (season_) {
-      case "winter":
-        return "Зимски";
-      case "summer":
-        return "Летен";
-      case "all":
-        return "Двата";
-    }
-  };
-
-  return (
-    <div className="flex h-screen bg-gray-50">
-      <div className="w-1/3 bg-white shadow-lg p-8 flex flex-col justify-center items-center space-y-8">
-        <div className="text-center">
-          <h1 className="text-4xl font-bold text-gray-800 mb-2">Препораки</h1>
-          <p className="text-gray-600 text-lg">
-            Предметите што ќе ги добиете од алгоритамот се базирани на она што
-            сте го пополниле во формата.
-            <br />
-            Тие се подредени според тоа колку вашите интереси се совпаѓаат со
-            она што го нудат предметите.
-          </p>
-        </div>
-
-        <div className="bg-blue-50 border border-blue-200 rounded-lg p-6 text-center hover:bg-blue-100 transition-colors duration-200">
-          <p className="text-gray-700 mb-3">Избран семестар: </p>
-          <p className="text-2xl font-semibold text-gray-800">
-            {getSeasonText()}
-          </p>
-        </div>
-
-        <button
-          onClick={cycleSeason}
-          className="bg-blue-500 hover:bg-blue-600 text-white px-8 py-4 rounded-lg text-lg font-medium hover:scale-105 transition-all duration-200 shadow-md hover:shadow-lg"
-        >
-          Промени семестар
-        </button>
-
-        <button
-          onClick={fetchRecommendations}
-          disabled={isLoading}
-          className={`${
-            isLoading
-              ? "bg-gray-400 cursor-not-allowed"
-              : "bg-green-500 hover:bg-green-600 hover:scale-105 shadow-md hover:shadow-lg"
-          } text-white px-8 py-4 rounded-lg text-xl font-bold transition-all duration-200 flex items-center space-x-2`}
-        >
-          {isLoading ? (
-            <>
-              <div className="animate-spin rounded-full h-5 w-5 border-b-2 border-white"></div>
-              <span>Се вчитува...</span>
-            </>
-          ) : (
-            <span>Вчитај препораки!</span>
-          )}
-        </button>
-      </div>
-
-      <div className="flex-1 p-8 overflow-y-auto">
-        {recommendations.length > 0 ? (
-          <div className="space-y-6">
-            <div className="text-center mb-8">
-              <h2 className="text-3xl font-bold text-gray-800 mb-2">
-                Вашите препораки за {getSeasonText().toLowerCase()}{" "}
-                {getSeasonText().toLowerCase() === "двата"
-                  ? "семестри"
-                  : "семестар"}
-              </h2>
-              <div className="w-24 h-1 bg-blue-500 mx-auto rounded-full"></div>
-            </div>
-
-            <div className="grid grid-cols-1 lg:grid-cols-2 gap-6 lg:h-[1100px]">
-              {recommendations.map((subject, index) => (
-                <div
-                  key={subject.id}
-                  // Added the `group` class here to enable group-hover functionality.
-                  className={`group border border-gray-200 rounded-lg overflow-hidden shadow-sm hover:shadow-md transition-shadow duration-200 relative ${
-                    index % 2 === 0 ? "self-start" : "self-end"
-                  }`}
-                  style={{
-                    height: "80%",
-                    animationDelay: `${index * 100}ms`,
-                    animation: "fadeInUp 0.6s ease-out forwards",
-                  }}
-                >
-                  <div className="p-4 min-h-full flex flex-col gap-1">
-                    <div className="flex justify-between items-start mb-2">
-                      <div>
-                        <h3 className="text-lg font-semibold">
-                          {subject.name}
-                        </h3>
-                        <p className="text-gray-600">{subject.code}</p>
-                      </div>
-                    </div>
-
-                    {/* Badge Logic: Prioritizes the warning, and shows the selected badge only on hover. */}
-                    {/* 1. First, check for the most critical warning. */}
-                    <div className="absolute inset-0 flex items-center justify-center pointer-events-none">
-                      {subject.subject_info.activated === false ? (
-                        <span className="bg-red-500 text-white font-bold px-3 py-1 rounded-full shadow-lg text-xs opacity-0 group-hover:opacity-100 transition-opacity duration-300 z-10">
-                          ⚠️ Никогаш не бил активиран!
-                        </span>
-                      ) : index === 0 ? (
-                        <span className="bg-blue-600 text-white font-bold px-3 py-1 rounded-full shadow-lg text-xs opacity-0 group-hover:opacity-100 transition-opacity duration-300 z-10">
-                          ⭐ Најсоодветен!
-                        </span>
-                      ) : null}
-                    </div>
-
-                    <div className="flex justify-between mt-auto gap-3">
-                      <button
-                        onClick={() => openSubjectDetails(subject)}
-                        className="flex items-center text-sm text-gray-600 hover:text-gray-800 transition-colors"
-                      >
-                        <img
-                          src="src/assets/eye.svg"
-                          className="w-4 h-4 mr-1"
-                        />
-                        Краток преглед
-                      </button>
-                      <button
-                        onClick={() => openSubjectView(subject)}
-                        className="flex items-center px-3 py-2 bg-blue-600 hover:bg-blue-900 text-white text-sm font-medium rounded-md transition-colors"
-                      >
-                        <svg
-                          className="w-4 h-4 mr-1"
-                          fill="none"
-                          stroke="currentColor"
-                          viewBox="0 0 24 24"
-                        >
-                          <path
-                            strokeLinecap="round"
-                            strokeLinejoin="round"
-                            strokeWidth={2}
-                            d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
-                          />
-                        </svg>
-                        Отвори предмет
-                      </button>
-                    </div>
-                  </div>
-                </div>
-              ))}
-            </div>
-          </div>
-        ) : (
-          <div className="flex flex-col items-center justify-center h-full text-center">
-            <div className="text-gray-400 mb-6">
-              <svg
-                className="w-16 h-16 mx-auto"
-                fill="none"
-                stroke="currentColor"
-                viewBox="0 0 24 24"
-              >
-                <path
-                  strokeLinecap="round"
-                  strokeLinejoin="round"
-                  strokeWidth={1}
-                  d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
-                />
-              </svg>
-            </div>
-            <h3 className="text-2xl font-bold text-gray-600 mb-4">
-              Започнете со пребарување!
-            </h3>
-            <p className="text-gray-500 text-lg max-w-md">
-              Изберете ја саканата сезона и кликнете на "Вчитај препораки" за да
-              ги откриете вашите идеални предмети!
-            </p>
-          </div>
-        )}
-      </div>
-      {showModal && selectedSubject && (
-        <SubjectModal
-          selectedSubject={selectedSubject}
-          closeModal={closeModal}
-          subjectPrerequisites={getSubjectPrerequisites(
-            selectedSubject,
-            subjectIdToNameMap
-          )}
-        />
-      )}
-    </div>
-  );
+	const axiosAuth = useAxiosAuth();
+	const navigate = useNavigate();
+	const [subjectData, setSubjectData] = useState<Subject[]>([]);
+	const [recommendations, setRecommendations] = useState<Subject[]>([]);
+	const [season_, setSeason] = useState<"winter" | "summer" | "all">("all");
+	const [isLoading, setIsLoading] = useState(false);
+	const [showModal, setShowModal] = useState(false);
+
+	const mapToSeasonInt = (season: "winter" | "summer" | "all") => {
+		if (season == "summer") return 0;
+		if (season == "winter") return 1;
+		return 2;
+	};
+
+	const fetchRecommendations = async () => {
+		setIsLoading(true);
+		try {
+			const season = mapToSeasonInt(season_);
+			const response = await axiosAuth.get("/suggestion", {
+				params: { season },
+			});
+			setRecommendations(response.data.data);
+		} catch (error) {
+			console.error("Error fetching recommendations:", error);
+		} finally {
+			setIsLoading(false);
+		}
+	};
+
+	// need to fetch subject data so that we can compare the subject IDs (prerequisites store IDs, but we need names)
+	//  in the modals for the recommendations
+	useEffect(() => {
+		const fetchData = async () => {
+			const response = await axiosAuth.get("/subjects");
+			setSubjectData(response.data);
+		};
+		fetchData();
+	}, [axiosAuth]);
+
+	const subjectIdToNameMap = useMemo(() => {
+		const map = new Map<number, string>();
+		subjectData.forEach((subject) => {
+			map.set(subject.id, subject.name);
+		});
+		return map;
+	}, [subjectData]);
+
+	const cycleSeason = () => {
+		if (season_ === "all") setSeason("winter");
+		else if (season_ === "winter") setSeason("summer");
+		else setSeason("all");
+	};
+
+	const openSubjectView = (subject: Subject) => {
+		navigate(`/subjects/${subject.id}`, {
+			state: { from: "/recommendations" },
+		});
+	};
+
+	const [selectedSubject, setSelectedSubject] = useState<Subject | null>(null);
+
+	const openSubjectDetails = (subject: Subject) => {
+		setSelectedSubject(subject);
+		setShowModal(true);
+	};
+
+	const closeModal = () => {
+		setSelectedSubject(null);
+		setShowModal(false);
+	};
+
+	const getSeasonText = () => {
+		switch (season_) {
+			case "winter":
+				return "Зимски";
+			case "summer":
+				return "Летен";
+			case "all":
+				return "Двата";
+		}
+	};
+
+	return (
+		<div className="flex h-[90vh] bg-gray-50">
+			{/* <div className="flex h-screen bg-gray-50"> */}
+			<div className="w-1/3 bg-white shadow-lg p-8 flex flex-col justify-center items-center space-y-8">
+				<div className="text-center">
+					<h1 className="text-4xl font-bold text-gray-800 mb-2">Препораки</h1>
+					<p className="text-gray-600 text-lg">
+						Предметите што ќе ги добиете од алгоритамот се базирани на она што
+						сте го пополниле во формата.
+						<br />
+						Тие се подредени според тоа колку вашите интереси се совпаѓаат со
+						она што го нудат предметите.
+					</p>
+				</div>
+
+				<div className="bg-blue-50 border border-blue-200 rounded-lg p-6 text-center hover:bg-blue-100 transition-colors duration-200">
+					<p className="text-gray-700 mb-3">Избран семестар: </p>
+					<p className="text-2xl font-semibold text-gray-800">
+						{getSeasonText()}
+					</p>
+				</div>
+
+				<button
+					onClick={cycleSeason}
+					className="bg-blue-500 hover:bg-blue-600 text-white px-8 py-4 rounded-lg text-lg font-medium hover:scale-105 transition-all duration-200 shadow-md hover:shadow-lg"
+				>
+					Промени семестар
+				</button>
+
+				<button
+					onClick={fetchRecommendations}
+					disabled={isLoading}
+					className={`${
+						isLoading
+							? "bg-gray-400 cursor-not-allowed"
+							: "bg-green-500 hover:bg-green-600 hover:scale-105 shadow-md hover:shadow-lg"
+					} text-white px-8 py-4 rounded-lg text-xl font-bold transition-all duration-200 flex items-center space-x-2`}
+				>
+					{isLoading ? (
+						<>
+							<div className="animate-spin rounded-full h-5 w-5 border-b-2 border-white"></div>
+							<span>Се вчитува...</span>
+						</>
+					) : (
+						<span>Вчитај препораки!</span>
+					)}
+				</button>
+			</div>
+
+			<div className="flex-1 p-8 overflow-y-auto">
+				{recommendations.length > 0 ? (
+					<div className="space-y-6">
+						<div className="text-center mb-8">
+							<h2 className="text-3xl font-bold text-gray-800 mb-2">
+								Вашите препораки за {getSeasonText().toLowerCase()}{" "}
+								{getSeasonText().toLowerCase() === "двата"
+									? "семестри"
+									: "семестар"}
+							</h2>
+							<div className="w-24 h-1 bg-blue-500 mx-auto rounded-full"></div>
+						</div>
+
+						<div className="grid grid-cols-1 lg:grid-cols-2 gap-3 lg:h-[1100px]">
+							{recommendations.map((subject, index) => (
+								<div
+									key={subject.id}
+									// Added the `group` class here to enable group-hover functionality.
+									className={`group border border-gray-200 rounded-lg overflow-hidden shadow-sm hover:shadow-md transition-shadow duration-200 relative ${
+										index % 2 === 0 ? "self-start" : "self-end"
+									}`}
+									style={{
+										height: "70%",
+										animationDelay: `${index * 100}ms`,
+										animation: "fadeInUp 0.6s ease-out forwards",
+									}}
+								>
+									<div className="p-4 min-h-full flex flex-col gap-1">
+										<div className="flex justify-between items-start mb-2">
+											<div>
+												<h3 className="text-lg font-semibold">
+													{subject.name}
+												</h3>
+												<p className="text-gray-600">{subject.code}</p>
+											</div>
+										</div>
+
+										{/* Badge Logic: Prioritizes the warning, and shows the selected badge only on hover. */}
+										{/* 1. First, check for the most critical warning. */}
+										<div className="absolute inset-0 flex items-center justify-center pointer-events-none">
+											{subject.subject_info.activated === false ? (
+												<span className="bg-red-500 text-white font-bold px-3 py-1 rounded-full shadow-lg text-xs opacity-0 group-hover:opacity-100 transition-opacity duration-300 z-10">
+													⚠️ Никогаш не бил активиран!
+												</span>
+											) : index === 0 ? (
+												<span className="bg-blue-600 text-white font-bold px-3 py-1 rounded-full shadow-lg text-xs opacity-0 group-hover:opacity-100 transition-opacity duration-300 z-10">
+													⭐ Најсоодветен!
+												</span>
+											) : null}
+										</div>
+
+										<div className="flex justify-between mt-auto gap-3">
+											<button
+												onClick={() => openSubjectDetails(subject)}
+												className="flex items-center text-sm text-gray-600 hover:text-gray-800 transition-colors"
+											>
+												<img
+													src="src/assets/eye.svg"
+													className="w-4 h-4 mr-1"
+												/>
+												Краток преглед
+											</button>
+											<button
+												onClick={() => openSubjectView(subject)}
+												className="flex items-center px-3 py-2 bg-blue-600 hover:bg-blue-900 text-white text-sm font-medium rounded-md transition-colors"
+											>
+												<svg
+													className="w-4 h-4 mr-1"
+													fill="none"
+													stroke="currentColor"
+													viewBox="0 0 24 24"
+												>
+													<path
+														strokeLinecap="round"
+														strokeLinejoin="round"
+														strokeWidth={2}
+														d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
+													/>
+												</svg>
+												Отвори предмет
+											</button>
+										</div>
+									</div>
+								</div>
+							))}
+						</div>
+					</div>
+				) : (
+					<div className="flex flex-col items-center justify-center h-full text-center">
+						<div className="text-gray-400 mb-6">
+							<svg
+								className="w-16 h-16 mx-auto"
+								fill="none"
+								stroke="currentColor"
+								viewBox="0 0 24 24"
+							>
+								<path
+									strokeLinecap="round"
+									strokeLinejoin="round"
+									strokeWidth={1}
+									d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
+								/>
+							</svg>
+						</div>
+						<h3 className="text-2xl font-bold text-gray-600 mb-4">
+							Започнете со пребарување!
+						</h3>
+						<p className="text-gray-500 text-lg max-w-md">
+							Изберете ја саканата сезона и кликнете на "Вчитај препораки" за да
+							ги откриете вашите идеални предмети!
+						</p>
+					</div>
+				)}
+			</div>
+			{showModal && selectedSubject && (
+				<SubjectModal
+					selectedSubject={selectedSubject}
+					closeModal={closeModal}
+					subjectPrerequisites={getSubjectPrerequisites(
+						selectedSubject,
+						subjectIdToNameMap
+					)}
+				/>
+			)}
+		</div>
+	);
 };
 
