This commit is contained in:
imadhigp 2026-07-10 17:02:49 +05:30
parent 05ba79ba03
commit a1a41fbada
4 changed files with 426 additions and 238 deletions

View File

@ -3,281 +3,471 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Student Services - LMS Dashboard</title> <title>Dashboard - Student Portal</title>
<!-- Google Fonts (Segoe UI style clean font එකක් සඳහා) -->
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<!-- FontAwesome Icons (Card ඇතුලේ තියෙන icons සඳහා) -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<style> <style>
<style>
:root{ :root{
--primary:#5E244E; --primary:#5E244E;
--secondary:#8B3A74; --secondary:#8B3A74;
--light:#f8f4f7; --light:#f8f4f7;
--sidebar-width: 260px;
} }
.hero{ body{
background:linear-gradient(rgba(0,0,0,.65),rgba(0,0,0,.65)), font-family:'Inter', sans-serif;
url('https://images.pexels.com/photos/3802510/pexels-photo-3802510.jpeg'); background:#f5f3f6;
background-size:cover; }
background-position:center;
/* ---------- Sidebar ---------- */
.sidebar{
width:var(--sidebar-width);
min-height:100vh;
background:var(--primary);
color:#fff; color:#fff;
padding:80px 0; position:fixed;
text-align:center; top:0;
} left:0;
padding:24px 0;
.portal-card{
border:none;
border-radius:15px;
transition:.3s; transition:.3s;
box-shadow:0 5px 20px rgba(0,0,0,.08); z-index:1030;
} }
.portal-card:hover{ .sidebar .brand{
transform:translateY(-8px); padding:0 24px 24px;
font-weight:700;
font-size:1.15rem;
border-bottom:1px solid rgba(255,255,255,.12);
margin-bottom:12px;
} }
.portal-icon{ .sidebar .nav-link{
width:70px; color:rgba(255,255,255,.75);
height:70px; padding:12px 24px;
background:#5E244E; border-radius:0;
font-size:.95rem;
display:flex;
align-items:center;
gap:12px;
transition:.2s;
border-left:3px solid transparent;
}
.sidebar .nav-link i{ width:20px; text-align:center; }
.sidebar .nav-link:hover{
background:rgba(255,255,255,.06);
color:#fff; color:#fff;
}
.sidebar .nav-link.active{
background:rgba(255,255,255,.1);
color:#fff;
border-left:3px solid #fff;
font-weight:600;
}
.sidebar .logout-link{
color:rgba(255,255,255,.6);
}
.sidebar .logout-link:hover{
color:#fff;
background:rgba(220,53,69,.25);
}
/* ---------- Main content ---------- */
.main{
margin-left:var(--sidebar-width);
padding:28px 32px 60px;
}
.topbar{
display:flex;
align-items:center;
justify-content:space-between;
margin-bottom:28px;
}
.avatar{
width:42px;
height:42px;
border-radius:50%; border-radius:50%;
background:var(--secondary);
color:#fff;
display:flex; display:flex;
align-items:center; align-items:center;
justify-content:center; justify-content:center;
font-size:28px; font-weight:600;
margin:auto;
} }
.btn-portal{ /* ---------- Stat cards ---------- */
background:#5E244E; .stat-card{
color:#fff;
padding:10px 30px;
border:none; border:none;
transition: 0.2s ease; border-radius:14px;
padding:22px;
box-shadow:0 5px 20px rgba(0,0,0,.06);
height:100%;
} }
.btn-portal:hover{ .stat-icon{
background:#8B3A74; width:48px;
height:48px;
border-radius:12px;
display:flex;
align-items:center;
justify-content:center;
font-size:20px;
color:#fff; color:#fff;
margin-bottom:14px;
} }
.stat-value{
.modal-content { font-size:1.6rem;
border: none;
border-radius: 16px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
}
.modal-header {
background: transparent;
border-bottom: none;
padding: 25px 25px 10px;
}
.modal-title {
color: var(--primary);
font-weight:700; font-weight:700;
font-size: 1.35rem; color:#1e1e2f;
} }
.modal-body { .stat-label{
padding: 10px 25px 20px; color:#6b7280;
font-size:.85rem;
} }
/* ---------- Panels ---------- */
.input-group-text { .panel{
background-color: #f8fafc; background:#fff;
border-color: #cbd5e1; border-radius:14px;
color: #64748b; padding:24px;
border-top-left-radius: 8px; box-shadow:0 5px 20px rgba(0,0,0,.06);
border-bottom-left-radius: 8px;
} }
.form-label { .panel h5{
color: #475569; font-weight:700;
font-weight: 500; color:#1e1e2f;
font-size: 0.9rem; margin-bottom:18px;
} }
.form-control { .course-row{
border: 1px solid #cbd5e1; display:flex;
padding: 0.65rem 0.75rem; align-items:center;
font-size: 0.95rem; justify-content:space-between;
border-top-right-radius: 8px; padding:14px 0;
border-bottom-right-radius: 8px; border-bottom:1px solid #f1f1f4;
transition: all 0.2s ease;
} }
.form-control:focus { .course-row:last-child{ border-bottom:none; }
border-color: var(--secondary);
box-shadow: 0 0 0 4px rgba(139, 58, 116, 0.12); .course-tag{
outline: 0; width:38px;
height:38px;
border-radius:10px;
background:var(--light);
color:var(--primary);
display:flex;
align-items:center;
justify-content:center;
font-weight:700;
font-size:.85rem;
} }
.progress{
.input-group:focus-within .input-group-text { height:6px;
border-color: var(--secondary); border-radius:10px;
color: var(--secondary); background:#eee;
} }
.modal-footer { .progress-bar{
background: transparent;
border-top: none;
padding: 0 25px 30px;
}
.btn-modal-cancel {
background: transparent;
border: 1.5px solid #cbd5e1;
color: #64748b;
font-weight: 600;
padding: 10px 0;
transition: all 0.2s;
width: 100%;
}
.btn-modal-cancel:hover {
background: #f1f5f9;
color: #334155;
border-color: #94a3b8;
}
.btn-modal-login {
background:var(--primary); background:var(--primary);
color: #fff;
border: none;
font-weight: 600;
padding: 10px 0;
box-shadow: 0 4px 12px rgba(94, 36, 78, 0.2);
transition: all 0.2s;
width: 100%;
} }
.btn-modal-login:hover { .deadline-item{
background: var(--secondary); display:flex;
color: #fff; gap:14px;
transform: translateY(-1px); padding:12px 0;
box-shadow: 0 6px 15px rgba(94, 36, 78, 0.3); border-bottom:1px solid #f1f1f4;
}
.deadline-item:last-child{ border-bottom:none; }
.deadline-date{
min-width:52px;
text-align:center;
background:var(--light);
color:var(--primary);
border-radius:10px;
padding:6px 4px;
font-weight:700;
font-size:.8rem;
line-height:1.2;
}
.badge-soft{
background:var(--light);
color:var(--primary);
font-weight:600;
padding:5px 10px;
border-radius:8px;
font-size:.75rem;
}
/* ---------- Mobile ---------- */
.sidebar-toggle{
display:none;
}
@media (max-width: 991px){
.sidebar{
left:calc(-1 * var(--sidebar-width));
}
.sidebar.show{
left:0;
}
.main{
margin-left:0;
}
.sidebar-toggle{
display:inline-flex;
}
} }
</style> </style>
</head>
<body>
<section class="hero"> <!-- Sidebar -->
<div class="container"> <aside class="sidebar" id="sidebar">
<h1 class="fw-bold">Student Portal</h1> <div class="brand"><i class="fa-solid fa-graduation-cap me-2"></i>Student Portal</div>
<p class="mt-3"> <nav class="nav flex-column">
Access your courses, timetable, assignments, examination results, <a href="#" class="nav-link active"><i class="fa-solid fa-gauge"></i>Dashboard</a>
payments and profile from one place. <a href="#" class="nav-link"><i class="fa-solid fa-book"></i>My Courses</a>
</p> <a href="#" class="nav-link"><i class="fa-solid fa-calendar-days"></i>Class Timetable</a>
<a href="#" class="nav-link"><i class="fa-solid fa-file-lines"></i>Assignments</a>
<a href="#" class="nav-link"><i class="fa-solid fa-square-poll-vertical"></i>Exam Results</a>
<a href="#" class="nav-link"><i class="fa-solid fa-credit-card"></i>Fee Payments</a>
<a href="#" class="nav-link"><i class="fa-solid fa-user"></i>Profile</a>
<a href="student-portal-fixed.html" class="nav-link logout-link mt-3"><i class="fa-solid fa-right-from-bracket"></i>Logout</a>
</nav>
</aside>
<button onclick="studentlogin()" class="btn btn-portal mt-3"> <!-- Main content -->
Student Login <div class="main">
</button> <div class="topbar">
<div>
<button class="btn btn-sm btn-outline-secondary sidebar-toggle me-2" id="sidebarToggle"><i class="fa-solid fa-bars"></i></button>
<h4 class="fw-bold mb-0 d-inline">Welcome back, Nimasha</h4>
<p class="text-muted mb-0">Here's what's happening with your studies today.</p>
</div> </div>
</section> <div class="d-flex align-items-center gap-3">
<i class="fa-regular fa-bell fs-5 text-secondary"></i>
<section class="py-5"> <div class="avatar">N</div>
<div class="container">
<div class="text-center mb-5">
<h2>Student Services</h2>
<p class="text-muted">
Everything you need during your academic journey.
</p>
</div>
<div class="row g-4">
<div class="col-md-4">
<div class="card portal-card h-100 text-center p-4">
<div class="portal-icon">
<i class="fa-solid fa-book"></i>
</div>
<h4 class="mt-4">My Courses</h4>
<p class="text-muted">View enrolled courses and learning materials.</p>
</div> </div>
</div> </div>
<div class="col-md-4"> <!-- Stat cards -->
<div class="card portal-card h-100 text-center p-4"> <div class="row g-3 mb-4">
<div class="portal-icon"> <div class="col-6 col-lg-3">
<i class="fa-solid fa-calendar-days"></i> <div class="card stat-card">
<div class="stat-icon" style="background:#5E244E;"><i class="fa-solid fa-book"></i></div>
<div class="stat-value">6</div>
<div class="stat-label">Enrolled Courses</div>
</div>
</div>
<div class="col-6 col-lg-3">
<div class="card stat-card">
<div class="stat-icon" style="background:#0d9488;"><i class="fa-solid fa-file-circle-check"></i></div>
<div class="stat-value">3</div>
<div class="stat-label">Pending Assignments</div>
</div>
</div>
<div class="col-6 col-lg-3">
<div class="card stat-card">
<div class="stat-icon" style="background:#d97706;"><i class="fa-solid fa-square-poll-vertical"></i></div>
<div class="stat-value">78%</div>
<div class="stat-label">Average Result</div>
</div>
</div>
<div class="col-6 col-lg-3">
<div class="card stat-card">
<div class="stat-icon" style="background:#dc2626;"><i class="fa-solid fa-credit-card"></i></div>
<div class="stat-value">Rs. 12,000</div>
<div class="stat-label">Balance Due</div>
</div> </div>
<h4 class="mt-4">Class Timetable</h4>
<p class="text-muted">Check your weekly lecture schedule.</p>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="row g-3">
<div class="card portal-card h-100 text-center p-4"> <!-- Courses -->
<div class="portal-icon"> <div class="col-lg-7">
<i class="fa-solid fa-file-lines"></i> <div class="panel mb-3">
<h5>My Courses</h5>
<div class="course-row">
<div class="d-flex align-items-center gap-3">
<div class="course-tag">DS</div>
<div>
<div class="fw-semibold">Data Structures &amp; Algorithms</div>
<div class="text-muted" style="font-size:.8rem;">Dr. K. Perera</div>
</div> </div>
<h4 class="mt-4">Assignments</h4> </div>
<p class="text-muted">Submit assignments and download resources.</p> <div style="width:120px;">
<div class="progress"><div class="progress-bar" style="width:72%"></div></div>
<div class="text-muted text-end" style="font-size:.75rem;">72%</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="course-row">
<div class="card portal-card h-100 text-center p-4"> <div class="d-flex align-items-center gap-3">
<div class="portal-icon"> <div class="course-tag">WD</div>
<i class="fa-solid fa-square-poll-vertical"></i> <div>
<div class="fw-semibold">Web Application Development</div>
<div class="text-muted" style="font-size:.8rem;">Ms. S. Fernando</div>
</div> </div>
<h4 class="mt-4">Exam Results</h4> </div>
<p class="text-muted">View semester and final examination results.</p> <div style="width:120px;">
<div class="progress"><div class="progress-bar" style="width:58%"></div></div>
<div class="text-muted text-end" style="font-size:.75rem;">58%</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="course-row">
<div class="card portal-card h-100 text-center p-4"> <div class="d-flex align-items-center gap-3">
<div class="portal-icon"> <div class="course-tag">DB</div>
<i class="fa-solid fa-credit-card"></i> <div>
<div class="fw-semibold">Database Management Systems</div>
<div class="text-muted" style="font-size:.8rem;">Mr. R. Silva</div>
</div> </div>
<h4 class="mt-4">Fee Payments</h4> </div>
<p class="text-muted">Pay course fees and download payment receipts.</p> <div style="width:120px;">
<div class="progress"><div class="progress-bar" style="width:85%"></div></div>
<div class="text-muted text-end" style="font-size:.75rem;">85%</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="course-row">
<div class="card portal-card h-100 text-center p-4"> <div class="d-flex align-items-center gap-3">
<div class="portal-icon"> <div class="course-tag">NW</div>
<i class="fa-solid fa-user"></i> <div>
</div> <div class="fw-semibold">Computer Networks</div>
<h4 class="mt-4">Student Profile</h4> <div class="text-muted" style="font-size:.8rem;">Dr. A. Bandara</div>
<p class="text-muted">Update your personal information securely.</p>
</div> </div>
</div> </div>
<div style="width:120px;">
<div class="progress"><div class="progress-bar" style="width:40%"></div></div>
<div class="text-muted text-end" style="font-size:.75rem;">40%</div>
</div> </div>
</div> </div>
</section>
<section class="py-5 bg-light">
<div class="container">
<div class="text-center mb-5">
<h2>Quick Links</h2>
</div> </div>
<div class="row text-center"> <!-- Exam Results -->
<div class="col-md-3 mb-3"> <div class="panel">
<a href="#" class="btn btn-outline-dark w-100">Academic Calendar</a> <h5>Recent Exam Results</h5>
</div> <div class="table-responsive">
<div class="col-md-3 mb-3"> <table class="table table-borderless align-middle mb-0">
<a href="#" class="btn btn-outline-dark w-100">Student Handbook</a> <thead>
</div> <tr class="text-muted" style="font-size:.8rem;">
<div class="col-md-3 mb-3"> <th>Course</th>
<a href="#" class="btn btn-outline-dark w-100">Examination Notices</a> <th>Semester</th>
</div> <th>Grade</th>
<div class="col-md-3 mb-3"> <th>Status</th>
<a href="#" class="btn btn-outline-dark w-100">Contact Support</a> </tr>
</thead>
<tbody>
<tr>
<td>Data Structures &amp; Algorithms</td>
<td>Sem 3</td>
<td class="fw-semibold">A-</td>
<td><span class="badge-soft">Passed</span></td>
</tr>
<tr>
<td>Database Management Systems</td>
<td>Sem 3</td>
<td class="fw-semibold">B+</td>
<td><span class="badge-soft">Passed</span></td>
</tr>
<tr>
<td>Computer Networks</td>
<td>Sem 2</td>
<td class="fw-semibold">B</td>
<td><span class="badge-soft">Passed</span></td>
</tr>
</tbody>
</table>
</div> </div>
</div> </div>
</div> </div>
</section>
<!-- Sidebar right column -->
<div class="col-lg-5">
<div class="panel mb-3">
<h5>Upcoming Deadlines</h5>
<div class="deadline-item">
<div class="deadline-date">12<br>JUL</div>
<div>
<div class="fw-semibold">Database Assignment 02</div>
<div class="text-muted" style="font-size:.8rem;">Database Management Systems</div>
</div>
</div>
<div class="deadline-item">
<div class="deadline-date">15<br>JUL</div>
<div>
<div class="fw-semibold">Web Dev Project Submission</div>
<div class="text-muted" style="font-size:.8rem;">Web Application Development</div>
</div>
</div>
<div class="deadline-item">
<div class="deadline-date">20<br>JUL</div>
<div>
<div class="fw-semibold">Networks Quiz 03</div>
<div class="text-muted" style="font-size:.8rem;">Computer Networks</div>
</div>
</div>
</div>
<div class="panel">
<h5>Today's Timetable</h5>
<div class="deadline-item">
<div class="deadline-date">9<br>AM</div>
<div>
<div class="fw-semibold">Data Structures &amp; Algorithms</div>
<div class="text-muted" style="font-size:.8rem;">Lecture Hall 2</div>
</div>
</div>
<div class="deadline-item">
<div class="deadline-date">11<br>AM</div>
<div>
<div class="fw-semibold">Database Lab</div>
<div class="text-muted" style="font-size:.8rem;">Computer Lab 1</div>
</div>
</div>
<div class="deadline-item">
<div class="deadline-date">2<br>PM</div>
<div>
<div class="fw-semibold">Computer Networks</div>
<div class="text-muted" style="font-size:.8rem;">Lecture Hall 5</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script>
document.getElementById('sidebarToggle')?.addEventListener('click', function () {
document.getElementById('sidebar').classList.toggle('show');
});
</script>
</body> </body>
</html> </html>

