Index: backend/auth_form/serializers.py
===================================================================
--- backend/auth_form/serializers.py	(revision 9234fcaaf818682e491ea09e8d4b36486e54b30b)
+++ backend/auth_form/serializers.py	(revision 997721a9d300fe4402e7f6db9e40cc1d4e69c783)
@@ -23,8 +23,11 @@
     
     def validate(self, data):
+        errors = {}
         if not re.match(r"^[^@]+@(students\.)?finki\.ukim\.mk$", data['email']):
-            raise serializers.ValidationError("Email must be a valid FINKI email address")
+            errors['email'] = ["Email must be a valid FINKI email address"]
         if data['password'] != data['confirm_password']:
-            raise serializers.ValidationError("Passwords do not match")
+            errors['confirm_password'] = ["Passwords do not match"]
+        if errors:
+            raise serializers.ValidationError(errors)
         return data
     
Index: frontend/src/components/PasswordInput.tsx
===================================================================
--- frontend/src/components/PasswordInput.tsx	(revision 997721a9d300fe4402e7f6db9e40cc1d4e69c783)
+++ frontend/src/components/PasswordInput.tsx	(revision 997721a9d300fe4402e7f6db9e40cc1d4e69c783)
@@ -0,0 +1,44 @@
+import { useState } from "react";
+interface PasswordInputProps {
+  name: string;
+  value: string;
+  onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
+  error?: string
+}
+
+const PasswordInput: React.FC<PasswordInputProps> = ({
+  name,
+  value,
+  onChange,
+  error,
+}) => {
+  const [showPassword, setShowPassword] = useState(false);
+
+  const togglePasswordVisibility = () => {
+    setShowPassword(!showPassword);
+  };
+
+  return (
+    <div className="relative">
+      <input
+        type={showPassword ? "text" : "password"}
+        name={name}
+        value={value}
+        onChange={onChange}
+        className="w-full mb-3 p-2 border rounded"
+        placeholder="Password"
+        required
+      />
+      <button
+        type="button"
+        onClick={togglePasswordVisibility}
+        className="absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-500"
+      >
+        {showPassword ? "Hide" : "Show"}
+      </button>
+      {error && <p className="text-red-500 text-sm mb-2">{error}</p>}
+    </div>
+  );
+};
+
+export default PasswordInput;
Index: frontend/src/components/SubjectCatalog/FilterSidebar.tsx
===================================================================
--- frontend/src/components/SubjectCatalog/FilterSidebar.tsx	(revision 9234fcaaf818682e491ea09e8d4b36486e54b30b)
+++ frontend/src/components/SubjectCatalog/FilterSidebar.tsx	(revision 997721a9d300fe4402e7f6db9e40cc1d4e69c783)
@@ -1,264 +1,264 @@
 import { PROGRAMS } from "../../constants/subjects";
