Index: backend/requirements.txt
===================================================================
--- backend/requirements.txt	(revision 74a3ebcd0dae1a0baa744b0bb598de6a6da46fda)
+++ backend/requirements.txt	(revision 2df0abec99f7defe9005e18d19f6afddde172463)
@@ -13,4 +13,4 @@
 psycopg2-binary>=2.9.10
 dj-rest-auth>=7.0.1
-django-allauth>=65.9.0
+django-allauth==65.3.0
 cryptography>=45.0.4
Index: frontend/src/components/Navbar.tsx
===================================================================
--- frontend/src/components/Navbar.tsx	(revision 74a3ebcd0dae1a0baa744b0bb598de6a6da46fda)
+++ frontend/src/components/Navbar.tsx	(revision 2df0abec99f7defe9005e18d19f6afddde172463)
@@ -1,4 +1,2 @@
-import { useGoogleLogin } from "@react-oauth/google";
-import axios from "axios";
 import { useEffect, useRef, useState } from "react";
 import { Link, useNavigate } from "react-router-dom";
@@ -13,5 +11,4 @@
 	const [profileMenuOpen, setProfileMenuOpen] = useState(false);
 	const [, setRecommendations] = useRecommendations();
-	const { login } = useAuth();
 	const { isAuthenticated, logout, user } = useAuth();
 	const { setFavoriteIds, setLikedIds, setDislikedIds } = usePreferences();
@@ -44,30 +41,4 @@
 		toast.success("Успешно сте одјавени!");
 	};
-
-	const googleLogin = useGoogleLogin({
-		onSuccess: async (tokenResponse) => {
-			const accessToken = tokenResponse.access_token;
-			try {
-				const response = await axios.post<{
-					access: string;
-					refresh: string;
-					full_name: string;
-					user_type: string;
-				}>("http://localhost:8000/auth/google/login/", {
-					access_token: accessToken,
-				});
-				const { access, refresh, full_name, user_type } = response.data;
-				login(access, refresh, { full_name, user_type });
-				navigate("/");
-				toast.success("Успешно сте најавени!");
-			} catch (err: any) {
-				console.error("Login failed:", err.response?.data || err.message);
-			}
-		},
-		onError: () => {
-			console.error("Login Failed");
-		},
-		flow: "implicit",
-	});
 
 	// const testAccountLogin = async () => {
@@ -186,7 +157,4 @@
 					)}
 				</div>
-				<div>
-					<button onClick={() => googleLogin()}>Login with google</button>
-				</div>
 			</div>
 
Index: frontend/src/components/PasswordInput.tsx
===================================================================
--- frontend/src/components/PasswordInput.tsx	(revision 74a3ebcd0dae1a0baa744b0bb598de6a6da46fda)
+++ frontend/src/components/PasswordInput.tsx	(revision 2df0abec99f7defe9005e18d19f6afddde172463)
@@ -1,52 +1,52 @@
 import { useState } from "react";
+import eyeOffIcon from "../assets/eye-off.svg";
 import eyeIcon from "../assets/eye.svg";
-import eyeOffIcon from "../assets/eye-off.svg";
 
 interface PasswordInputProps {
-  name: string;
-  value: string;
-  placeholder: string;
-  onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
-  error?: string;
+	name: string;
+	value: string;
+	placeholder: string;
+	onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
+	error?: string;
 }
 
 const PasswordInput: React.FC<PasswordInputProps> = ({
-  name,
-  value,
-  placeholder,
-  onChange,
-  error,
+	name,
+	value,
+	placeholder,
+	onChange,
+	error,
 }) => {
-  const [showPassword, setShowPassword] = useState(false);
+	const [showPassword, setShowPassword] = useState(false);
 
-  const togglePasswordVisibility = () => {
-    setShowPassword(!showPassword);
-  };
+	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={placeholder}
-        required
-      />
-      <button
-        type="button"
-        onClick={togglePasswordVisibility}
-        className="absolute right-2 top-1/2 transform -translate-y-1/2 flex items-center justify-center pb-2"
-      >
-        <img
-          src={showPassword ? eyeOffIcon : eyeIcon}
-          alt={showPassword ? "Hide password" : "Show password"}
-          className="w-5 h-5"
-        />
-      </button>
-      {error && <p className="text-red-500 text-sm mb-2">{error}</p>}
-    </div>
-  );
+	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={placeholder}
+				required
+			/>
+			<button
+				type="button"
+				onClick={togglePasswordVisibility}
+				className="absolute right-2 top-1/2 transform -translate-y-1/2 flex items-center justify-center pb-2"
+			>
+				<img
+					src={showPassword ? eyeOffIcon : eyeIcon}
+					alt={showPassword ? "Hide password" : "Show password"}
+					className="w-5 h-5"
+				/>
+			</button>
+			{error && <p className="text-red-500 text-sm mb-2">{error}</p>}
+		</div>
+	);
 };
 
