-
 }})
+
You’ve been signed out. Redirecting…
Go to ladill.com
diff --git a/resources/views/layouts/email.blade.php b/resources/views/layouts/email.blade.php
index 15d31e4..9ecf02b 100644
--- a/resources/views/layouts/email.blade.php
+++ b/resources/views/layouts/email.blade.php
@@ -40,7 +40,9 @@
'homeActive' => request()->routeIs('email.dashboard'),
'searchUrl' => route('email.mailboxes.index'),
'searchActive' => request()->routeIs('email.mailboxes.*'),
- 'notificationsUrl' => $navAcct.'/notifications',
+ 'notificationsUrl' => route('notifications.index'),
+ 'notificationsActive' => request()->routeIs('notifications.*'),
+ 'unreadUrl' => route('notifications.unread'),
'profileActive' => false,
'profileName' => $navUser?->name ?? '',
'profileSubtitle' => $navUser?->email ?? '',
diff --git a/resources/views/layouts/hosting.blade.php b/resources/views/layouts/hosting.blade.php
index 9853416..3de0095 100644
--- a/resources/views/layouts/hosting.blade.php
+++ b/resources/views/layouts/hosting.blade.php
@@ -39,7 +39,9 @@
'homeActive' => request()->routeIs('hosting.dashboard') || request()->routeIs('hosting.index'),
'searchUrl' => route('hosting.dashboard'),
'searchActive' => request()->routeIs('hosting.*'),
- 'notificationsUrl' => $navAcct.'/notifications',
+ 'notificationsUrl' => route('notifications.index'),
+ 'notificationsActive' => request()->routeIs('notifications.*'),
+ 'unreadUrl' => route('notifications.unread'),
'profileActive' => false,
'profileName' => $navUser?->name ?? '',
'profileSubtitle' => $navUser?->email ?? '',
diff --git a/resources/views/notifications/_list.blade.php b/resources/views/notifications/_list.blade.php
new file mode 100644
index 0000000..09c6ebb
--- /dev/null
+++ b/resources/views/notifications/_list.blade.php
@@ -0,0 +1,93 @@
+
+
+
+
Notifications
+
{{ $subtitle ?? 'Stay updated on your account activity.' }}
+
+ @if ($notifications->where('read_at', null)->count() > 0)
+
+ @endif
+
+
+
+ @forelse ($notifications as $notification)
+ @php
+ $data = $notification->data;
+ $icon = $data['icon'] ?? 'bell';
+ $iconBg = match ($icon) {
+ 'domain' => 'bg-emerald-50',
+ 'hosting' => 'bg-violet-50',
+ 'email' => 'bg-pink-50',
+ 'billing' => 'bg-amber-50',
+ 'success' => 'bg-green-50',
+ default => 'bg-slate-100',
+ };
+ $iconColor = match ($icon) {
+ 'domain' => 'text-emerald-600',
+ 'hosting' => 'text-violet-600',
+ 'email' => 'text-pink-600',
+ 'billing' => 'text-amber-600',
+ 'success' => 'text-green-600',
+ default => 'text-slate-500',
+ };
+ @endphp
+
+
+ @if ($icon === 'domain' && view()->exists('components.icons.domain-globe'))
+ @include('components.icons.domain-globe', ['class' => 'h-5 w-5 ' . $iconColor])
+ @elseif ($icon === 'email')
+
+ @elseif ($icon === 'hosting')
+
+ @elseif ($icon === 'billing')
+
+ @elseif ($icon === 'success')
+
+ @else
+
+ @endif
+
+
+
+
+
{{ $data['title'] ?? 'Notification' }}
+
{{ $data['message'] ?? '' }}
+
+
{{ $notification->created_at->diffForHumans() }}
+
+ @if (! empty($data['url']))
+
+ View details →
+
+ @endif
+
+ @if (! $notification->read_at)
+
+ @endif
+
+ @empty
+
+
+
No notifications
+
{{ $emptyMessage ?? "You're all caught up." }}
+
+ @endforelse
+
+
+ @if ($notifications->hasPages())
+
{{ $notifications->links() }}
+ @endif
+
diff --git a/resources/views/notifications/index.blade.php b/resources/views/notifications/index.blade.php
new file mode 100644
index 0000000..9901476
--- /dev/null
+++ b/resources/views/notifications/index.blade.php
@@ -0,0 +1,10 @@
+@extends('layouts.hosting')
+
+@section('title', 'Notifications')
+
+@section('content')
+ @include('notifications._list', [
+ 'subtitle' => 'Hosting activity for your account.',
+ 'emptyMessage' => "You're all caught up. We'll notify you when something happens with your hosting.",
+ ])
+@endsection
diff --git a/resources/views/partials/notification-dropdown.blade.php b/resources/views/partials/notification-dropdown.blade.php
new file mode 100644
index 0000000..0cde085
--- /dev/null
+++ b/resources/views/partials/notification-dropdown.blade.php
@@ -0,0 +1,108 @@
+{{-- In-app notification bell + dropdown (scoped to this app). --}}
+
@auth
- {{-- Notifications (desktop header) --}}
-
-
-
+ @include('partials.notification-dropdown')
diff --git a/routes/web.php b/routes/web.php
index a9d6b65..8c7dca2 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -11,6 +11,7 @@ use App\Http\Controllers\Hosting\HostingTerminalSessionController;
use App\Http\Controllers\Hosting\OverviewController;
use App\Http\Controllers\Hosting\SearchController;
use App\Http\Controllers\Hosting\TeamController;
+use App\Http\Controllers\NotificationController;
use Illuminate\Support\Facades\Route;
$serversApp = fn (string $path = ''): string => 'https://'.config('app.servers_domain').($path !== '' ? '/'.ltrim($path, '/') : '');
@@ -29,6 +30,11 @@ Route::get('/sso/logout-frontchannel', [SsoLoginController::class, 'frontchannel
Route::get('/signed-out', fn () => auth()->check() ? redirect()->route('hosting.dashboard') : view('hosting.signed-out'))->name('hosting.signed-out');
Route::middleware(['auth'])->group(function () use ($serversApp) {
+ Route::get('/notifications', [NotificationController::class, 'index'])->name('notifications.index');
+ Route::get('/notifications/unread', [NotificationController::class, 'unread'])->name('notifications.unread');
+ Route::post('/notifications/{id}/read', [NotificationController::class, 'markAsRead'])->name('notifications.mark-read');
+ Route::post('/notifications/mark-all-read', [NotificationController::class, 'markAllAsRead'])->name('notifications.mark-all-read');
+
Route::get('/search', SearchController::class)->name('hosting.search');
Route::get('/dashboard', [OverviewController::class, 'index'])->name('hosting.dashboard');