-import { Filters } from "./types";
+import { Filters } from "../types";
 import { resetFilters } from "./utils";
 interface FilterSidebarProps {
-	setSearchTerm: (term: string) => void;
-	setProfessorSearchTerm: (term: string) => void;
-	setAssistantSearchTerm: (term: string) => void;
-	setFilters: (filters: (prev: Filters) => Filters) => void;
-	filters: Filters;
+  setSearchTerm: (term: string) => void;
+  setProfessorSearchTerm: (term: string) => void;
+  setAssistantSearchTerm: (term: string) => void;
+  setFilters: (filters: (prev: Filters) => Filters) => void;
+  filters: Filters;
 }
 
 const FilterSidebar = ({
-	setSearchTerm,
-	setProfessorSearchTerm,
-	setAssistantSearchTerm,
-	setFilters,
-	filters,
+  setSearchTerm,
+  setProfessorSearchTerm,
+  setAssistantSearchTerm,
+  setFilters,
+  filters,
 }: FilterSidebarProps) => {
-	return (
-		<div className="">
-			<div className="flex justify-between items-center mb-4">
-				<h2 className="text-lg font-semibold">Филтри</h2>
-				<button
-					onClick={() =>
-						resetFilters(
-							setSearchTerm,
-							setProfessorSearchTerm,
-							setAssistantSearchTerm,
-							setFilters
-						)
-					}
-					className="text-sm text-gray-600 hover:text-gray-900"
-				>
-					Избриши
-				</button>
-			</div>
-			<div className="mb-4">
-				{/* filter by season*/}
-				<div className="space-y-1 mb-4">
-					<h3 className="font-medium mb-2">Семестар</h3>
-					<div className="grid grid-cols-2">
-						{["Летен", "Зимски"].map((season) => {
-							const seasonValue = season === "Летен" ? "S" : "W";
-							return (
-								<div key={season} className="flex items-center space-x-2">
-									<input
-										type="checkbox"
-										name="season"
-										id={seasonValue}
-										onChange={() =>
-											setFilters((prev) => ({
-												...prev,
-												season: prev.season === seasonValue ? "" : seasonValue,
-											}))
-										}
-										checked={filters.season === seasonValue}
-										className="h-4 w-4 rounded border-gray-300 text-blue-600"
-									/>
-									<label
-										htmlFor={seasonValue}
-										className="ml-2 text-sm text-gray-700"
-									>
-										{season}
-									</label>
-								</div>
-							);
-						})}
-					</div>
-				</div>
+  return (
+    <div className="">
+      <div className="flex justify-between items-center mb-4">
+        <h2 className="text-lg font-semibold">Филтри</h2>
+        <button
+          onClick={() =>
+            resetFilters(
+              setSearchTerm,
+              setProfessorSearchTerm,
+              setAssistantSearchTerm,
+              setFilters
+            )
+          }
+          className="text-sm text-gray-600 hover:text-gray-900"
+        >
+          Избриши
+        </button>
+      </div>
+      <div className="mb-4">
+        {/* filter by season*/}
+        <div className="space-y-1 mb-4">
+          <h3 className="font-medium mb-2">Семестар</h3>
+          <div className="grid grid-cols-2">
+            {["Летен", "Зимски"].map((season) => {
+              const seasonValue = season === "Летен" ? "S" : "W";
+              return (
+                <div key={season} className="flex items-center space-x-2">
+                  <input
+                    type="checkbox"
+                    name="season"
+                    id={seasonValue}
+                    onChange={() =>
+                      setFilters((prev) => ({
+                        ...prev,
+                        season: prev.season === seasonValue ? "" : seasonValue,
+                      }))
+                    }
+                    checked={filters.season === seasonValue}
+                    className="h-4 w-4 rounded border-gray-300 text-blue-600"
+                  />
+                  <label
+                    htmlFor={seasonValue}
+                    className="ml-2 text-sm text-gray-700"
+                  >
+                    {season}
+                  </label>
+                </div>
+              );
+            })}
+          </div>
+        </div>
 
-				{/* filter by semester*/}
-				<div className="space-y-1 mb-4">
-					{/* <h3 className="font-medium mb-2">Семестар</h3> */}
-					<div className="grid grid-cols-4 gap-2">
-						{Array.from(Array(8)).map((_, index) => {
-							const i = index + 1;
-							return (
-								<div key={i} className="flex items-center space-x-2">
-									<input
-										type="checkbox"
-										name="season"
-										id={`s${i}`}
-										onChange={() =>
-											setFilters((prev) => ({
-												...prev,
-												semester: prev.semester.includes(i)
-													? prev.semester.filter((item) => item !== i)
-													: [...prev.semester, i],
-											}))
-										}
-										checked={filters.semester.includes(i)}
-										className="h-4 w-4 rounded border-gray-300 text-blue-600"
-									/>
-									<label htmlFor={`s${i}`} className="text-sm text-gray-700">
-										{i}
-									</label>
-								</div>
-							);
-						})}
-					</div>
-				</div>
-				{/* filter by level */}
-				<div className="space-y-1 mb-4">
-					<h3 className="font-medium mb-2">Ниво</h3>
-					<div className="grid grid-cols-3">
-						{Array.from(Array(3)).map((_, index) => {
-							const i = index + 1;
-							const level = `L${i}`;
-							return (
-								<div key={i} className="flex items-center space-x-2">
-									<input
-										type="checkbox"
-										name="level"
-										id={level}
-										onChange={() =>
-											setFilters((prev) => ({
-												...prev,
-												level: prev.level.includes(i)
-													? prev.level.filter((item) => item !== i)
-													: [...prev.level, i],
-											}))
-										}
-										checked={filters.level.includes(i)}
-										className="h-4 w-4 rounded border-gray-300 text-blue-600"
-									/>
-									<label
-										htmlFor={`s${level}`}
-										className="text-sm text-gray-700"
-									>
-										{level}
-									</label>
-								</div>
-							);
-						})}
-					</div>
-				</div>
-				{/* filter by activation*/}
-				<div className="space-y-1 mb-4">
-					<h3 className="font-medium mb-2">Активирани</h3>
-					<div className="grid grid-cols-2">
-						{["Активирани", "Неактивирани"].map((value) => {
-							const activeValue =
-								value === "Активирани" ? "activated" : "not_activated";
-							return (
-								<div key={activeValue} className="flex items-center space-x-2">
-									<input
-										type="checkbox"
-										name="season"
-										id={activeValue}
-										onChange={() =>
-											setFilters((prev) => ({
-												...prev,
-												activated:
-													prev.activated === activeValue ? "" : activeValue,
-											}))
-										}
-										checked={filters.activated === activeValue}
-										className="h-4 w-4 rounded border-gray-300 text-blue-600"
-									/>
-									<label
-										htmlFor={activeValue}
-										className="ml-2 text-sm text-gray-700"
-									>
-										{value}
-									</label>
-								</div>
-							);
-						})}
-					</div>
-				</div>
-				{/* filter by mandatoryFor */}
-				<div className="space-y-1 mb-4">
-					<h3 className="font-medium mb-2">Задолжителен за:</h3>
-					<div className="grid grid-cols-3 gap-2">
-						{PROGRAMS.map((program) => {
-							const programName = program.replace(/\d+$/, "");
-							return (
-								<div key={program} className="flex items-center space-x-2">
-									<input
-										type="checkbox"
-										name="level"
-										id={program}
-										onChange={() =>
-											setFilters((prev) => ({
-												...prev,
-												mandatoryFor: prev.mandatoryFor.includes(program)
-													? prev.mandatoryFor.filter((item) => item !== program)
-													: [...prev.mandatoryFor, program],
-											}))
-										}
-										checked={filters.mandatoryFor.includes(program)}
-										className="h-4 w-4 rounded border-gray-300 text-blue-600"
-									/>
-									<label
-										htmlFor={`s${program}`}
-										className="text-sm text-gray-700"
-									>
-										{programName}
-									</label>
-								</div>
-							);
-						})}
-					</div>
-				</div>
-				{/* filter by electiveFor */}
-				<div className="space-y-1 mb-6">
-					<h3 className="font-medium mb-2">Изборен за:</h3>
-					<div className="grid grid-cols-3 gap-2">
-						{PROGRAMS.map((program) => {
-							const programName = program.replace(/\d+$/, "");
-							return (
-								<div key={program} className="flex items-center space-x-2">
-									<input
-										type="checkbox"
-										name="level"
-										id={program}
-										onChange={() =>
-											setFilters((prev) => ({
-												...prev,
-												electiveFor: prev.electiveFor.includes(program)
-													? prev.electiveFor.filter((item) => item !== program)
-													: [...prev.electiveFor, program],
-											}))
-										}
-										checked={filters.electiveFor.includes(program)}
-										className="h-4 w-4 rounded border-gray-300 text-blue-600"
-									/>
-									<label
-										htmlFor={`s${program}`}
-										className="text-sm text-gray-700"
-									>
-										{programName}
-									</label>
-								</div>
-							);
-						})}
-					</div>
-				</div>
-				{/* filter by prereq */}
-				<div className="space-y-1 mb-4">
-					<div className="flex items-center space-x-2">
-						<input
-							type="checkbox"
-							name="prereq"
-							id="prereq"
-							onChange={() =>
-								setFilters((prev) => ({
-									...prev,
-									hasPrerequisites: !prev.hasPrerequisites,
-								}))
-							}
-							checked={filters.hasPrerequisites}
-							className="h-4 w-4 rounded border-gray-300 text-blue-600"
-						/>
-						<label htmlFor={"prereq"} className="text-sm text-gray-700">
-							Предметот нема предуслови
-						</label>
-					</div>
-				</div>
-			</div>
-		</div>
-	);
+        {/* filter by semester*/}
+        <div className="space-y-1 mb-4">
+          {/* <h3 className="font-medium mb-2">Семестар</h3> */}
+          <div className="grid grid-cols-4 gap-2">
+            {Array.from(Array(8)).map((_, index) => {
+              const i = index + 1;
+              return (
+                <div key={i} className="flex items-center space-x-2">
+                  <input
+                    type="checkbox"
+                    name="season"
+                    id={`s${i}`}
+                    onChange={() =>
+                      setFilters((prev) => ({
+                        ...prev,
+                        semester: prev.semester.includes(i)
+                          ? prev.semester.filter((item) => item !== i)
+                          : [...prev.semester, i],
+                      }))
+                    }
+                    checked={filters.semester.includes(i)}
+                    className="h-4 w-4 rounded border-gray-300 text-blue-600"
+                  />
+                  <label htmlFor={`s${i}`} className="text-sm text-gray-700">
+                    {i}
+                  </label>
+                </div>
+              );
+            })}
+          </div>
+        </div>
+        {/* filter by level */}
+        <div className="space-y-1 mb-4">
+          <h3 className="font-medium mb-2">Ниво</h3>
+          <div className="grid grid-cols-3">
+            {Array.from(Array(3)).map((_, index) => {
+              const i = index + 1;
+              const level = `L${i}`;
+              return (
+                <div key={i} className="flex items-center space-x-2">
+                  <input
+                    type="checkbox"
+                    name="level"
+                    id={level}
+                    onChange={() =>
+                      setFilters((prev) => ({
+                        ...prev,
+                        level: prev.level.includes(i)
+                          ? prev.level.filter((item) => item !== i)
+                          : [...prev.level, i],
+                      }))
+                    }
+                    checked={filters.level.includes(i)}
+                    className="h-4 w-4 rounded border-gray-300 text-blue-600"
+                  />
+                  <label
+                    htmlFor={`s${level}`}
+                    className="text-sm text-gray-700"
+                  >
+                    {level}
+                  </label>
+                </div>
+              );
+            })}
+          </div>
+        </div>
+        {/* filter by activation*/}
+        <div className="space-y-1 mb-4">
+          <h3 className="font-medium mb-2">Активирани</h3>
+          <div className="grid grid-cols-2">
+            {["Активирани", "Неактивирани"].map((value) => {
+              const activeValue =
+                value === "Активирани" ? "activated" : "not_activated";
+              return (
+                <div key={activeValue} className="flex items-center space-x-2">
+                  <input
+                    type="checkbox"
+                    name="season"
+                    id={activeValue}
+                    onChange={() =>
+                      setFilters((prev) => ({
+                        ...prev,
+                        activated:
+                          prev.activated === activeValue ? "" : activeValue,
+                      }))
+                    }
+                    checked={filters.activated === activeValue}
+                    className="h-4 w-4 rounded border-gray-300 text-blue-600"
+                  />
+                  <label
+                    htmlFor={activeValue}
+                    className="ml-2 text-sm text-gray-700"
+                  >
+                    {value}
+                  </label>
+                </div>
+              );
+            })}
+          </div>
+        </div>
+        {/* filter by mandatoryFor */}
+        <div className="space-y-1 mb-4">
+          <h3 className="font-medium mb-2">Задолжителен за:</h3>
+          <div className="grid grid-cols-3 gap-2">
+            {PROGRAMS.map((program) => {
+              const programName = program.replace(/\d+$/, "");
+              return (
+                <div key={program} className="flex items-center space-x-2">
+                  <input
+                    type="checkbox"
+                    name="level"
+                    id={program}
+                    onChange={() =>
+                      setFilters((prev) => ({
+                        ...prev,
+                        mandatoryFor: prev.mandatoryFor.includes(program)
+                          ? prev.mandatoryFor.filter((item) => item !== program)
+                          : [...prev.mandatoryFor, program],
+                      }))
+                    }
+                    checked={filters.mandatoryFor.includes(program)}
+                    className="h-4 w-4 rounded border-gray-300 text-blue-600"
+                  />
+                  <label
+                    htmlFor={`s${program}`}
+                    className="text-sm text-gray-700"
+                  >
+                    {programName}
+                  </label>
+                </div>
+              );
+            })}
+          </div>
+        </div>
+        {/* filter by electiveFor */}
+        <div className="space-y-1 mb-6">
+          <h3 className="font-medium mb-2">Изборен за:</h3>
+          <div className="grid grid-cols-3 gap-2">
+            {PROGRAMS.map((program) => {
+              const programName = program.replace(/\d+$/, "");
+              return (
+                <div key={program} className="flex items-center space-x-2">
+                  <input
+                    type="checkbox"
+                    name="level"
+                    id={program}
+                    onChange={() =>
+                      setFilters((prev) => ({
+                        ...prev,
+                        electiveFor: prev.electiveFor.includes(program)
+                          ? prev.electiveFor.filter((item) => item !== program)
+                          : [...prev.electiveFor, program],
+                      }))
+                    }
+                    checked={filters.electiveFor.includes(program)}
+                    className="h-4 w-4 rounded border-gray-300 text-blue-600"
+                  />
+                  <label
+                    htmlFor={`s${program}`}
+                    className="text-sm text-gray-700"
+                  >
+                    {programName}
+                  </label>
+                </div>
+              );
+            })}
+          </div>
+        </div>
+        {/* filter by prereq */}
+        <div className="space-y-1 mb-4">
+          <div className="flex items-center space-x-2">
+            <input
+              type="checkbox"
+              name="prereq"
+              id="prereq"
+              onChange={() =>
+                setFilters((prev) => ({
+                  ...prev,
+                  hasPrerequisites: !prev.hasPrerequisites,
+                }))
+              }
+              checked={filters.hasPrerequisites}
+              className="h-4 w-4 rounded border-gray-300 text-blue-600"
+            />
+            <label htmlFor={"prereq"} className="text-sm text-gray-700">
+              Предметот нема предуслови
+            </label>
+          </div>
+        </div>
+      </div>
+    </div>
+  );
 };
 
