diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php
index 65ea77e..c9bc2d5 100644
--- a/app/Http/Controllers/AdminController.php
+++ b/app/Http/Controllers/AdminController.php
@@ -51,7 +51,7 @@ public function storeApp(Request $request)
'name' => 'required|string|max:255',
'url' => 'required|url|max:255',
'icon_svg' => 'nullable|string',
- 'logo' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg,webp|max:2048',
+ 'logo' => 'nullable|file|mimes:jpg,jpeg,png,webp,svg|max:2048',
'color' => 'nullable|string|max:20',
'desc' => 'nullable|string',
'tag' => 'nullable|string|max:255',
diff --git a/public/Screenshot_3.png b/public/Screenshot_3.png
index e2b9b6d..f4441ae 100644
Binary files a/public/Screenshot_3.png and b/public/Screenshot_3.png differ
diff --git a/public/Screenshot_4.png b/public/Screenshot_4.png
index 42566e1..cfcf3ec 100644
Binary files a/public/Screenshot_4.png and b/public/Screenshot_4.png differ
diff --git a/public/image (6).png b/public/image (6).png
new file mode 100644
index 0000000..926a9bc
Binary files /dev/null and b/public/image (6).png differ
diff --git a/public/sg-cart.png b/public/sg-cart.png
new file mode 100644
index 0000000..16df63b
Binary files /dev/null and b/public/sg-cart.png differ
diff --git a/public/uploads/logos/1784015190_6a55e9565ba2d.jpg b/public/uploads/logos/1784015190_6a55e9565ba2d.jpg
new file mode 100644
index 0000000..7f7a79b
Binary files /dev/null and b/public/uploads/logos/1784015190_6a55e9565ba2d.jpg differ
diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php
index dc9087a..1744e1a 100644
--- a/resources/views/admin/dashboard.blade.php
+++ b/resources/views/admin/dashboard.blade.php
@@ -554,6 +554,19 @@
+ @if($errors->any())
+
diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php
index 1a054a3..b2ebd2e 100644
--- a/resources/views/dashboard.blade.php
+++ b/resources/views/dashboard.blade.php
@@ -64,70 +64,281 @@
z-index: -1;
}
- /* Navigation Bar */
+ /* Top Profile-Integrated Navigation Bar */
.navbar {
display: flex;
align-items: center;
justify-content: space-between;
- padding: 20px 5%;
- background: rgba(17, 24, 39, 0.4);
+ padding: 12px 5%;
+ background: rgba(17, 24, 39, 0.45);
border-bottom: 1px solid var(--card-border);
- backdrop-filter: blur(12px);
- -webkit-backdrop-filter: blur(12px);
+ backdrop-filter: blur(16px);
+ -webkit-backdrop-filter: blur(16px);
z-index: 100;
+ position: sticky;
+ top: 0;
+ box-shadow: 0 4px 30px rgba(0, 0, 0, 0.15);
}
- .nav-logo {
- font-family: 'Outfit', sans-serif;
- font-size: 1.5rem;
- font-weight: 800;
- background: linear-gradient(135deg, #a5b4fc 0%, #38bdf8 100%);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- display: flex;
- align-items: center;
- gap: 8px;
- }
-
- .nav-logo svg {
- width: 24px;
- height: 24px;
- fill: #38bdf8;
- }
-
- .nav-user {
+ .nav-profile {
display: flex;
align-items: center;
gap: 12px;
}
- .logout-link {
+ .nav-profile-avatar img {
+ width: 38px;
+ height: 38px;
+ border-radius: 50%;
+ border: 1.5px solid var(--accent-primary);
+ object-fit: cover;
+ }
+
+ .nav-profile-avatar-fallback {
+ width: 38px;
+ height: 38px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, var(--accent-primary) 0%, var(--accent-secondary) 100%);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.95rem;
+ font-weight: 700;
+ color: white;
+ box-shadow: 0 0 10px rgba(79, 70, 229, 0.3);
+ }
+
+ .nav-profile-details {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ }
+
+ .nav-profile-welcome {
+ font-family: 'Outfit', sans-serif;
+ font-size: 0.95rem;
+ font-weight: 700;
+ color: white;
+ line-height: 1.2;
+ }
+
+ .nav-profile-meta {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 0.72rem;
color: var(--text-muted);
- text-decoration: none;
- font-size: 0.85rem;
- font-weight: 500;
+ margin-top: 2px;
+ }
+
+ .meta-dot {
+ color: rgba(255, 255, 255, 0.15);
+ }
+
+ .nav-badge {
+ display: inline-flex;
+ align-items: center;
+ padding: 1px 6px;
+ border-radius: 4px;
+ font-weight: 700;
+ font-size: 0.65rem;
+ background-color: rgba(79, 70, 229, 0.15);
+ color: #a5b4fc;
+ border: 1px solid rgba(79, 70, 229, 0.3);
+ text-transform: uppercase;
+ letter-spacing: 0.3px;
+ }
+
+ .nav-badge.sso {
+ background-color: rgba(16, 185, 129, 0.15);
+ color: #34d399;
+ border-color: rgba(16, 185, 129, 0.3);
+ }
+
+ /* Top Header Actions */
+ .nav-actions {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ }
+
+ .nav-action-btn {
+ font-family: 'Outfit', sans-serif;
+ font-size: 0.8rem;
+ font-weight: 700;
padding: 8px 16px;
border-radius: 8px;
- border: 1px solid var(--card-border);
- transition: all 0.25s ease;
+ text-decoration: none;
+ transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
+ letter-spacing: 0.3px;
+ text-transform: uppercase;
}
- .logout-link:hover {
- color: #ef4444;
- border-color: rgba(239, 68, 68, 0.2);
- background-color: rgba(239, 68, 68, 0.05);
+ .nav-action-btn.admin {
+ color: #38bdf8;
+ background: rgba(56, 189, 248, 0.08);
+ border: 1.5px solid rgba(56, 189, 248, 0.25);
+ box-shadow: 0 0 10px rgba(56, 189, 248, 0.1);
}
- /* Dashboard Wrapper */
+ .nav-action-btn.admin:hover {
+ color: #ffffff;
+ background: #0284c7;
+ border-color: #0284c7;
+ box-shadow: 0 0 15px rgba(56, 189, 248, 0.45);
+ transform: translateY(-1px);
+ }
+
+ .nav-action-btn.logout {
+ color: #ffffff;
+ background: #ef4444;
+ border: 1.5px solid #ef4444;
+ box-shadow: 0 0 12px rgba(239, 68, 68, 0.2);
+ }
+
+ .nav-action-btn.logout:hover {
+ color: #ffffff;
+ background: #dc2626;
+ border-color: #dc2626;
+ box-shadow: 0 0 18px rgba(239, 68, 68, 0.45);
+ transform: translateY(-1px);
+ }
+
+ /* Dashboard Wrapper - Centered & Spaced */
.dashboard-container {
flex: 1;
- padding: 40px 5%;
- max-width: 1200px;
+ padding: 32px 5%;
+ max-width: 960px;
width: 100%;
margin: 0 auto;
z-index: 10;
}
+ /* Services Section - Centered & Grid Layout */
+ .services-container {
+ width: 100%;
+ max-width: 960px;
+ margin: 0 auto;
+ margin-top: 10px; /* Reduced space between profile card and services */
+ }
+
+ .section-title {
+ font-family: 'Outfit', sans-serif;
+ font-size: 1.1rem; /* Slightly smaller size to save space */
+ font-weight: 700;
+ margin-bottom: 12px; /* Reduced margin */
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ }
+
+ .section-title::after {
+ content: '';
+ flex: 1;
+ height: 1px;
+ background: linear-gradient(to right, var(--card-border), transparent);
+ }
+
+ .services-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); /* Clean compact grid columns */
+ gap: 20px; /* Uniform spacing */
+ }
+
+ /* Service Cards - Minimal Box Centered Design */
+ .service-card-glass {
+ background: transparent;
+ border: none;
+ padding: 8px;
+ cursor: pointer;
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.3s ease;
+ text-decoration: none;
+ }
+
+ /* Prioritized Service Logo/Icon Wrapper - 90px x 90px with defined border */
+ .service-logo-wrapper {
+ width: 90px;
+ height: 90px;
+ border-radius: 22px; /* Rounded edge shape */
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(17, 24, 39, 0.4); /* Dark semitransparent background */
+ border: 1.5px solid rgba(255, 255, 255, 0.08); /* Distinct visible border */
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
+ margin-bottom: 12px;
+ transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
+ color: var(--service-color);
+ opacity: 0.95;
+ overflow: hidden;
+ position: relative;
+ }
+
+ .service-logo-wrapper svg {
+ width: 38px; /* Balanced icon size inside 90px box */
+ height: 38px;
+ transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
+ }
+
+ .service-card-glass:hover .service-logo-wrapper {
+ transform: translateY(-4px); /* Moves only the box slightly up */
+ background: rgba(255, 255, 255, 0.05);
+ border-color: var(--service-color);
+ opacity: 1;
+ box-shadow:
+ 0 8px 24px rgba(0, 0, 0, 0.3),
+ 0 0 20px color-mix(in srgb, var(--service-color) 45%, transparent);
+ }
+
+ .service-card-glass:hover .service-logo-wrapper svg {
+ transform: scale(1.05);
+ }
+
+ /* Uploaded Service Logo - Fitted fully inside the rounded 90px box */
+ .service-logo-img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover; /* Cover/fully fill the box like a profile image */
+ padding: 0; /* Zero padding to fill the box completely */
+ border-radius: inherit; /* inherit round corner shape from wrapper */
+ filter: grayscale(10%) brightness(0.95);
+ opacity: 0.95;
+ transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
+ }
+
+ .service-card-glass:hover .service-logo-img {
+ filter: grayscale(0%) brightness(1);
+ opacity: 1;
+ transform: scale(1.05);
+ }
+
+ /* Centered Uppercase Labels */
+ .service-title {
+ font-family: 'Outfit', sans-serif;
+ font-size: 0.72rem; /* Clean text scale */
+ font-weight: 700;
+ color: rgba(255, 255, 255, 0.65); /* Faint gray */
+ margin-top: 4px;
+ margin-bottom: 0;
+ letter-spacing: 0.5px;
+ transition: color 0.3s ease;
+ text-transform: uppercase;
+ text-align: center;
+ }
+
+ .service-card-glass:hover .service-title {
+ color: #ffffff;
+ }
+
+ .service-subtitle {
+ display: none;
+ }
+
/* Profile Banner Widget */
.profile-card {
background-color: var(--card-bg);
@@ -247,92 +458,7 @@
box-shadow: 0 0 10px var(--success-color);
}
- /* Services Grid */
- .section-title {
- font-family: 'Outfit', sans-serif;
- font-size: 1.4rem;
- font-weight: 700;
- margin-bottom: 24px;
- display: flex;
- align-items: center;
- gap: 10px;
- }
- .section-title::after {
- content: '';
- flex: 1;
- height: 1px;
- background: linear-gradient(to right, var(--card-border), transparent);
- }
-
- .services-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
- gap: 16px;
- }
-
- /* Service Cards - Small */
- .service-card-small {
- background-color: var(--card-bg);
- border: 1px solid var(--card-border);
- border-radius: 12px;
- padding: 16px;
- cursor: pointer;
- position: relative;
- overflow: hidden;
- display: flex;
- align-items: center;
- gap: 14px;
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
- backdrop-filter: blur(8px);
- }
-
- .service-card-small:hover {
- transform: translateY(-3px);
- border-color: rgba(255, 255, 255, 0.15);
- box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
- }
-
- .service-icon-wrapper-small {
- width: 44px;
- height: 44px;
- border-radius: 8px;
- display: flex;
- align-items: center;
- justify-content: center;
- flex-shrink: 0;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
- transition: transform 0.3s ease;
- }
-
- .service-card-small:hover .service-icon-wrapper-small {
- transform: scale(1.08);
- }
-
- .service-icon-wrapper-small svg {
- width: 24px;
- height: 24px;
- }
-
- .service-info-small {
- display: flex;
- flex-direction: column;
- gap: 2px;
- }
-
- .service-name-small {
- font-family: 'Outfit', sans-serif;
- font-size: 1rem;
- font-weight: 600;
- color: var(--text-main);
- margin: 0;
- }
-
- .service-tag-small {
- font-size: 0.7rem;
- color: var(--text-muted);
- align-self: flex-start;
- }
/* Fullscreen SSO Modal Overlay */
.sso-modal {
@@ -434,105 +560,140 @@
}
@media (max-width: 768px) {
- .profile-card {
- flex-direction: column;
- align-items: flex-start;
- padding: 24px;
+ .nav-profile-meta {
+ display: none; /* Hide email & badges on mobile to keep header clean */
}
- .nav-user {
- margin-top: 10px;
- width: 100%;
- display: flex;
- justify-content: flex-start;
+ .navbar {
+ padding: 10px 16px;
+ }
+ .nav-profile-welcome {
+ font-size: 0.85rem;
+ }
+ .nav-profile-avatar img, .nav-profile-avatar-fallback {
+ width: 32px;
+ height: 32px;
+ font-size: 0.8rem;
+ }
+ .nav-actions {
+ gap: 8px;
+ }
+ .nav-action-btn {
+ padding: 6px 12px;
+ font-size: 0.7rem;
+ }
+ .dashboard-container {
+ padding: 24px 16px;
+ }
+ .services-grid {
+ grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
+ gap: 10px;
}
}
-
-
-
-
-
-
-
- @if($user->avatar)
-

- @else
-
- {{ strtoupper(substr($user->name, 0, 1)) }}
-
+
+
+
+
+
+ @if($user->avatar)
+

+ @else
+
+ {{ strtoupper(substr($user->name, 0, 1)) }}
+
+ @endif
+
+
+
Welcome, {{ $user->name }}
+
+ {{ $user->email }}
+ •
+
+ @if($user->isAdmin())
+ Admin
+ @elseif($user->roles->isNotEmpty())
+ {{ $user->roles->pluck('name')->implode(', ') }}
+ @else
+ {{ ucfirst($user->role) }}
+ @endif
+
+ @if($user->microsoft_id)
+ •
+ Microsoft Linked
@endif
-
-
Welcome, {{ $user->name }}
-
- {{ $user->email }}
- •
-
- @if($user->isAdmin())
- Admin
- @elseif($user->roles->isNotEmpty())
- {{ $user->roles->pluck('name')->implode(', ') }}
- @else
- {{ ucfirst($user->role) }}
- @endif
-
- @if($user->microsoft_id)
- Microsoft Linked
- @endif
-
-
-
-
-
+
-
-
+
+
+
+
+
+
Authorized Corporate Services
@foreach($services as $service)
-
-
+
+
+
@if($service['logo'])
-
![{{ $service['name'] }}]({{ asset($service['logo']) }})
- @elseif($service['icon_svg'] === 'outlook')
-
@else
-
 }})
+
+ {{ strtoupper(substr($service['name'], 0, 1)) }}
+
@endif
-
-
{{ $service['name'] }}
- {{ $service['tag'] }}
-
+
+
+
{{ strtoupper($service['name']) }}
@endforeach