View File

@ -17,7 +17,7 @@
} }
.hero { .hero {
height: 220px; /* Hero එකේ උස තවත් අඩු කළා */ height: 220px;
background: linear-gradient(rgba(20,20,20,.55),rgba(20,20,20,.55)), background: linear-gradient(rgba(20,20,20,.55),rgba(20,20,20,.55)),
url('https://images.unsplash.com/photo-1517520287167-4bbf64a00d66?auto=format&fit=crop&w=1600&q=80'); url('https://images.unsplash.com/photo-1517520287167-4bbf64a00d66?auto=format&fit=crop&w=1600&q=80');
background-size: cover; background-size: cover;

View File

@ -178,7 +178,7 @@
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="collapse navbar-collapse" id="menu"> <div class="collapse navbar-collapse" id="menu" style="padding-left:214px;">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0 align-items-lg-center"> <ul class="navbar-nav ms-auto mb-2 mb-lg-0 align-items-lg-center">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {{ request()->is('/') ? 'active-page' : '' }}" href="/">Home</a> <a class="nav-link {{ request()->is('/') ? 'active-page' : '' }}" href="/">Home</a>
@ -201,8 +201,8 @@
@php @php
$displayName = Auth::user()->first_name . ' ' . Auth::user()->last_name; $displayName = Auth::user()->first_name . ' ' . Auth::user()->last_name;
@endphp @endphp
<div class="dropdown"> <div class="dropdown" style="padding-left:325px;">
<a class="user-dropdown-toggle dropdown-toggle text-white" <a class="user-dropdown-toggle text-white"
href="#" href="#"
role="button" role="button"
id="userMenu" id="userMenu"

View File

@ -257,9 +257,7 @@ body{
color: #5E244E; color: #5E244E;
} }
/* ========================================================
Custom Pure CSS Animations (No external libraries needed)
======================================================== */
.animate-on-scroll { .animate-on-scroll {
opacity: 0; opacity: 0;
transition: all 1s ease-out; transition: all 1s ease-out;
@ -295,7 +293,7 @@ body{
{{-- ===================== HERO ===================== --}} {{-- ===================== HERO ===================== --}}
<section class="hero" role="banner" aria-label="Automobile Engineering Academy introduction"> <section class="hero" role="banner" aria-label="Automobile Engineering Academy introduction">
<div class="container"> <div class="container">
<!-- Hero එක load වෙද්දිම animate වෙන්න කෙලින්ම animated දැම්මා -->
<div class="hero-content text-center animate-on-scroll animated fade-up-init"> <div class="hero-content text-center animate-on-scroll animated fade-up-init">
<h1 class="display-4 fw-bold"> <h1 class="display-4 fw-bold">
Automobile Engineering Academy Automobile Engineering Academy
@ -366,8 +364,8 @@ body{
<div class="row g-4 mb-5"> <div class="row g-4 mb-5">
@foreach($courses as $index => $course) @foreach($courses as $index => $course)
<!-- Cards ටික එකින් එක delay වෙන්න inline style එකක් දැම්මා -->
<div class="col-lg-4 col-md-6 animate-on-scroll fade-up-init" style="transition-delay: {{ $index * 150 }}ms;"> <div class="col-lg-4 col-md-6 " style="transition-delay: {{ $index * 150 }}ms;">
<div class="card course-card h-100"> <div class="card course-card h-100">
<div class="course-image-wrapper"> <div class="course-image-wrapper">
@ -473,7 +471,7 @@ body{
</div> </div>
</section> </section>
<!-- බාහිර කිසිම script එකක් ඕනේ නැහැ, මේ සරල කෑල්ල කෙලින්ම වැඩ කරනවා -->
<script> <script>
document.addEventListener('DOMContentLoaded', function () { document.addEventListener('DOMContentLoaded', function () {
const animatedElements = document.querySelectorAll('.animate-on-scroll'); const animatedElements = document.querySelectorAll('.animate-on-scroll');
@ -482,11 +480,11 @@ body{
entries.forEach(entry => { entries.forEach(entry => {
if (entry.isIntersecting) { if (entry.isIntersecting) {
entry.target.classList.add('animated'); entry.target.classList.add('animated');
observer.unobserve(entry.target); // එක පාරක් වැඩ කළාම ඇති නිසා නැවත check කරන්නේ නැත observer.unobserve(entry.target);
} }
}); });
}, { }, {
threshold: 0.15 // Section එකෙන් 15%ක් screen එකට ආපු ගමන් animate වේ threshold: 0.15
}); });
animatedElements.forEach(el => observer.observe(el)); animatedElements.forEach(el => observer.observe(el));