Index: frontend/src/components/SubjectCatalog/SubjectCatalog.tsx
===================================================================
--- frontend/src/components/SubjectCatalog/SubjectCatalog.tsx	(revision 9234fcaaf818682e491ea09e8d4b36486e54b30b)
+++ frontend/src/components/SubjectCatalog/SubjectCatalog.tsx	(revision 997721a9d300fe4402e7f6db9e40cc1d4e69c783)
@@ -5,110 +5,110 @@
 import SubjectList from "./SubjectList";
 import SubjectModal from "./SubjectModal";
-import { Filters, Subject } from "./types";
+import { Filters, Subject } from "../types";
 import { filterSubjects, getRandomStaff, resetFilters } from "./utils";
 const SubjectCatalog = () => {
-	const [visibleCourses, setVisibleCourses] = useState<number>(10);
-	const [searchTerm, setSearchTerm] = useState<string>("");
-	const [professorSearchTerm, setProfessorSearchTerm] = useState<string>("");
-	const [assistantSearchTerm, setAssistantSearchTerm] = useState<string>("");
-	const [selectedSubject, setSelectedSubject] = useState<Subject | null>(null);
-	const [subjectData, setSubjectData] = useState<Subject[]>([]);
-	const [isLoaded, setIsLoaded] = useState(false);
-	const [randomStaff, setRandomStaff] = useState(["", ""]);
-	const [showModal, setShowModal] = useState(false);
-	const [filters, setFilters] = useState<Filters>({
-		season: "",
-		semester: [],
-		level: [],
-		activated: "",
-		mandatoryFor: [],
-		electiveFor: [],
-		professors: [],
-		assistants: [],
-		hasPrerequisites: false,
-	});
+  const [visibleCourses, setVisibleCourses] = useState<number>(10);
+  const [searchTerm, setSearchTerm] = useState<string>("");
+  const [professorSearchTerm, setProfessorSearchTerm] = useState<string>("");
+  const [assistantSearchTerm, setAssistantSearchTerm] = useState<string>("");
+  const [selectedSubject, setSelectedSubject] = useState<Subject | null>(null);
+  const [subjectData, setSubjectData] = useState<Subject[]>([]);
+  const [isLoaded, setIsLoaded] = useState(false);
+  const [randomStaff, setRandomStaff] = useState(["", ""]);
+  const [showModal, setShowModal] = useState(false);
+  const [filters, setFilters] = useState<Filters>({
+    season: "",
+    semester: [],
+    level: [],
+    activated: "",
+    mandatoryFor: [],
+    electiveFor: [],
+    professors: [],
+    assistants: [],
+    hasPrerequisites: false,
+  });
 
-	const filteredSubjects: Subject[] = filterSubjects({
-		subjectData,
-		searchTerm,
-		professorSearchTerm,
-		assistantSearchTerm,
-		filters,
-	});
+  const filteredSubjects: Subject[] = filterSubjects({
+    subjectData,
+    searchTerm,
+    professorSearchTerm,
+    assistantSearchTerm,
+    filters,
+  });
 
-	useEffect(() => {
-		const fetchData = async () => {
-			const response = await fetch("http://localhost:8000/subjects");
-			const data = await response.json();
-			setSubjectData(data.subjects);
-			setIsLoaded(true);
-		};
-		fetchData();
-	}, []);
+  useEffect(() => {
+    const fetchData = async () => {
+      const response = await fetch("http://localhost:8000/subjects");
+      const data = await response.json();
+      setSubjectData(data.subjects);
+      setIsLoaded(true);
+    };
+    fetchData();
+  }, []);
 
-	useEffect(() => {
-		getRandomStaff(subjectData, setRandomStaff);
-	}, [subjectData]);
+  useEffect(() => {
+    getRandomStaff(subjectData, setRandomStaff);
+  }, [subjectData]);
 
-	const loadMore = () => {
-		setVisibleCourses((prev) => prev + 10);
-	};
+  const loadMore = () => {
+    setVisibleCourses((prev) => prev + 10);
+  };
 
-	const openSubjectDetails = (subject: Subject) => {
-		setSelectedSubject(
-			subjectData.find((item) => item.id == subject.id) ?? null
-		);
-		setShowModal(true);
-	};
+  const openSubjectDetails = (subject: Subject) => {
+    setSelectedSubject(
+      subjectData.find((item) => item.id == subject.id) ?? null
+    );
+    setShowModal(true);
+  };
 
-	const closeModal = () => {
-		setShowModal(false);
-	};
+  const closeModal = () => {
+    setShowModal(false);
+  };
 
-	const getSubjectPrerequisites = () => {
-		if (!selectedSubject) return "Нема предуслов";
-		return "subjects" in selectedSubject?.info.prerequisite
-			? selectedSubject.info.prerequisite.subjects.map(
-					(item) =>
-						subjectData.find((subject) => subject.id === item)?.name || "/"
-			  )
-			: "credits" in selectedSubject.info.prerequisite
-			? selectedSubject.info.prerequisite.credits
-			: "Нема предуслов";
-	};
+  const getSubjectPrerequisites = () => {
+    if (!selectedSubject) return "Нема предуслов";
+    return "subjects" in selectedSubject?.info.prerequisite
+      ? selectedSubject.info.prerequisite.subjects.map(
+          (item) =>
+            subjectData.find((subject) => subject.id === item)?.name || "/"
+        )
+      : "credits" in selectedSubject.info.prerequisite
+      ? selectedSubject.info.prerequisite.credits
+      : "Нема предуслов";
+  };
 
-	return (
-		<div className="mx-auto p-4 bg-white min-h-screen">
-			<h1 className="text-3xl font-bold mb-6">Преглед на сите предмети</h1>
-			<div className="flex flex-col md:flex-row gap-6">
-				<div className="w-full md:w-64 bg-gray-50 p-4 rounded-lg">
-					<FilterSidebar
-						setSearchTerm={setSearchTerm}
-						setProfessorSearchTerm={setProfessorSearchTerm}
-						setAssistantSearchTerm={setAssistantSearchTerm}
-						setFilters={setFilters}
-						filters={filters}
-					/>
-					<StaffSearch
-						randomStaff={randomStaff}
-						professorSearchTerm={professorSearchTerm}
-						assistantSearchTerm={assistantSearchTerm}
-						setProfessorSearchTerm={setProfessorSearchTerm}
-						setAssistantSearchTerm={setAssistantSearchTerm}
-					/>
-				</div>
-				{/* Main content */}
-				<div className="flex-1">
-					{/* Search bar */}
-					<div className="mb-6 relative">
-						<input
-							type="text"
-							placeholder="Пребарувај предмети по име, код, опис"
-							value={searchTerm}
-							onChange={(e) => setSearchTerm(e.target.value)}
-							className="w-full p-3 pl-4 pr-12 border border-gray-300 rounded-lg 
+  return (
+    <div className="mx-auto p-4 bg-white min-h-screen">
+      <h1 className="text-3xl font-bold mb-6">Преглед на сите предмети</h1>
+      <div className="flex flex-col md:flex-row gap-6">
+        <div className="w-full md:w-64 bg-gray-50 p-4 rounded-lg">
+          <FilterSidebar
+            setSearchTerm={setSearchTerm}
+            setProfessorSearchTerm={setProfessorSearchTerm}
+            setAssistantSearchTerm={setAssistantSearchTerm}
+            setFilters={setFilters}
+            filters={filters}
+          />
+          <StaffSearch
+            randomStaff={randomStaff}
+            professorSearchTerm={professorSearchTerm}
+            assistantSearchTerm={assistantSearchTerm}
+            setProfessorSearchTerm={setProfessorSearchTerm}
+            setAssistantSearchTerm={setAssistantSearchTerm}
+          />
+        </div>
+        {/* Main content */}
+        <div className="flex-1">
+          {/* Search bar */}
+          <div className="mb-6 relative">
+            <input
+              type="text"
+              placeholder="Пребарувај предмети по име, код, опис"
+              value={searchTerm}
+              onChange={(e) => setSearchTerm(e.target.value)}
+              className="w-full p-3 pl-4 pr-12 border border-gray-300 rounded-lg 
 							focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
-						/>
-						{/* <button
+            />
+            {/* <button
 							className="absolute right-2 top-1/2 transform -translate-y-1/2
 						 bg-gray-800 text-white px-4 py-1 rounded-lg"
@@ -116,66 +116,66 @@
 							Избриши
 						</button> */}
-					</div>
+          </div>
 
-					{/* Course grid */}
+          {/* Course grid */}
 
-					{!isLoaded ? (
-						<div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-6">
-							{[...Array(9)].map((_, index) => (
-								<SkeletonCard key={index} />
-							))}
-						</div>
-					) : (
-						<SubjectList
-							filteredSubjects={filteredSubjects}
-							visibleCourses={visibleCourses}
-							openSubjectDetails={openSubjectDetails}
-						/>
-					)}
+          {!isLoaded ? (
+            <div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-6">
+              {[...Array(9)].map((_, index) => (
+                <SkeletonCard key={index} />
+              ))}
+            </div>
+          ) : (
+            <SubjectList
+              filteredSubjects={filteredSubjects}
+              visibleCourses={visibleCourses}
+              openSubjectDetails={openSubjectDetails}
+            />
+          )}
 
-					{/* Load more button */}
-					{isLoaded && filteredSubjects.length > visibleCourses && (
-						<div className="mt-5 text-center">
-							<button
-								onClick={loadMore}
-								className="bg-blue-600 hover:bg-blue-700 text-white px-6 py-2 rounded-lg font-medium transition-colors duration-200"
-							>
-								Погледни повеќе
-							</button>
-						</div>
-					)}
+          {/* Load more button */}
+          {isLoaded && filteredSubjects.length > visibleCourses && (
+            <div className="mt-5 text-center">
+              <button
+                onClick={loadMore}
+                className="bg-blue-600 hover:bg-blue-700 text-white px-6 py-2 rounded-lg font-medium transition-colors duration-200"
+              >
+                Погледни повеќе
+              </button>
+            </div>
+          )}
 
-					{/* No results message */}
-					{isLoaded && filteredSubjects.length === 0 && (
-						<div className="text-center py-12">
-							<p className="text-gray-500 text-lg">
-								Не постојат такви предмети
-							</p>
-							<button
-								onClick={() =>
-									resetFilters(
-										setSearchTerm,
-										setProfessorSearchTerm,
-										setAssistantSearchTerm,
-										setFilters
-									)
-								}
-								className="mt-2 text-blue-600 hover:text-blue-800"
-							>
-								Ресетирај филтри
-							</button>
-						</div>
-					)}
-				</div>
-			</div>
-			{showModal && selectedSubject && (
-				<SubjectModal
-					selectedSubject={selectedSubject}
-					closeModal={closeModal}
-					subjectPrerequisites={getSubjectPrerequisites()}
-				/>
-			)}
-		</div>
-	);
+          {/* No results message */}
+          {isLoaded && filteredSubjects.length === 0 && (
+            <div className="text-center py-12">
+              <p className="text-gray-500 text-lg">
+                Не постојат такви предмети
+              </p>
+              <button
+                onClick={() =>
+                  resetFilters(
+                    setSearchTerm,
+                    setProfessorSearchTerm,
+                    setAssistantSearchTerm,
+                    setFilters
+                  )
+                }
+                className="mt-2 text-blue-600 hover:text-blue-800"
+              >
+                Ресетирај филтри
+              </button>
+            </div>
+          )}
+        </div>
+      </div>
+      {showModal && selectedSubject && (
+        <SubjectModal
+          selectedSubject={selectedSubject}
+          closeModal={closeModal}
+          subjectPrerequisites={getSubjectPrerequisites()}
+        />
+      )}
+    </div>
+  );
 };
 