Index: frontend/src/context/AuthContext.tsx
===================================================================
--- frontend/src/context/AuthContext.tsx	(revision 74a3ebcd0dae1a0baa744b0bb598de6a6da46fda)
+++ frontend/src/context/AuthContext.tsx	(revision 2df0abec99f7defe9005e18d19f6afddde172463)
@@ -1,2 +1,3 @@
+import { OverridableTokenClientConfig } from "@react-oauth/google";
 import { createContext, Dispatch, SetStateAction } from "react";
 import { StudentData } from "../components/types";
@@ -17,4 +18,8 @@
 	sessionInitialized: boolean;
 	setUser: Dispatch<SetStateAction<User | null>>;
+	customGoogleLogin: (
+		overrideConfig?: OverridableTokenClientConfig | undefined
+	) => void;
+	googleLoginLoading: boolean;
 }
 
Index: frontend/src/context/AuthProvider.tsx
===================================================================
--- frontend/src/context/AuthProvider.tsx	(revision 74a3ebcd0dae1a0baa744b0bb598de6a6da46fda)
+++ frontend/src/context/AuthProvider.tsx	(revision 2df0abec99f7defe9005e18d19f6afddde172463)
@@ -1,3 +1,4 @@
-import { AxiosError, AxiosRequestConfig } from "axios";
+import { useGoogleLogin } from "@react-oauth/google";
+import axios, { AxiosError, AxiosRequestConfig } from "axios";
 import { jwtDecode } from "jwt-decode";
 import React, {
@@ -52,4 +53,5 @@
 	const [loading, setLoading] = useState(true);
 	const [sessionInitialized, setSessionInitialized] = useState(false);
+	const [googleLoginLoading, setGoogleLoginLoading] = useState(false);
 
 	const proactiveRefreshTimeoutId = useRef<number | null>(null);
@@ -212,4 +214,36 @@
 	);
 
