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>
<meta charset="UTF-8">
<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.gstatic.com" crossorigin>
<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://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<style>
<style>
:root{
--primary:#5E244E;
--secondary:#8B3A74;
--light:#f8f4f7;
--sidebar-width: 260px;
}
.hero{
background:linear-gradient(rgba(0,0,0,.65),rgba(0,0,0,.65)),
url('https://images.pexels.com/photos/3802510/pexels-photo-3802510.jpeg');
background-size:cover;
background-position:center;
body{
font-family:'Inter', sans-serif;
background:#f5f3f6;
}
/* ---------- Sidebar ---------- */
.sidebar{
width:var(--sidebar-width);
min-height:100vh;
background:var(--primary);
color:#fff;
padding:80px 0;
text-align:center;
}
.portal-card{
border:none;
border-radius:15px;
position:fixed;
top:0;
left:0;
padding:24px 0;
transition:.3s;
box-shadow:0 5px 20px rgba(0,0,0,.08);
z-index:1030;
}
.portal-card:hover{
transform:translateY(-8px);
.sidebar .brand{
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{
width:70px;
height:70px;
background:#5E244E;
.sidebar .nav-link{
color:rgba(255,255,255,.75);
padding:12px 24px;
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;
}
.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%;
background:var(--secondary);
color:#fff;
display:flex;
align-items:center;
justify-content:center;
font-size:28px;
margin:auto;
font-weight:600;
}
.btn-portal{
background:#5E244E;
color:#fff;
padding:10px 30px;
/* ---------- Stat cards ---------- */
.stat-card{
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{
background:#8B3A74;
.stat-icon{
width:48px;
height:48px;
border-radius:12px;
display:flex;
align-items:center;
justify-content:center;
font-size:20px;
color:#fff;
margin-bottom:14px;
}
.modal-content {
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);
.stat-value{
font-size:1.6rem;
font-weight:700;
font-size: 1.35rem;
color:#1e1e2f;
}
.modal-body {
padding: 10px 25px 20px;
.stat-label{
color:#6b7280;
font-size:.85rem;
}
.input-group-text {
background-color: #f8fafc;
border-color: #cbd5e1;
color: #64748b;
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
/* ---------- Panels ---------- */
.panel{
background:#fff;
border-radius:14px;
padding:24px;
box-shadow:0 5px 20px rgba(0,0,0,.06);
}
.form-label {
color: #475569;
font-weight: 500;
font-size: 0.9rem;
.panel h5{
font-weight:700;
color:#1e1e2f;
margin-bottom:18px;
}
.form-control {
border: 1px solid #cbd5e1;
padding: 0.65rem 0.75rem;
font-size: 0.95rem;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
transition: all 0.2s ease;
.course-row{
display:flex;
align-items:center;
justify-content:space-between;
padding:14px 0;
border-bottom:1px solid #f1f1f4;
}
.form-control:focus {
border-color: var(--secondary);
box-shadow: 0 0 0 4px rgba(139, 58, 116, 0.12);
outline: 0;
.course-row:last-child{ border-bottom:none; }
.course-tag{
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;
}
.input-group:focus-within .input-group-text {
border-color: var(--secondary);
color: var(--secondary);
.progress{
height:6px;
border-radius:10px;
background:#eee;
}
.modal-footer {
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 {
.progress-bar{
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 {
background: var(--secondary);
color: #fff;
transform: translateY(-1px);
box-shadow: 0 6px 15px rgba(94, 36, 78, 0.3);
.deadline-item{
display:flex;
gap:14px;
padding:12px 0;
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>
</head>
<body>
<section class="hero">
<div class="container">
<h1 class="fw-bold">Student Portal</h1>
<p class="mt-3">
Access your courses, timetable, assignments, examination results,
payments and profile from one place.
</p>
<!-- Sidebar -->
<aside class="sidebar" id="sidebar">
<div class="brand"><i class="fa-solid fa-graduation-cap me-2"></i>Student Portal</div>
<nav class="nav flex-column">
<a href="#" class="nav-link active"><i class="fa-solid fa-gauge"></i>Dashboard</a>
<a href="#" class="nav-link"><i class="fa-solid fa-book"></i>My Courses</a>
<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">
Student Login
</button>
<!-- Main content -->
<div class="main">
<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>
</section>
<section class="py-5">
<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 class="d-flex align-items-center gap-3">
<i class="fa-regular fa-bell fs-5 text-secondary"></i>
<div class="avatar">N</div>
</div>
</div>
<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-calendar-days"></i>
<!-- Stat cards -->
<div class="row g-3 mb-4">
<div class="col-6 col-lg-3">
<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>
<h4 class="mt-4">Class Timetable</h4>
<p class="text-muted">Check your weekly lecture schedule.</p>
</div>
</div>
<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-file-lines"></i>
<div class="row g-3">
<!-- Courses -->
<div class="col-lg-7">
<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>
<h4 class="mt-4">Assignments</h4>
<p class="text-muted">Submit assignments and download resources.</p>
</div>
<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 class="col-md-4">
<div class="card portal-card h-100 text-center p-4">
<div class="portal-icon">
<i class="fa-solid fa-square-poll-vertical"></i>
<div class="course-row">
<div class="d-flex align-items-center gap-3">
<div class="course-tag">WD</div>
<div>
<div class="fw-semibold">Web Application Development</div>
<div class="text-muted" style="font-size:.8rem;">Ms. S. Fernando</div>
</div>
<h4 class="mt-4">Exam Results</h4>
<p class="text-muted">View semester and final examination results.</p>
</div>
<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 class="col-md-4">
<div class="card portal-card h-100 text-center p-4">
<div class="portal-icon">
<i class="fa-solid fa-credit-card"></i>
<div class="course-row">
<div class="d-flex align-items-center gap-3">
<div class="course-tag">DB</div>
<div>
<div class="fw-semibold">Database Management Systems</div>
<div class="text-muted" style="font-size:.8rem;">Mr. R. Silva</div>
</div>
<h4 class="mt-4">Fee Payments</h4>
<p class="text-muted">Pay course fees and download payment receipts.</p>
</div>
<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 class="col-md-4">
<div class="card portal-card h-100 text-center p-4">
<div class="portal-icon">
<i class="fa-solid fa-user"></i>
</div>
<h4 class="mt-4">Student Profile</h4>
<p class="text-muted">Update your personal information securely.</p>
<div class="course-row">
<div class="d-flex align-items-center gap-3">
<div class="course-tag">NW</div>
<div>
<div class="fw-semibold">Computer Networks</div>
<div class="text-muted" style="font-size:.8rem;">Dr. A. Bandara</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>
</section>
<section class="py-5 bg-light">
<div class="container">
<div class="text-center mb-5">
<h2>Quick Links</h2>
</div>
<div class="row text-center">
<div class="col-md-3 mb-3">
<a href="#" class="btn btn-outline-dark w-100">Academic Calendar</a>
</div>
<div class="col-md-3 mb-3">
<a href="#" class="btn btn-outline-dark w-100">Student Handbook</a>
</div>
<div class="col-md-3 mb-3">
<a href="#" class="btn btn-outline-dark w-100">Examination Notices</a>
</div>
<div class="col-md-3 mb-3">
<a href="#" class="btn btn-outline-dark w-100">Contact Support</a>
<!-- Exam Results -->
<div class="panel">
<h5>Recent Exam Results</h5>
<div class="table-responsive">
<table class="table table-borderless align-middle mb-0">
<thead>
<tr class="text-muted" style="font-size:.8rem;">
<th>Course</th>
<th>Semester</th>
<th>Grade</th>
<th>Status</th>
</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>
</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>
</html>

View File

@ -17,7 +17,7 @@
}
.hero {
height: 220px; /* Hero එකේ උස තවත් අඩු කළා */
height: 220px;
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');
background-size: cover;

View File

@ -178,7 +178,7 @@
<span class="navbar-toggler-icon"></span>
</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">
<li class="nav-item">
<a class="nav-link {{ request()->is('/') ? 'active-page' : '' }}" href="/">Home</a>
@ -201,8 +201,8 @@
@php
$displayName = Auth::user()->first_name . ' ' . Auth::user()->last_name;
@endphp
<div class="dropdown">
<a class="user-dropdown-toggle dropdown-toggle text-white"
<div class="dropdown" style="padding-left:325px;">
<a class="user-dropdown-toggle text-white"
href="#"
role="button"
id="userMenu"

View File

@ -257,9 +257,7 @@ body{
color: #5E244E;
}
/* ========================================================
Custom Pure CSS Animations (No external libraries needed)
======================================================== */
.animate-on-scroll {
opacity: 0;
transition: all 1s ease-out;
@ -295,7 +293,7 @@ body{
{{-- ===================== HERO ===================== --}}
<section class="hero" role="banner" aria-label="Automobile Engineering Academy introduction">
<div class="container">
<!-- Hero එක load වෙද්දිම animate වෙන්න කෙලින්ම animated දැම්මා -->
<div class="hero-content text-center animate-on-scroll animated fade-up-init">
<h1 class="display-4 fw-bold">
Automobile Engineering Academy
@ -366,8 +364,8 @@ body{
<div class="row g-4 mb-5">
@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="course-image-wrapper">
@ -473,7 +471,7 @@ body{
</div>
</section>
<!-- බාහිර කිසිම script එකක් ඕනේ නැහැ, මේ සරල කෑල්ල කෙලින්ම වැඩ කරනවා -->
<script>
document.addEventListener('DOMContentLoaded', function () {
const animatedElements = document.querySelectorAll('.animate-on-scroll');
@ -482,11 +480,11 @@ body{
entries.forEach(entry => {
if (entry.isIntersecting) {
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));