Index: frontend/src/components/SubjectCatalog/SubjectList.tsx
===================================================================
--- frontend/src/components/SubjectCatalog/SubjectList.tsx	(revision 9234fcaaf818682e491ea09e8d4b36486e54b30b)
+++ frontend/src/components/SubjectCatalog/SubjectList.tsx	(revision 997721a9d300fe4402e7f6db9e40cc1d4e69c783)
@@ -1,52 +1,52 @@
-import { Subject } from "./types";
+import { Subject } from "../types";
 
 interface SubjectListProps {
-	filteredSubjects: Subject[];
-	visibleCourses: number;
-	openSubjectDetails: (subject: Subject) => void;
+  filteredSubjects: Subject[];
+  visibleCourses: number;
+  openSubjectDetails: (subject: Subject) => void;
 }
 
 const SubjectList = ({
-	filteredSubjects,
-	visibleCourses,
-	openSubjectDetails,
+  filteredSubjects,
+  visibleCourses,
+  openSubjectDetails,
 }: SubjectListProps) => {
-	return (
-		<div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-6">
-			{filteredSubjects.slice(0, visibleCourses).map((subject) => (
-				<div
-					key={subject.id}
-					className="border border-gray-200 rounded-lg overflow-hidden shadow-sm 
+  return (
+    <div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-6">
+      {filteredSubjects.slice(0, visibleCourses).map((subject) => (
+        <div
+          key={subject.id}
+          className="border border-gray-200 rounded-lg overflow-hidden shadow-sm 
                                     hover:shadow-md transition-shadow duration-200"
-				>
-					<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>
+        >
+          <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>
 
-						{/* <p className="text-gray-700 text-sm mb-4 line-clamp-2">
+            {/* <p className="text-gray-700 text-sm mb-4 line-clamp-2">
 							{subject.abstract}
 						</p> */}
 
-						<div className="flex flex-wrap gap-2 mb-4">
-							{/* these tags are for listing the domains a subject covers, ex. backend, AI ...*/}
-							{["Web Development", "Machine Learning", "Data Science"].map(
-								(tag) => (
-									<span
-										key={tag}
-										className="bg-gray-100 text-gray-800 text-xs px-2 py-1 rounded"
-									>
-										{tag}
-									</span>
-								)
-							)}
-						</div>
+            <div className="flex flex-wrap gap-2 mb-4">
+              {/* these tags are for listing the domains a subject covers, ex. backend, AI ...*/}
+              {["Web Development", "Machine Learning", "Data Science"].map(
+                (tag) => (
+                  <span
+                    key={tag}
+                    className="bg-gray-100 text-gray-800 text-xs px-2 py-1 rounded"
+                  >
+                    {tag}
+                  </span>
+                )
+              )}
+            </div>
 
-						<div className="flex justify-end mt-auto">
-							{/* these tags could be used as certain flags for some subjects, like most picked subject, best match etc. */}
-							{/* <div className="flex gap-3">
+            <div className="flex justify-end mt-auto">
+              {/* these tags could be used as certain flags for some subjects, like most picked subject, best match etc. */}
+              {/* <div className="flex gap-3">
 								<div className="bg-red-500 px-1 py-1 rounded-full text-sm font-medium">
 									TAG1
@@ -56,17 +56,17 @@
 								</div>
 							</div> */}
-							<button
-								onClick={() => openSubjectDetails(subject)}
-								className="flex items-center text-sm text-gray-700 hover:text-gray-900"
-							>
-								<img src="src/assets/eye.svg" className="w-4 h-4 mr-1" />
-								Погледни детали
-							</button>
-						</div>
-					</div>
-				</div>
-			))}
-		</div>
-	);
+              <button
+                onClick={() => openSubjectDetails(subject)}
+                className="flex items-center text-sm text-gray-700 hover:text-gray-900"
+              >
+                <img src="src/assets/eye.svg" className="w-4 h-4 mr-1" />
+                Погледни детали
+              </button>
+            </div>
+          </div>
+        </div>
+      ))}
+    </div>
+  );
 };
 