+	const customGoogleLogin = useGoogleLogin({
+		onSuccess: async (tokenResponse) => {
+			setGoogleLoginLoading(true);
+			const accessToken = tokenResponse.access_token;
+			try {
+				const response = await axios.post<{
+					access: string;
+					refresh: string;
+					full_name: string;
+					user_type: string;
+				}>("http://localhost:8000/auth/google/login/", {
+					access_token: accessToken,
+				});
+				const { access, refresh, full_name, user_type } = response.data;
+				await login(access, refresh, { full_name, user_type });
+				toast.success("Успешно сте најавени!");
+				window.dispatchEvent(new CustomEvent("googleLoginSuccess"));
+			} catch (err: any) {
+				console.error("Login failed:", err.response?.data || err.message);
+				toast.error("Грешка при најавување со Google");
+			} finally {
+				setGoogleLoginLoading(false);
+			}
+		},
+		onError: () => {
+			console.error("Login Failed");
+			setGoogleLoginLoading(false);
+			toast.error("Грешка при најавување со Google");
+		},
+		flow: "implicit",
+	});
+
 	useEffect(() => {
 		(async () => {
@@ -234,4 +268,6 @@
 		sessionInitialized,
 		setUser,
+		customGoogleLogin,
+		googleLoginLoading,
 	};
 
Index: frontend/src/pages/Login.tsx
===================================================================
--- frontend/src/pages/Login.tsx	(revision 74a3ebcd0dae1a0baa744b0bb598de6a6da46fda)
+++ frontend/src/pages/Login.tsx	(revision 2df0abec99f7defe9005e18d19f6afddde172463)
@@ -1,6 +1,7 @@
 import axios, { AxiosError } from "axios";
-import React, { useState } from "react";
+import React, { useEffect, useState } from "react";
 import { Link, useNavigate } from "react-router-dom";
 import { toast } from "react-toastify";
+import googleLogo from "../assets/google-logo.png";
 import PasswordInput from "../components/PasswordInput";
 import { useAuth } from "../hooks/useAuth";
@@ -20,6 +21,21 @@
 	>({});
 	const navigate = useNavigate();
-	const { login } = useAuth();
+	const { login, customGoogleLogin, googleLoginLoading } = useAuth();
 	const [isLogging, setIsLogging] = useState(false);
+
+	useEffect(() => {
+		const handleGoogleLoginSuccess = () => {
+			navigate("/");
+		};
+
+		window.addEventListener("googleLoginSuccess", handleGoogleLoginSuccess);
+
+		return () => {
+			window.removeEventListener(
+				"googleLoginSuccess",
+				handleGoogleLoginSuccess
+			);
+		};
+	}, [navigate]);
 
 	const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
@@ -70,12 +86,16 @@
 	};
 	return (
-		<div className="flex flex-col items-center justify-center h-[83vh] bg-white">
+		<div className="flex flex-col items-center justify-center min-h-[83vh] py-4 px-4 bg-white">
 			<form
 				onSubmit={handleLogin}
-				className="bg-white p-6 rounded-lg shadow-md w-80"
+				className="bg-white p-4 sm:p-6 rounded-lg shadow-md w-full max-w-sm"
 			>
-				<h2 className="text-xl font-semibold mb-4 text-center">Најава</h2>
+				<h2 className="text-xl font-semibold mb-3 sm:mb-4 text-center">
+					Најава
+				</h2>
 				{errors.detail && (
-					<div className="text-red-500 mb-3 text-sm">{errors.detail[0]}.</div>
+					<div className="text-red-500 mb-2 sm:mb-3 text-sm">
+						{errors.detail[0]}.
+					</div>
 				)}
 				<input
@@ -86,8 +106,8 @@
 					onChange={handleChange}
 					placeholder="Email"
-					className="w-full mb-3 p-2 border rounded"
+					className="w-full mb-2 sm:mb-3 p-2 border rounded"
 				/>
 				{errors.email && (
-					<p className="text-red-500 text-sm mb-2">{errors.email[0]}</p>
+					<p className="text-red-500 text-sm mb-1 sm:mb-2">{errors.email[0]}</p>
 				)}
 				<PasswordInput
@@ -98,5 +118,5 @@
 					error={errors.password ? errors.password[0] : undefined}
 				/>
-				<p className="mb-4 text-sm text-center">
+				<p className="mb-3 sm:mb-4 text-sm text-center">
 					Немаш профил?{" "}
 					<Link to="/register" className="text-blue-500 hover:underline">
@@ -111,4 +131,27 @@
 					{isLogging ? "Се најавува..." : "Најави се"}
 				</button>
+
+				<div className="mt-3 sm:mt-4 text-center">
+					<div className="relative">
+						<div className="absolute inset-0 flex items-center">
+							<div className="w-full border-t border-gray-300" />
+						</div>
+						<div className="relative flex justify-center text-sm">
+							<span className="px-2 bg-white text-gray-500">или</span>
+						</div>
+					</div>
+				</div>
+
+				<button
+					type="button"
+					onClick={() => customGoogleLogin()}
+					disabled={googleLoginLoading}
+					className={`w-full mt-3 sm:mt-4 bg-white border border-gray-300 text-gray-700 p-2 rounded hover:bg-gray-50 flex items-center justify-center gap-2 ${
+						googleLoginLoading ? "opacity-70 cursor-not-allowed" : ""
+					}`}
+				>
+					<img src={googleLogo} alt="Google logo" className="w-5 h-5" />
+					{googleLoginLoading ? "Се најавува..." : "Продолжи со Google"}
+				</button>
 			</form>
 		</div>
Index: frontend/src/pages/Register.tsx
===================================================================
--- frontend/src/pages/Register.tsx	(revision 74a3ebcd0dae1a0baa744b0bb598de6a6da46fda)
+++ frontend/src/pages/Register.tsx	(revision 2df0abec99f7defe9005e18d19f6afddde172463)
@@ -1,6 +1,7 @@
 import axios, { AxiosError } from "axios";
-import React, { useState } from "react";
+import React, { useEffect, useState } from "react";
 import { Link, useNavigate } from "react-router-dom";
 import { toast } from "react-toastify";
+import googleLogo from "../assets/google-logo.png";
 import PasswordInput from "../components/PasswordInput";
 import { User } from "../context/AuthContext";
@@ -28,5 +29,5 @@
 	>({});
 	const navigate = useNavigate();
-	const { login } = useAuth();
+	const { login, customGoogleLogin, googleLoginLoading } = useAuth();
 
 	const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
@@ -36,4 +37,19 @@
 		});
 	};
