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()) +
+ ⚠️ +
+ +
+
+ @endif + @if(session('error'))
⚠️ @@ -604,7 +617,7 @@
- +
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) - {{ $user->name }} - @else -
- {{ strtoupper(substr($user->name, 0, 1)) }} -
+ +
+
- -
+ + + + + +
+ + +

Authorized Corporate Services

@foreach($services as $service) -
-
+
+ +
@if($service['logo']) - {{ $service['name'] }} - @elseif($service['icon_svg'] === 'outlook') - - + {{ $service['name'] }} + @elseif($service['icon_svg'] === 'outlook' || (empty($service['icon_svg']) && (str_contains(strtolower($service['name']), 'outlook') || str_contains(strtolower($service['name']), 'mail')))) + + + + - @elseif($service['icon_svg'] === 'teams') - - + @elseif($service['icon_svg'] === 'teams' || (empty($service['icon_svg']) && (str_contains(strtolower($service['name']), 'teams') || str_contains(strtolower($service['name']), 'microsoft')))) + + + + + - @elseif($service['icon_svg'] === 'keka') - - + @elseif($service['icon_svg'] === 'keka' || (empty($service['icon_svg']) && str_contains(strtolower($service['name']), 'keka'))) + + + + + + - @elseif(str_starts_with($service['icon_svg'] ?? '', ' + {{ strtoupper(substr($service['icon_svg'], 0, 2)) }} +
@else - Default Logo +
+ {{ strtoupper(substr($service['name'], 0, 1)) }} +
@endif
-
-

{{ $service['name'] }}

- {{ $service['tag'] }} -
+ + +

{{ strtoupper($service['name']) }}

@endforeach