Index: frontend/src/components/SubjectCatalog/SubjectModal.tsx
===================================================================
--- frontend/src/components/SubjectCatalog/SubjectModal.tsx	(revision 9234fcaaf818682e491ea09e8d4b36486e54b30b)
+++ frontend/src/components/SubjectCatalog/SubjectModal.tsx	(revision 997721a9d300fe4402e7f6db9e40cc1d4e69c783)
@@ -1,206 +1,206 @@
 import { useState } from "react";
-import { Subject } from "./types";
+import { Subject } from "../types";
 
 interface SubjectModalProps {
-	selectedSubject: Subject;
-	subjectPrerequisites: string[] | number | "Нема предуслов";
-	closeModal: () => void;
+  selectedSubject: Subject;
+  subjectPrerequisites: string[] | number | "Нема предуслов";
+  closeModal: () => void;
 }
 
 function SubjectModal({
-	selectedSubject,
-	closeModal,
-	subjectPrerequisites,
+  selectedSubject,
+  closeModal,
+  subjectPrerequisites,
 }: SubjectModalProps) {
-	const [isExpanded, setIsExpanded] = useState(false);
-
-	const WORD_LIMIT = 40;
-
-	const truncateText = (text: string) => {
-		if (!text) return "";
-		const words = text.split(/\s+/);
-		console.log(words.slice(0, WORD_LIMIT).join(" ") + "...");
-		return words.length <= WORD_LIMIT
-			? text
-			: words.slice(0, WORD_LIMIT).join(" ") + "...";
-	};
-
-	const canToggle = selectedSubject.abstract.split(/\s+/).length > WORD_LIMIT;
-	const abstractText = isExpanded
-		? selectedSubject.abstract
-		: truncateText(selectedSubject.abstract);
-	return (
-		<>
-			<div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50">
-				<div className="bg-white rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto">
-					<div className="p-6">
-						<div className="flex justify-between items-start mb-4">
-							<div>
-								<h2 className="text-2xl font-bold">{selectedSubject.name}</h2>
-								<p className="text-gray-600">{selectedSubject.code}</p>
-							</div>
-							<button
-								onClick={closeModal}
-								className="text-gray-400 hover:text-gray-600"
-							>
-								<svg
-									className="w-6 h-6"
-									fill="none"
-									stroke="currentColor"
-									viewBox="0 0 24 24"
-									xmlns="http://www.w3.org/2000/svg"
-								>
-									<path
-										strokeLinecap="round"
-										strokeLinejoin="round"
-										strokeWidth={2}
-										d="M6 18L18 6M6 6l12 12"
-									/>
-								</svg>
-							</button>
-						</div>
-
-						<div className="mb-4">
-							<span className="inline">
-								<span className="">{abstractText}</span>
-								{canToggle && (
-									<button
-										className="text-blue-500 hover:underline ml-1 inline"
-										onClick={() => setIsExpanded(!isExpanded)}
-									>
-										{isExpanded ? "Прочитај помалку" : "Прочитај повеќе"}
-									</button>
-								)}
-							</span>
-						</div>
-
-						<div className="mb-2">
-							<h3 className="text-lg font-medium">Професори:</h3>
-							<p>
-								{selectedSubject.info.professors.length == 0
-									? "Нема одредени професори"
-									: selectedSubject.info.professors.join(", ")}
-							</p>
-						</div>
-						<div className="mb-4">
-							<h3 className="text-lg font-medium">Асистенти:</h3>
-							<p>
-								{selectedSubject.info.assistants.length == 0
-									? "Нема одредени асистенти"
-									: selectedSubject.info.assistants.join(", ")}
-							</p>
-						</div>
-
-						<div className="bg-gray-50 rounded-lg p-4 mb-3">
-							<h3 className="text-lg font-medium mb-4">
-								Информации за предметот
-							</h3>
-
-							<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
-								<div>
-									<div className="flex items-center mb-3">
-										<div>
-											<p className="text-sm text-gray-500">
-												Препорачан семестар
-											</p>
-											<p className="font-medium">
-												{selectedSubject.info.semester}
-											</p>
-										</div>
-									</div>
-									<div className="flex items-center mb-3">
-										<div>
-											<p className="text-sm text-gray-500">Зимски / Летен</p>
-											<p className="font-medium">
-												{selectedSubject.info.season == "S"
-													? "Летен"
-													: "Зимски"}
-											</p>
-										</div>
-									</div>
-									<div className="flex items-center mb-3">
-										<div>
-											<p className="text-sm text-gray-500">Ниво</p>
-											<p className="font-medium">
-												L{selectedSubject.info.level}
-											</p>
-										</div>
-									</div>
-								</div>
-								<div>
-									<div className="flex items-center mb-3">
-										<div>
-											<p className="text-sm text-gray-500">Задолжителен за:</p>
-											<p className="font-medium">
-												{selectedSubject.info.mandatory_for.length == 0
-													? "Не е задолжителен предмет"
-													: selectedSubject.info.mandatory_for
-															.map((s) => s.replace(/\d+$/, ""))
-															.join(", ")}
-											</p>
-										</div>
-									</div>
-									<div className="flex items-center mb-3">
-										<div>
-											<p className="text-sm text-gray-500">Изборен за:</p>
-											<p className="font-medium">
-												{selectedSubject.info.elective_for.length == 0
-													? "Не е изборен предмет"
-													: selectedSubject.info.elective_for
-															.map((s) => s.replace(/\d+$/, ""))
-															.join(", ")}
-											</p>
-										</div>
-									</div>
-									<div className="flex items-center mb-3">
-										<div>
-											<p className="text-sm text-gray-500">Предуслови:</p>
-											<p className="font-medium">
-												{Array.isArray(subjectPrerequisites)
-													? subjectPrerequisites.join(" или ")
-													: typeof subjectPrerequisites === "number"
-													? `${subjectPrerequisites} кредити`
-													: subjectPrerequisites}
-											</p>
-										</div>
-									</div>
-								</div>
-							</div>
-						</div>
-						<div>
-							{selectedSubject.info.participants[0] == 0 ? (
-								<div className="bg-red-500 py-3 pl-2 rounded-md">
-									Овој предмет не бил активиран минатиот семестар.
-								</div>
-							) : (
-								<p>{`Овој предмет минатиот семестар бил запишан од
+  const [isExpanded, setIsExpanded] = useState(false);
+
+  const WORD_LIMIT = 40;
+
+  const truncateText = (text: string) => {
+    if (!text) return "";
+    const words = text.split(/\s+/);
+    console.log(words.slice(0, WORD_LIMIT).join(" ") + "...");
+    return words.length <= WORD_LIMIT
+      ? text
+      : words.slice(0, WORD_LIMIT).join(" ") + "...";
+  };
+
+  const canToggle = selectedSubject.abstract.split(/\s+/).length > WORD_LIMIT;
+  const abstractText = isExpanded
+    ? selectedSubject.abstract
+    : truncateText(selectedSubject.abstract);
+  return (
+    <>
+      <div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50">
+        <div className="bg-white rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto">
+          <div className="p-6">
+            <div className="flex justify-between items-start mb-4">
+              <div>
+                <h2 className="text-2xl font-bold">{selectedSubject.name}</h2>
+                <p className="text-gray-600">{selectedSubject.code}</p>
+              </div>
+              <button
+                onClick={closeModal}
+                className="text-gray-400 hover:text-gray-600"
+              >
+                <svg
+                  className="w-6 h-6"
+                  fill="none"
+                  stroke="currentColor"
+                  viewBox="0 0 24 24"
+                  xmlns="http://www.w3.org/2000/svg"
+                >
+                  <path
+                    strokeLinecap="round"
+                    strokeLinejoin="round"
+                    strokeWidth={2}
+                    d="M6 18L18 6M6 6l12 12"
+                  />
+                </svg>
+              </button>
+            </div>
+
+            <div className="mb-4">
+              <span className="inline">
+                <span className="">{abstractText}</span>
+                {canToggle && (
+                  <button
+                    className="text-blue-500 hover:underline ml-1 inline"
+                    onClick={() => setIsExpanded(!isExpanded)}
+                  >
+                    {isExpanded ? "Прочитај помалку" : "Прочитај повеќе"}
+                  </button>
+                )}
+              </span>
+            </div>
+
+            <div className="mb-2">
+              <h3 className="text-lg font-medium">Професори:</h3>
+              <p>
+                {selectedSubject.info.professors.length == 0
+                  ? "Нема одредени професори"
+                  : selectedSubject.info.professors.join(", ")}
+              </p>
+            </div>
+            <div className="mb-4">
+              <h3 className="text-lg font-medium">Асистенти:</h3>
+              <p>
+                {selectedSubject.info.assistants.length == 0
+                  ? "Нема одредени асистенти"
+                  : selectedSubject.info.assistants.join(", ")}
+              </p>
+            </div>
+
+            <div className="bg-gray-50 rounded-lg p-4 mb-3">
+              <h3 className="text-lg font-medium mb-4">
+                Информации за предметот
+              </h3>
+
+              <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
+                <div>
+                  <div className="flex items-center mb-3">
+                    <div>
+                      <p className="text-sm text-gray-500">
+                        Препорачан семестар
+                      </p>
+                      <p className="font-medium">
+                        {selectedSubject.info.semester}
+                      </p>
+                    </div>
+                  </div>
+                  <div className="flex items-center mb-3">
+                    <div>
+                      <p className="text-sm text-gray-500">Зимски / Летен</p>
+                      <p className="font-medium">
+                        {selectedSubject.info.season == "S"
+                          ? "Летен"
+                          : "Зимски"}
+                      </p>
+                    </div>
+                  </div>
+                  <div className="flex items-center mb-3">
+                    <div>
+                      <p className="text-sm text-gray-500">Ниво</p>
+                      <p className="font-medium">
+                        L{selectedSubject.info.level}
+                      </p>
+                    </div>
+                  </div>
+                </div>
+                <div>
+                  <div className="flex items-center mb-3">
+                    <div>
+                      <p className="text-sm text-gray-500">Задолжителен за:</p>
+                      <p className="font-medium">
+                        {selectedSubject.info.mandatory_for.length == 0
+                          ? "Не е задолжителен предмет"
+                          : selectedSubject.info.mandatory_for
+                              .map((s) => s.replace(/\d+$/, ""))
+                              .join(", ")}
+                      </p>
+                    </div>
+                  </div>
+                  <div className="flex items-center mb-3">
+                    <div>
+                      <p className="text-sm text-gray-500">Изборен за:</p>
+                      <p className="font-medium">
+                        {selectedSubject.info.elective_for.length == 0
+                          ? "Не е изборен предмет"
+                          : selectedSubject.info.elective_for
+                              .map((s) => s.replace(/\d+$/, ""))
+                              .join(", ")}
+                      </p>
+                    </div>
+                  </div>
+                  <div className="flex items-center mb-3">
+                    <div>
+                      <p className="text-sm text-gray-500">Предуслови:</p>
+                      <p className="font-medium">
+                        {Array.isArray(subjectPrerequisites)
+                          ? subjectPrerequisites.join(" или ")
+                          : typeof subjectPrerequisites === "number"
+                          ? `${subjectPrerequisites} кредити`
+                          : subjectPrerequisites}
+                      </p>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div>
+              {selectedSubject.info.participants[0] == 0 ? (
+                <div className="bg-red-500 py-3 pl-2 rounded-md">
+                  Овој предмет не бил активиран минатиот семестар.
+                </div>
+              ) : (
+                <p>{`Овој предмет минатиот семестар бил запишан од
 									${selectedSubject.info.participants[0]} студенти.`}</p>
-							)}
-						</div>
-						<div className="mt-6">
-							<h3 className="text-lg font-medium mb-2">Тагови</h3>
-							<div className="flex flex-wrap gap-2">
-								{/* TODO: change this when real tags are added in the database*/}
-								{["Web Development", "Machine Learning", "Data Science"].map(
-									(tag) => (
-										<span
-											key={tag}
-											className="bg-gray-100 text-gray-800 px-3 py-1 rounded-full"
-										>
-											{tag}
-										</span>
-									)
-								)}
-							</div>
-						</div>
-
-						<div className="mt-8 flex justify-end space-x-3">
-							<button
-								onClick={closeModal}
-								className="px-4 py-2 border border-gray-300 rounded-lg text-gray-700 hover:bg-gray-50"
-							>
-								Затвори
-							</button>
-							{/* <button
+              )}
+            </div>
+            <div className="mt-6">
+              <h3 className="text-lg font-medium mb-2">Тагови</h3>
+              <div className="flex flex-wrap gap-2">
+                {/* TODO: change this when real tags are added in the database*/}
+                {["Web Development", "Machine Learning", "Data Science"].map(
+                  (tag) => (
+                    <span
+                      key={tag}
+                      className="bg-gray-100 text-gray-800 px-3 py-1 rounded-full"
+                    >
+                      {tag}
+                    </span>
+                  )
+                )}
+              </div>
+            </div>
+
+            <div className="mt-8 flex justify-end space-x-3">
+              <button
+                onClick={closeModal}
+                className="px-4 py-2 border border-gray-300 rounded-lg text-gray-700 hover:bg-gray-50"
+              >
+                Затвори
+              </button>
+              {/* <button
 									onClick={closeModal}
 									className="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700"
@@ -208,10 +208,10 @@
 									Погледни детали
 								</button> */}
-						</div>
-					</div>
-				</div>
-			</div>
-		</>
-	);
+            </div>
+          </div>
+        </div>
+      </div>
+    </>
+  );
 }
 export default SubjectModal;
Index: ontend/src/components/SubjectCatalog/types.ts
===================================================================
--- frontend/src/components/SubjectCatalog/types.ts	(revision 9234fcaaf818682e491ea09e8d4b36486e54b30b)
+++ 	(revision )
@@ -1,55 +1,0 @@
-import { PROGRAMS } from "../../constants/subjects";
-
-export interface Subject {
-  id: number;
-  code: string;
-  name: string;
-  abstract: string;
-  info: SubjectInfo;
-}
-
-type Prerequisite =
-  | { subjects: number[] }
-  | { credits: number }
-  | Record<string, never>;
-
-export interface SubjectInfo {
-  level: number;
-  short: string;
-  prerequisite: Prerequisite;
-  activated: boolean;
-  participants: number[];
-  mandatory: boolean;
-  mandatory_for: Programs[];
-  semester: number;
-  season: string;
-  elective_for: Programs[];
-  professors: string[];
-  assistants: string[];
-}
-
-export type Filters = {
-  season: "W" | "S" | "";
-  semester: number[];
-  level: number[];
-  activated: "activated" | "not_activated" | "";
-  mandatoryFor: Programs[];
-  electiveFor: Programs[];
-  professors: string[];
-  assistants: string[];
-  hasPrerequisites: boolean;
-};
-
-export type Programs = (typeof PROGRAMS)[number];
-
-export interface LoginData {
-  email: string;
-  password: string;
-}
-
-export interface RegisterData {
-  email: string;
-  password: string;
-  fullName: string;
-  confirmPassword?: string;
-}
Index: frontend/src/components/SubjectCatalog/utils.ts
===================================================================
--- frontend/src/components/SubjectCatalog/utils.ts	(revision 9234fcaaf818682e491ea09e8d4b36486e54b30b)
+++ frontend/src/components/SubjectCatalog/utils.ts	(revision 997721a9d300fe4402e7f6db9e40cc1d4e69c783)
@@ -1,138 +1,138 @@
-import { Filters, Programs, Subject } from "./types";
+import { Filters, Programs, Subject } from "../types";
 
 interface filteredSubjectsParams {
-	subjectData: Subject[];
-	searchTerm: string;
-	professorSearchTerm: string;
-	assistantSearchTerm: string;
-	filters: {
-		season: "W" | "S" | "";
-		semester: number[];
-		level: number[];
-		activated: "activated" | "not_activated" | "";
-		mandatoryFor: Programs[];
-		electiveFor: Programs[];
-		professors: string[];
-		assistants: string[];
-		hasPrerequisites: boolean;
-	};
+  subjectData: Subject[];
+  searchTerm: string;
+  professorSearchTerm: string;
+  assistantSearchTerm: string;
+  filters: {
+    season: "W" | "S" | "";
+    semester: number[];
+    level: number[];
+    activated: "activated" | "not_activated" | "";
+    mandatoryFor: Programs[];
+    electiveFor: Programs[];
+    professors: string[];
+    assistants: string[];
+    hasPrerequisites: boolean;
+  };
 }
 
 export const filterSubjects = ({
-	subjectData,
-	searchTerm,
-	professorSearchTerm,
-	assistantSearchTerm,
-	filters,
+  subjectData,
+  searchTerm,
+  professorSearchTerm,
+  assistantSearchTerm,
+  filters,
 }: filteredSubjectsParams) =>
-	subjectData.filter((subject) => {
-		const searchMatches =
-			subject.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
-			subject.code.toLowerCase().includes(searchTerm.toLowerCase()) ||
-			subject.abstract?.toLowerCase().includes(searchTerm.toLowerCase());
+  subjectData.filter((subject) => {
+    const searchMatches =
+      subject.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
+      subject.code.toLowerCase().includes(searchTerm.toLowerCase()) ||
+      subject.abstract?.toLowerCase().includes(searchTerm.toLowerCase());
 
-		const seasonMatches =
-			filters.season === "" || filters.season === subject.info.season;
+    const seasonMatches =
+      filters.season === "" || filters.season === subject.info.season;
 
-		const semesterMatches =
-			filters.semester.length === 0 ||
-			filters.semester.includes(subject.info.semester);
+    const semesterMatches =
+      filters.semester.length === 0 ||
+      filters.semester.includes(subject.info.semester);
 
-		const levelMatches =
-			filters.level.length === 0 || filters.level.includes(subject.info.level);
+    const levelMatches =
+      filters.level.length === 0 || filters.level.includes(subject.info.level);
 
-		const activatedMatches =
-			filters.activated == "" ||
-			(filters.activated == "activated" && subject.info.activated) ||
-			(filters.activated == "not_activated" && !subject.info.activated);
+    const activatedMatches =
+      filters.activated == "" ||
+      (filters.activated == "activated" && subject.info.activated) ||
+      (filters.activated == "not_activated" && !subject.info.activated);
 
-		const mandatoryMatches =
-			filters.mandatoryFor.length === 0 ||
-			subject.info.mandatory_for.some((item) =>
-				filters.mandatoryFor.includes(item)
-			);
+    const mandatoryMatches =
+      filters.mandatoryFor.length === 0 ||
+      subject.info.mandatory_for.some((item) =>
+        filters.mandatoryFor.includes(item)
+      );
 
-		const electiveMatches =
-			filters.electiveFor.length === 0 ||
-			subject.info.elective_for.some((item) =>
-				filters.electiveFor.includes(item)
-			);
+    const electiveMatches =
+      filters.electiveFor.length === 0 ||
+      subject.info.elective_for.some((item) =>
+        filters.electiveFor.includes(item)
+      );
 
-		const professorsMatches =
-			professorSearchTerm == "" ||
-			subject.info.professors.some((item) =>
-				item.toLowerCase().includes(professorSearchTerm.toLowerCase())
-			);
+    const professorsMatches =
+      professorSearchTerm == "" ||
+      subject.info.professors.some((item) =>
+        item.toLowerCase().includes(professorSearchTerm.toLowerCase())
+      );
 
-		const assistantsMatches =
-			assistantSearchTerm == "" ||
-			subject.info.assistants.some((item) =>
-				item.toLowerCase().includes(assistantSearchTerm.toLowerCase())
-			);
+    const assistantsMatches =
+      assistantSearchTerm == "" ||
+      subject.info.assistants.some((item) =>
+        item.toLowerCase().includes(assistantSearchTerm.toLowerCase())
+      );
 
-		const prerequisitesMatch =
-			!filters.hasPrerequisites || subject.info.prerequisite == "";
+    const prerequisitesMatch =
+      !filters.hasPrerequisites || subject.info.prerequisite == "";
 
-		return (
-			searchMatches &&
-			seasonMatches &&
-			semesterMatches &&
-			levelMatches &&
-			activatedMatches &&
-			mandatoryMatches &&
-			electiveMatches &&
-			professorsMatches &&
-			assistantsMatches &&
-			prerequisitesMatch
-		);
-	});
+    return (
+      searchMatches &&
+      seasonMatches &&
+      semesterMatches &&
+      levelMatches &&
+      activatedMatches &&
+      mandatoryMatches &&
+      electiveMatches &&
+      professorsMatches &&
+      assistantsMatches &&
+      prerequisitesMatch
+    );
+  });
 
 export const resetFilters = (
-	setSearchTerm: (val: string) => void,
-	setProfessorSearchTerm: (val: string) => void,
-	setAssistantSearchTerm: (val: string) => void,
-	setFilters: (val: (prev: Filters) => Filters) => void
+  setSearchTerm: (val: string) => void,
+  setProfessorSearchTerm: (val: string) => void,
+  setAssistantSearchTerm: (val: string) => void,
+  setFilters: (val: (prev: Filters) => Filters) => void
 ) => {
-	setSearchTerm("");
-	setProfessorSearchTerm("");
-	setAssistantSearchTerm("");
-	setFilters(() => ({
-		season: "",
-		semester: [],
-		level: [],
-		activated: "",
-		mandatoryFor: [],
-		electiveFor: [],
-		professors: [],
-		assistants: [],
-		hasPrerequisites: false,
-	}));
+  setSearchTerm("");
+  setProfessorSearchTerm("");
+  setAssistantSearchTerm("");
+  setFilters(() => ({
+    season: "",
+    semester: [],
+    level: [],
+    activated: "",
+    mandatoryFor: [],
+    electiveFor: [],
+    professors: [],
+    assistants: [],
+    hasPrerequisites: false,
+  }));
 };
 
 export const getRandomStaff = (
-	subjectData: Subject[],
-	setRandomStaff: ([]: string[]) => void
+  subjectData: Subject[],
+  setRandomStaff: ([]: string[]) => void
 ) => {
-	if (subjectData.length == 0) return;
-	const getRandomProfessor = () => {
-		const randomSubject1 =
-			subjectData[Math.floor(Math.random() * subjectData.length)];
-		return randomSubject1?.info.professors[
-			Math.floor(Math.random() * randomSubject1.info.professors.length)
-		];
-	};
-	const getRandomAssistant = () => {
-		const randomSubject2 =
-			subjectData[Math.floor(Math.random() * subjectData.length)];
-		return randomSubject2?.info.assistants[
-			Math.floor(Math.random() * randomSubject2.info.assistants.length)
-		];
-	};
-	let randomProfessor = "";
-	let randomAssistant = "";
+  if (subjectData.length == 0) return;
+  const getRandomProfessor = () => {
+    const randomSubject1 =
+      subjectData[Math.floor(Math.random() * subjectData.length)];
+    return randomSubject1?.info.professors[
+      Math.floor(Math.random() * randomSubject1.info.professors.length)
+    ];
+  };
+  const getRandomAssistant = () => {
+    const randomSubject2 =
+      subjectData[Math.floor(Math.random() * subjectData.length)];
+    return randomSubject2?.info.assistants[
+      Math.floor(Math.random() * randomSubject2.info.assistants.length)
+    ];
+  };
+  let randomProfessor = "";
+  let randomAssistant = "";
 
-	while (!randomProfessor) randomProfessor = getRandomProfessor();
-	while (!randomAssistant) randomAssistant = getRandomAssistant();
+  while (!randomProfessor) randomProfessor = getRandomProfessor();
+  while (!randomAssistant) randomAssistant = getRandomAssistant();
 
-	setRandomStaff([randomProfessor, randomAssistant]);
+  setRandomStaff([randomProfessor, randomAssistant]);
 };
Index: frontend/src/pages/Login.tsx
===================================================================
--- frontend/src/pages/Login.tsx	(revision 9234fcaaf818682e491ea09e8d4b36486e54b30b)
+++ frontend/src/pages/Login.tsx	(revision 997721a9d300fe4402e7f6db9e40cc1d4e69c783)
@@ -2,91 +2,100 @@
 import React, { useState } from "react";
 import { useNavigate } from "react-router-dom";
+import PasswordInput from "../components/PasswordInput";
 
 interface LoginForm {
-	email: string;
-	password: string;
+  email: string;
+  password: string;
 }
 
 const Login: React.FC = () => {
-	const [formData, setFormData] = useState<LoginForm>({
-		email: "",
-		password: "",
-	});
-	const [error, setError] = useState<string | null>(null);
-	const navigate = useNavigate();
+  const [formData, setFormData] = useState<LoginForm>({
+    email: "",
+    password: "",
+  });
+  const [errors, setErrors] = useState<
+    Partial<LoginForm> & { detail?: string[] }
+  >({});
+  const navigate = useNavigate();
 
-	const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
-		setFormData({
-			...formData,
-			[e.target.name]: e.target.value,
-		});
-	};
+  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+    setFormData({
+      ...formData,
+      [e.target.name]: e.target.value,
+    });
+  };
 
-	const handleLogin = async (e: React.FormEvent) => {
-		e.preventDefault();
-		setError(null);
+  const handleLogin = async (e: React.FormEvent) => {
+    e.preventDefault();
+    setErrors({});
 
-		try {
-			console.log(formData);
-			const response = await axios
-				.post("http://localhost:8000/auth/login/", {
-					email: formData.email,
-					password: formData.password,
-				})
-				.catch((error: AxiosError) => {
-					console.error(
-						"Registration failed:",
-						error.response?.data || error.message
-					);
-					setError(
-						error.response?.data?.error ||
-							"Registration failed. Please try again."
-					);
-				});
-			// property data does not exist on type 'void'?
-			const token = response.data.token;
-			localStorage.setItem("token", token);
+    try {
+      const response = await axios.post<{ token: string }>(
+        "http://localhost:8000/auth/login/",
+        {
+          email: formData.email,
+          password: formData.password,
+        }
+      );
+      const token = response.data.token;
+      localStorage.setItem("token", token);
+      navigate("/");
+    } catch (err: unknown) {
+      const axiosError = err as AxiosError<{
+        [key: string]: string[] | string;
+      }>;
+      console.log("Error response data:", axiosError.response?.data);
 
-			navigate("/");
-			// ovde ne znam sto so err i any da pravam :()
-		} catch (err: AxiosError) {
-			setError("Login failed. Please try again.");
-		}
-	};
-	return (
-		<div className="flex flex-col items-center justify-center h-screen bg-gray-50">
-			<form
-				onSubmit={handleLogin}
-				className="bg-white p-6 rounded-lg shadow-md w-80"
-			>
-				<h2 className="text-xl font-semibold mb-4 text-center">Login</h2>
-				{error && <div className="text-red-500 mb-3 text-sm">{error}</div>}
-				<input
-					type="email"
-					name="email"
-					required
-					value={formData.email}
-					onChange={handleChange}
-					placeholder="Email"
-					className="w-full mb-3 p-2 border rounded"
-				/>
-				<input
-					type="password"
-					name="password"
-					required
-					value={formData.password}
-					onChange={handleChange}
-					placeholder="Password"
-					className="w-full mb-3 p-2 border rounded"
-				/>
-				<button
-					type="submit"
-					className="w-full bg-blue-500 text-white p-2 rounded hover:bg-blue-600"
-				>
-					Login
-				</button>
-			</form>
-		</div>
-	);
+      if (axiosError.response && axiosError.response.data) {
+        const errorData = axiosError.response.data;
+        const normalizedErrors: { [key: string]: string[] } = {};
+        Object.entries(errorData).forEach(([field, message]) => {
+          normalizedErrors[field] = Array.isArray(message)
+            ? message
+            : [message];
+        });
+        setErrors(normalizedErrors);
+      } else {
+        setErrors({ detail: ["An unknown error occurred."] });
+      }
+    }
+  };
+  return (
+    <div className="flex flex-col items-center justify-center h-screen bg-gray-50">
+      <form
+        onSubmit={handleLogin}
+        className="bg-white p-6 rounded-lg shadow-md w-80"
+      >
+        <h2 className="text-xl font-semibold mb-4 text-center">Login</h2>
+        {errors.detail && (
+          <div className="text-red-500 mb-3 text-sm">{errors.detail[0]}.</div>
+        )}
+        <input
+          type="email"
+          name="email"
+          required
+          value={formData.email}
+          onChange={handleChange}
+          placeholder="Email"
+          className="w-full mb-3 p-2 border rounded"
+        />
+        {errors.email && (
+          <p className="text-red-500 text-sm mb-2">{errors.email[0]}</p>
+        )}
+        <PasswordInput
+          name="password"
+          value={formData.password}
+          onChange={handleChange}
+          error={errors.password ? errors.password[0] : undefined}
+        />
+        <button
+          type="submit"
+          className="w-full bg-blue-500 text-white p-2 rounded hover:bg-blue-600"
+        >
+          Login
+        </button>
+      </form>
+    </div>
+  );
 };
 
Index: frontend/src/pages/Register.tsx
===================================================================
--- frontend/src/pages/Register.tsx	(revision 9234fcaaf818682e491ea09e8d4b36486e54b30b)
+++ frontend/src/pages/Register.tsx	(revision 997721a9d300fe4402e7f6db9e40cc1d4e69c783)
@@ -1,5 +1,6 @@
 import React, { useState } from "react";
-import axios from "axios";
+import axios, { AxiosError } from "axios";
 import { useNavigate } from "react-router-dom";
+import PasswordInput from "../components/PasswordInput";
 
 interface RegisterForm {
@@ -18,5 +19,7 @@
   });
   const [loading, setLoading] = useState(false);
-  const [error, setError] = useState<string | null>(null);
+  const [errors, setErrors] = useState<
+    Partial<RegisterForm> & { non_field_errors?: string[] }
+  >({});
   const navigate = useNavigate();
 
@@ -30,42 +33,39 @@
   const handleRegister = async (e: React.FormEvent) => {
     e.preventDefault();
-    setError(null);
+    setErrors({});
     setLoading(true);
-
-    if (formData.password !== formData.confirmPassword) {
-      setError("Passwords do not match.");
-      setLoading(false);
-      return;
-    }
 
     try {
       console.log(formData);
-      const response = await axios
-        .post("http://localhost:8000/auth/register/", {
+      const response = await axios.post(
+        "http://localhost:8000/auth/register/",
+        {
           email: formData.email,
           password: formData.password,
           confirm_password: formData.confirmPassword,
           full_name: formData.fullName,
-        })
-        .catch((error) => {
-          console.error(
-            "Registration failed:",
-            error.response?.data || error.message
-          );
-          setError(
-            error.response?.data?.error ||
-              "Registration failed. Please try again."
-          );
-        });
-        // property data does not exist on type 'void'?
+        }
+      );
+
       const { token, userType } = response.data;
-
       localStorage.setItem("token", token);
       localStorage.setItem("userType", userType);
-
       navigate("/");
-      // ovde ne znam sto so err i any da pravam :()
-    } catch (err: any) {
-      setError("Registration failed. Please try again.");
+    } catch (err: unknown) {
+      const axiosError = err as AxiosError<{
+        [key: string]: string[] | string;
+      }>;
+      if (axiosError.response && axiosError.response.data) {
+        const errorData = axiosError.response.data;
+        const normalizedErrors: { [key: string]: string[] } = {};
+        Object.entries(errorData).forEach(([field, message]) => {
+          normalizedErrors[field] = Array.isArray(message)
+            ? message
+            : [message];
+        });
+        setErrors(normalizedErrors);
+      } else {
+        setErrors({ non_field_errors: ["An unexpected error occurred."] });
+      }
     } finally {
       setLoading(false);
@@ -79,5 +79,9 @@
       >
         <h2 className="text-xl font-semibold mb-4 text-center">Register</h2>
-        {error && <div className="text-red-500 mb-3 text-sm">{error}</div>}
+        {errors.non_field_errors && (
+          <div className="text-red-500 mb-3 text-sm">
+            {errors.non_field_errors[0]}
+          </div>
+        )}
         <input
           type="email"
@@ -89,21 +93,17 @@
           className="w-full mb-3 p-2 border rounded"
         />
-        <input
-          type="password"
+        {errors.email && (
+          <p className="text-red-500 text-sm mb-2">{errors.email[0]}</p>
+        )}
+        <PasswordInput
           name="password"
-          required
           value={formData.password}
           onChange={handleChange}
-          placeholder="Password"
-          className="w-full mb-3 p-2 border rounded"
+          error={errors.password ? errors.password[0] : undefined}
         />
-        <input
-          type="password"
+        <PasswordInput
           name="confirmPassword"
-          required
-          value={formData.confirmPassword}
+          value={formData.password}
           onChange={handleChange}
-          placeholder="Confirm Password"
-          className="w-full mb-3 p-2 border rounded"
         />
         <input