+
+	useEffect(() => {
+		const handleGoogleLoginSuccess = () => {
+			navigate("/");
+		};
+
+		window.addEventListener("googleLoginSuccess", handleGoogleLoginSuccess);
+
+		return () => {
+			window.removeEventListener(
+				"googleLoginSuccess",
+				handleGoogleLoginSuccess
+			);
+		};
+	}, [navigate]);
 
 	const handleRegister = async (e: React.FormEvent) => {
@@ -82,12 +98,14 @@
 	};
 	return (
-		<div className="flex flex-col items-center justify-center h-[83vh] bg-white">
+		<div className="flex flex-col items-center justify-center min-h-[83vh] py-4 px-4 bg-white">
 			<form
 				onSubmit={handleRegister}
-				className="bg-white p-6 rounded-lg h-auto shadow-md w-80"
+				className="bg-white p-4 sm:p-6 rounded-lg shadow-md w-full max-w-sm h-auto"
 			>
-				<h2 className="text-xl font-semibold mb-4 text-center">Регистрација</h2>
+				<h2 className="text-xl font-semibold mb-3 sm:mb-4 text-center">
+					Регистрација
+				</h2>
 				{errors.non_field_errors && (
-					<div className="text-red-500 mb-3 text-sm">
+					<div className="text-red-500 mb-2 sm:mb-3 text-sm">
 						{errors.non_field_errors[0]}
 					</div>
@@ -100,8 +118,8 @@
 					onChange={handleChange}
 					placeholder="Email"
-					className="w-full mb-3 p-2 border rounded"
+					className="w-full mb-2 sm:mb-3 p-2 border rounded"
 				/>
 				{errors.email && (
-					<p className="text-red-500 text-sm mb-2">
+					<p className="text-red-500 text-sm mb-1 sm:mb-2">
 						Постои корисник со оваа адреса.
 					</p>
@@ -125,5 +143,7 @@
 				/>
 				{errors.confirmPassword && (
-					<p className="text-red-500 text-sm mb-2">Лозинките не се совпаѓаат</p>
+					<p className="text-red-500 text-sm mb-1 sm:mb-2">
+						Лозинките не се совпаѓаат
+					</p>
 				)}
 				<input
@@ -134,7 +154,7 @@
 					onChange={handleChange}
 					placeholder="Име презиме"
-					className="w-full mb-3 p-2 border rounded"
+					className="w-full mb-2 sm:mb-3 p-2 border rounded"
 				/>
-				<p className="text-sm text-center mb-4">
+				<p className="text-sm text-center mb-3 sm:mb-4">
 					Имаш профил?{" "}
 					<Link to="/login" className="text-blue-600 hover:underline">
@@ -151,4 +171,26 @@
 					{loading ? "Се регистрира..." : "Регистрирај се"}
 				</button>
+				<div className="mt-3 sm:mt-4 text-center">
+					<div className="relative">
+						<div className="absolute inset-0 flex items-center">
+							<div className="w-full border-t border-gray-300" />
+						</div>
+						<div className="relative flex justify-center text-sm">
+							<span className="px-2 bg-white text-gray-500">или</span>
+						</div>
+					</div>
+				</div>
+
+				<button
+					type="button"
+					onClick={() => customGoogleLogin()}
+					disabled={googleLoginLoading}
+					className={`w-full mt-3 sm:mt-4 bg-white border border-gray-300 text-gray-700 p-2 rounded hover:bg-gray-50 flex items-center justify-center gap-2 ${
+						googleLoginLoading ? "opacity-70 cursor-not-allowed" : ""
+					}`}
+				>
+					<img src={googleLogo} alt="Google logo" className="w-5 h-5" />
+					{googleLoginLoading ? "Се најавува..." : "Продолжи со Google"}
+				</button>
 			</form>
 		</div>
