- Timestamp:
- 10/21/25 15:49:14 (11 months ago)
- Branches:
- master
- Children:
- 2d635ae
- Parents:
- 636f86c
- Location:
- src
- Files:
-
- 2 added
- 2 deleted
- 3 edited
- 6 moved
-
app/layout.tsx (modified) (3 diffs)
-
app/login/layout.tsx (deleted)
-
app/login/page.tsx (deleted)
-
app/page.tsx (modified) (1 diff)
-
app/students/applications/page.tsx (moved) (moved from src/app/applications/page.tsx )
-
app/students/documents/page.tsx (moved) (moved from src/app/documents/page.tsx )
-
app/students/exams/page.tsx (moved) (moved from src/app/exams/page.tsx )
-
app/students/layout.tsx (added)
-
app/students/page.tsx (added)
-
app/students/profile/page.tsx (moved) (moved from src/app/profile/page.tsx )
-
app/students/semesters/page.tsx (moved) (moved from src/app/semesters/page.tsx )
-
app/students/subjects/page.tsx (moved) (moved from src/app/subjects/page.tsx )
-
components/navbar.tsx (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/app/layout.tsx
r636f86c r6b8332f 2 2 import { Geist, Geist_Mono } from "next/font/google"; 3 3 import "./globals.css"; 4 import "@fortawesome/fontawesome-svg-core/styles.css";5 import { config } from "@fortawesome/fontawesome-svg-core";4 import '@fortawesome/fontawesome-svg-core/styles.css'; 5 import { config } from '@fortawesome/fontawesome-svg-core'; 6 6 import Header from "@/components/header"; 7 import Navbar from "@/components/navbar";8 7 9 8 // Prevent FontAwesome from adding CSS automatically … … 21 20 22 21 export const metadata: Metadata = { 23 title: "IKnow - UKIM", 24 description: 25 "University Managment System used to provide students informations and manage their progress.", 22 title: "IKnow - Student Portal", 23 description: "Student portal for Ss. Cyril and Methodius University", 26 24 }; 27 25 … … 33 31 return ( 34 32 <html lang="en"> 35 <body className={`${geistSans.variable} ${geistMono.variable} antialiased`}> 36 <div className="mx-auto max-w-6xl px-4"> 37 <Header /> 38 <Navbar /> 39 {children} 40 </div> 33 <body 34 className={`${geistSans.variable} ${geistMono.variable} antialiased`} 35 > 36 <div className="mx-auto max-w-6xl px-4">{children}</div> 41 37 </body> 42 38 </html> -
src/app/page.tsx
r636f86c r6b8332f 1 import Image from "next/image"; 1 "use client" 2 2 3 export default function Home() { 3 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; 4 import { 5 faUser, 6 faLock, 7 faEye, 8 faEyeSlash, 9 faSignInAlt, 10 faGraduationCap 11 } from '@fortawesome/free-solid-svg-icons'; 12 import { useState } from 'react'; 13 14 export default function LoginPage() { 15 const [showPassword, setShowPassword] = useState(false); 16 const [formData, setFormData] = useState({ 17 username: '', 18 password: '' 19 }); 20 21 const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => { 22 const { name, value } = e.target; 23 setFormData(prev => ({ 24 ...prev, 25 [name]: value 26 })); 27 }; 28 29 const handleSubmit = (e: React.FormEvent) => { 30 e.preventDefault(); 31 // Handle login logic here 32 console.log('Login attempt:', formData); 33 }; 34 4 35 return ( 5 <> 6 7 </> 36 <div className="container mx-auto px-4"> 37 <div className="min-h-screen "> 38 {/* Login Form */} 39 <div className="flex items-center justify-center min-h-[calc(100vh-160px)] p-4"> 40 <div className="w-full max-w-md"> 41 {/* Login Card */} 42 <div className="bg-white rounded-2xl shadow-xl border border-gray-100 overflow-hidden"> 43 {/* Header */} 44 <div className="bg-primary text-white px-8 py-6 text-center"> 45 <div className="mb-4"> 46 <div className="inline-flex items-center justify-center w-16 h-16 bg-white bg-opacity-20 rounded-full"> 47 <FontAwesomeIcon icon={faUser} className="text-2xl text-primary" /> 48 </div> 49 </div> 50 <h1 className="text-2xl font-bold mb-2">Добредојде</h1> 51 <p className="text-blue-100 text-sm"> 52 Најавете се во вашиот IKnow акаунт 53 </p> 54 </div> 55 56 {/* Form */} 57 <div className="p-8"> 58 <form onSubmit={handleSubmit} className="space-y-6"> 59 {/* Username Field */} 60 <div> 61 <label htmlFor="username" className="block text-sm font-medium text-gray-700 mb-2"> 62 Корисничко име 63 </label> 64 <div className="relative"> 65 <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> 66 <FontAwesomeIcon icon={faUser} className="h-4 w-4 text-gray-400" /> 67 </div> 68 <input 69 id="username" 70 name="username" 71 type="text" 72 required 73 value={formData.username} 74 onChange={handleInputChange} 75 className="w-full pl-10 pr-4 py-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary focus:border-primary transition-colors" 76 placeholder="Внесете корисничко име" 77 /> 78 </div> 79 </div> 80 81 {/* Password Field */} 82 <div> 83 <label htmlFor="password" className="block text-sm font-medium text-gray-700 mb-2"> 84 Лозинка 85 </label> 86 <div className="relative"> 87 <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> 88 <FontAwesomeIcon icon={faLock} className="h-4 w-4 text-gray-400" /> 89 </div> 90 <input 91 id="password" 92 name="password" 93 type={showPassword ? "text" : "password"} 94 required 95 value={formData.password} 96 onChange={handleInputChange} 97 className="w-full pl-10 pr-12 py-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary focus:border-primary transition-colors" 98 placeholder="Внесете лозинка" 99 /> 100 <button 101 type="button" 102 onClick={() => setShowPassword(!showPassword)} 103 className="absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 transition-colors" 104 > 105 <FontAwesomeIcon 106 icon={showPassword ? faEyeSlash : faEye} 107 className="h-4 w-4" 108 /> 109 </button> 110 </div> 111 </div> 112 113 {/* Remember Me & Forgot Password */} 114 <div className="flex items-center justify-between"> 115 <div className="flex items-center"> 116 <input 117 id="remember" 118 name="remember" 119 type="checkbox" 120 className="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded" 121 /> 122 <label htmlFor="remember" className="ml-2 block text-sm text-gray-700"> 123 Запомни ме 124 </label> 125 </div> 126 <button 127 type="button" 128 className="text-sm text-primary hover:text-blue-700 font-medium transition-colors" 129 > 130 Заборавена лозинка? 131 </button> 132 </div> 133 134 {/* Submit Button */} 135 <button 136 type="submit" 137 className="w-full bg-primary hover:bg-blue-700 text-white font-medium py-3 px-4 rounded-lg transition-colors duration-200 flex items-center justify-center gap-2 shadow-lg hover:shadow-xl" 138 > 139 <FontAwesomeIcon icon={faSignInAlt} className="h-4 w-4" /> 140 Најави се 141 </button> 142 </form> 143 </div> 144 145 {/* Footer */} 146 <div className="bg-gray-50 px-8 py-4 border-t border-gray-100"> 147 <p className="text-center text-sm text-gray-600"> 148 Немате акаунт?{' '} 149 <button className="text-primary hover:text-blue-700 font-medium transition-colors"> 150 Контактирајте ја администрацијата 151 </button> 152 </p> 153 </div> 154 </div> 155 156 {/* Additional Info */} 157 <div className="mt-6 text-center"> 158 <div className="inline-flex items-center gap-2 px-4 py-2 bg-white bg-opacity-80 rounded-lg shadow-sm"> 159 <FontAwesomeIcon icon={faGraduationCap} className="text-primary" /> 160 <span className="text-sm text-gray-600"> 161 Студентски информационен систем 162 </span> 163 </div> 164 </div> 165 </div> 166 </div> 167 </div> 168 </div> 8 169 ); 9 170 } -
src/components/navbar.tsx
r636f86c r6b8332f 19 19 20 20 const menuItems = [ 21 { icon: faUser, label: 'Профил', href: '/ profile' },22 { icon: faBookmark, label: 'Семестри', href: '/s emesters' },23 { icon: faBook, label: 'Предмети', href: '/s ubjects' },24 { icon: faPenToSquare, label: 'Пријави', href: '/ applications' },25 { icon: faListCheck, label: 'Положени', href: '/ exams' },26 { icon: faFilePdf, label: 'Документи', href: '/ documents' }21 { icon: faUser, label: 'Профил', href: '/students/profile' }, 22 { icon: faBookmark, label: 'Семестри', href: '/students/semesters' }, 23 { icon: faBook, label: 'Предмети', href: '/students/subjects' }, 24 { icon: faPenToSquare, label: 'Пријави', href: '/students/applications' }, 25 { icon: faListCheck, label: 'Положени', href: '/students/exams' }, 26 { icon: faFilePdf, label: 'Документи', href: '/students/documents' } 27 27 ]; 28 28
Note:
See TracChangeset
for help on using the changeset viewer.
