From ab3134de1363fe1d8f05eb96583c25bd216ba109 Mon Sep 17 00:00:00 2001 From: Mark Gregory Date: Sat, 12 Sep 2026 21:04:45 +0100 Subject: [PATCH] updates for admin area --- REWORK_NOTES.md | 26 +++++++ .../Account/DashboardController.php | 26 +++++++ .../Controllers/Account/PageController.php | 46 +++++++++++ .../Controllers/Admin/ActionController.php | 55 +++++++++++++ .../Controllers/Admin/DashboardController.php | 16 +++- .../Controllers/Admin/SectionController.php | 54 +++++++++---- app/Http/Controllers/DjController.php | 32 +++++--- bootstrap/app.php | 2 +- public/build/assets/app-4ylyCDk1.css | 1 - public/build/assets/app-B873fQy4.css | 1 + .../{app-DMsN-rLE.js => app-fQMWg8Nx.js} | 12 +-- public/build/manifest.json | 4 +- resources/css/app.css | 18 ++++- resources/js/app.js | 31 +++++++- resources/views/account/bookings.blade.php | 8 ++ resources/views/account/dashboard.blade.php | 16 ++++ resources/views/account/enquiries.blade.php | 8 ++ resources/views/account/profile.blade.php | 13 ++++ resources/views/admin/dashboard.blade.php | 51 +++--------- .../views/admin/sections/bookings.blade.php | 4 + .../views/admin/sections/clients.blade.php | 4 + .../views/admin/sections/content.blade.php | 4 + resources/views/admin/sections/djs.blade.php | 4 + .../views/admin/sections/messages.blade.php | 4 + .../admin/sections/notifications.blade.php | 4 + .../views/admin/sections/payments.blade.php | 4 + .../views/admin/sections/privacy.blade.php | 4 + .../views/admin/sections/reports.blade.php | 4 + .../views/admin/sections/reviews.blade.php | 4 + .../views/admin/sections/roles.blade.php | 4 + .../views/admin/sections/settings.blade.php | 4 + .../views/admin/sections/support.blade.php | 4 + .../views/admin/sections/users.blade.php | 4 + resources/views/djs/_card.blade.php | 2 +- resources/views/djs/index.blade.php | 8 +- resources/views/djs/show.blade.php | 9 ++- resources/views/home/index.blade.php | 9 ++- resources/views/layouts/account.blade.php | 23 ++++++ resources/views/layouts/admin.blade.php | 47 +++++++++++ resources/views/layouts/app.blade.php | 78 +++++++------------ routes/web.php | 15 +++- tests/Feature/AccountAndAdminRoutesTest.php | 36 +++++++++ tests/Feature/AuthenticationTest.php | 7 ++ 43 files changed, 573 insertions(+), 137 deletions(-) create mode 100644 REWORK_NOTES.md create mode 100644 app/Http/Controllers/Account/DashboardController.php create mode 100644 app/Http/Controllers/Account/PageController.php create mode 100644 app/Http/Controllers/Admin/ActionController.php delete mode 100644 public/build/assets/app-4ylyCDk1.css create mode 100644 public/build/assets/app-B873fQy4.css rename public/build/assets/{app-DMsN-rLE.js => app-fQMWg8Nx.js} (51%) create mode 100644 resources/views/account/bookings.blade.php create mode 100644 resources/views/account/dashboard.blade.php create mode 100644 resources/views/account/enquiries.blade.php create mode 100644 resources/views/account/profile.blade.php create mode 100644 resources/views/admin/sections/bookings.blade.php create mode 100644 resources/views/admin/sections/clients.blade.php create mode 100644 resources/views/admin/sections/content.blade.php create mode 100644 resources/views/admin/sections/djs.blade.php create mode 100644 resources/views/admin/sections/messages.blade.php create mode 100644 resources/views/admin/sections/notifications.blade.php create mode 100644 resources/views/admin/sections/payments.blade.php create mode 100644 resources/views/admin/sections/privacy.blade.php create mode 100644 resources/views/admin/sections/reports.blade.php create mode 100644 resources/views/admin/sections/reviews.blade.php create mode 100644 resources/views/admin/sections/roles.blade.php create mode 100644 resources/views/admin/sections/settings.blade.php create mode 100644 resources/views/admin/sections/support.blade.php create mode 100644 resources/views/admin/sections/users.blade.php create mode 100644 resources/views/layouts/account.blade.php create mode 100644 resources/views/layouts/admin.blade.php create mode 100644 tests/Feature/AccountAndAdminRoutesTest.php diff --git a/REWORK_NOTES.md b/REWORK_NOTES.md new file mode 100644 index 0000000..51814ab --- /dev/null +++ b/REWORK_NOTES.md @@ -0,0 +1,26 @@ +# BeatBook UI / Backend Rework + +## Completed +- Replaced the generic admin placeholder with real section views for users, DJs, clients, bookings, payments, reviews, messages, notifications, support, reports, content, roles, privacy and settings. +- Added admin actions for role changes, DJ publish/feature controls, review moderation and cache clearing. +- Replaced the non-clickable client dashboard with account routes for overview, enquiries, bookings and editable account details. +- Added responsive admin navigation with a mobile drawer. +- Added responsive public navigation and mobile menu. +- Rebuilt home, DJ directory and DJ profile layouts for desktop, tablet and mobile. +- Added sorting to the DJ directory. +- Added route coverage tests for account and admin pages. +- Made auth tests explicitly bypass request-forgery middleware during automated tests only. +- Restored a clean Laravel .gitignore and ensured composer.lock is not ignored. +- Updated Laravel 13 request-forgery middleware API usage. + +## Notes +Messages, notifications and support now have proper destinations and admin presentation, but the project currently has no dedicated conversation/support database schema. Their pages therefore show deliberate empty states until those workflows/models are added. + +After applying the files run: + + composer install + npm install + npm run build + php artisan optimize:clear + php artisan test + ./vendor/bin/pint diff --git a/app/Http/Controllers/Account/DashboardController.php b/app/Http/Controllers/Account/DashboardController.php new file mode 100644 index 0000000..b06c7cb --- /dev/null +++ b/app/Http/Controllers/Account/DashboardController.php @@ -0,0 +1,26 @@ +user(); + + return view('account.dashboard', [ + 'user' => $user, + 'enquiries' => $user->enquiries()->with('djProfile')->latest()->take(5)->get(), + 'bookings' => $user->bookings()->with('djProfile')->latest('event_date')->take(5)->get(), + 'stats' => [ + 'enquiries' => $user->enquiries()->count(), + 'bookings' => $user->bookings()->count(), + 'upcoming' => $user->bookings()->whereDate('event_date', '>=', today())->count(), + ], + ]); + } +} diff --git a/app/Http/Controllers/Account/PageController.php b/app/Http/Controllers/Account/PageController.php new file mode 100644 index 0000000..94f3766 --- /dev/null +++ b/app/Http/Controllers/Account/PageController.php @@ -0,0 +1,46 @@ + $request->user()->enquiries()->with('djProfile')->latest()->paginate(12), + ]); + } + + public function bookings(Request $request): View + { + return view('account.bookings', [ + 'bookings' => $request->user()->bookings()->with(['djProfile', 'review'])->latest('event_date')->paginate(12), + ]); + } + + public function profile(Request $request): View + { + return view('account.profile', ['user' => $request->user()]); + } + + public function updateProfile(Request $request): RedirectResponse + { + $user = $request->user(); + $data = $request->validate([ + 'name' => ['required', 'string', 'max:120'], + 'email' => ['required', 'email', 'max:190', Rule::unique('users')->ignore($user->id)], + 'phone' => ['nullable', 'string', 'max:40'], + 'marketing_opt_in' => ['nullable', 'boolean'], + ]); + $data['marketing_opt_in'] = $request->boolean('marketing_opt_in'); + $user->update($data); + + return back()->with('success', 'Your account details have been updated.'); + } +} diff --git a/app/Http/Controllers/Admin/ActionController.php b/app/Http/Controllers/Admin/ActionController.php new file mode 100644 index 0000000..749623b --- /dev/null +++ b/app/Http/Controllers/Admin/ActionController.php @@ -0,0 +1,55 @@ +validate(['role' => ['required', 'in:super-admin,admin,dj,client,moderator,support']]); + $role = Role::firstOrCreate(['name' => $data['role'], 'guard_name' => 'web']); + $user->syncRoles([$role]); + app(PermissionRegistrar::class)->forgetCachedPermissions(); + + return back()->with('success', "{$user->name}'s role has been updated."); + } + + public function toggleDjPublished(DjProfile $djProfile): RedirectResponse + { + $djProfile->update(['is_published' => ! $djProfile->is_published]); + + return back()->with('success', 'DJ publication status updated.'); + } + + public function toggleDjFeatured(DjProfile $djProfile): RedirectResponse + { + $djProfile->update(['is_featured' => ! $djProfile->is_featured]); + + return back()->with('success', 'DJ featured status updated.'); + } + + public function reviewStatus(Request $request, Review $review): RedirectResponse + { + $data = $request->validate(['status' => ['required', 'in:pending,published,rejected']]); + $review->update($data); + + return back()->with('success', 'Review moderation status updated.'); + } + + public function clearCaches(): RedirectResponse + { + Cache::flush(); + + return back()->with('success', 'Application cache cleared.'); + } +} diff --git a/app/Http/Controllers/Admin/DashboardController.php b/app/Http/Controllers/Admin/DashboardController.php index 8f77550..651df60 100644 --- a/app/Http/Controllers/Admin/DashboardController.php +++ b/app/Http/Controllers/Admin/DashboardController.php @@ -5,13 +5,25 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\Booking; use App\Models\DjProfile; +use App\Models\Enquiry; use App\Models\Review; use App\Models\User; +use Illuminate\View\View; class DashboardController extends Controller { - public function __invoke() + public function __invoke(): View { - return view('admin.dashboard', ['stats' => ['users' => User::count(), 'djs' => DjProfile::count(), 'bookings' => Booking::count(), 'reviews' => Review::where('status', 'pending')->count()]]); + return view('admin.dashboard', [ + 'stats' => [ + 'users' => User::count(), + 'djs' => DjProfile::count(), + 'bookings' => Booking::count(), + 'pending reviews' => Review::where('status', 'pending')->count(), + ], + 'recentUsers' => User::latest()->take(6)->get(), + 'recentEnquiries' => Enquiry::with(['user', 'djProfile'])->latest()->take(6)->get(), + 'recentBookings' => Booking::with(['client', 'djProfile'])->latest()->take(6)->get(), + ]); } } diff --git a/app/Http/Controllers/Admin/SectionController.php b/app/Http/Controllers/Admin/SectionController.php index 667e7f0..d4266b0 100644 --- a/app/Http/Controllers/Admin/SectionController.php +++ b/app/Http/Controllers/Admin/SectionController.php @@ -9,29 +9,51 @@ use App\Models\DjProfile; use App\Models\Enquiry; use App\Models\Review; use App\Models\User; +use Illuminate\Http\Request; use Illuminate\View\View; +use Spatie\Permission\Models\Role; class SectionController extends Controller { - public function __invoke(string $section): View + private const SECTIONS = [ + 'users', 'djs', 'clients', 'bookings', 'payments', 'reviews', 'messages', + 'notifications', 'support', 'reports', 'content', 'roles', 'privacy', 'settings', + ]; + + public function __invoke(Request $request, string $section): View { - $allowed = [ - 'users', 'djs', 'clients', 'bookings', 'payments', 'reviews', 'messages', - 'notifications', 'support', 'reports', 'content', 'roles', 'privacy', 'settings', + abort_unless(in_array($section, self::SECTIONS, true), 404); + + $data = [ + 'section' => $section, + 'counts' => [ + 'users' => User::count(), + 'djs' => DjProfile::count(), + 'businesses' => Business::count(), + 'clients' => User::whereHas('roles', fn ($query) => $query->where('name', 'client'))->count(), + 'bookings' => Booking::count(), + 'enquiries' => Enquiry::count(), + 'reviews' => Review::count(), + ], ]; - abort_unless(in_array($section, $allowed, true), 404); + $data += match ($section) { + 'users' => ['users' => User::with('roles')->latest()->paginate(20)], + 'djs' => ['djs' => DjProfile::with(['user', 'business'])->latest()->paginate(20)], + 'clients' => ['clients' => User::whereHas('roles', fn ($query) => $query->where('name', 'client'))->withCount(['enquiries', 'bookings'])->latest()->paginate(20)], + 'bookings' => ['bookings' => Booking::with(['client', 'djProfile'])->latest('event_date')->paginate(20)], + 'payments' => ['bookings' => Booking::with(['client', 'djProfile'])->latest()->paginate(20)], + 'reviews' => ['reviews' => Review::with(['user', 'djProfile'])->latest()->paginate(20)], + 'roles' => ['roles' => Role::withCount('users')->orderBy('name')->get()], + 'reports' => ['report' => [ + 'booking_value' => Booking::sum('total'), + 'deposits' => Booking::sum('deposit'), + 'published_djs' => DjProfile::where('is_published', true)->count(), + 'pending_reviews' => Review::where('status', 'pending')->count(), + ]], + default => [], + }; - $counts = [ - 'users' => User::count(), - 'djs' => DjProfile::count(), - 'businesses' => Business::count(), - 'clients' => User::role('client')->count(), - 'bookings' => Booking::count(), - 'enquiries' => Enquiry::count(), - 'reviews' => Review::count(), - ]; - - return view('admin.section', compact('section', 'counts')); + return view("admin.sections.{$section}", $data); } } diff --git a/app/Http/Controllers/DjController.php b/app/Http/Controllers/DjController.php index de0f3ab..9e5fbf3 100644 --- a/app/Http/Controllers/DjController.php +++ b/app/Http/Controllers/DjController.php @@ -4,26 +4,40 @@ namespace App\Http\Controllers; use App\Models\DjProfile; use Illuminate\Http\Request; +use Illuminate\View\View; class DjController extends Controller { - public function index(Request $r) + public function index(Request $request): View { - $q = DjProfile::query()->where('is_published', true)->with('genres'); - if ($r->filled('location')) { - $q->where('city', 'like', '%'.$r->string('location').'%'); - } if ($r->filled('max_price')) { - $q->where('price_from', '<=', $r->integer('max_price')); + $query = DjProfile::query()->where('is_published', true)->with('genres'); + + if ($request->filled('location')) { + $query->where('city', 'like', '%'.$request->string('location').'%'); } -return view('djs.index', ['djs' => $q->orderByDesc('is_featured')->orderByDesc('average_rating')->paginate(12)->withQueryString()]); + if ($request->filled('max_price')) { + $query->where('price_from', '<=', $request->integer('max_price')); + } + + $query->orderByDesc('is_featured'); + + match ($request->string('sort')->toString()) { + 'price_low' => $query->orderBy('price_from'), + 'price_high' => $query->orderByDesc('price_from'), + default => $query->orderByDesc('average_rating'), + }; + + return view('djs.index', ['djs' => $query->paginate(12)->withQueryString()]); } - public function show(DjProfile $djProfile) + public function show(DjProfile $djProfile): View { abort_unless($djProfile->is_published, 404); - return view('djs.show', ['dj' => $djProfile->load(['genres', 'reviews' => fn ($q) => $q->where('status', 'published')->latest()])]); + return view('djs.show', [ + 'dj' => $djProfile->load(['genres', 'reviews' => fn ($query) => $query->where('status', 'published')->latest()]), + ]); } public function apiIndex() diff --git a/bootstrap/app.php b/bootstrap/app.php index bd5b687..d2b808f 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -16,7 +16,7 @@ return Application::configure(basePath: dirname(__DIR__)) health: '/up', ) ->withMiddleware(function (Middleware $middleware): void { - $middleware->validateCsrfTokens(except: ['stripe/*']); + $middleware->preventRequestForgery(except: ['stripe/*']); $middleware->alias([ 'role' => RoleMiddleware::class, diff --git a/public/build/assets/app-4ylyCDk1.css b/public/build/assets/app-4ylyCDk1.css deleted file mode 100644 index ee26f1e..0000000 --- a/public/build/assets/app-4ylyCDk1.css +++ /dev/null @@ -1 +0,0 @@ -@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.static{position:static}.hidden{display:none}.table{display:table}.lowercase{text-transform:lowercase}}:root{--ink:#070a19;--panel:#0d1228;--purple:#7c3aed;--pink:#ec4899;--cyan:#22d3ee;--gold:#fbbf24}*{box-sizing:border-box}body{color:#f8fafc;background:#070a19;margin:0;font-family:Inter,ui-sans-serif,system-ui,sans-serif}.shell{max-width:1280px;margin:auto;padding:0 24px}.nav{justify-content:space-between;align-items:center;height:76px;display:flex}.brand{color:#fff;font-size:25px;font-weight:900;text-decoration:none}.brand b{color:#ec4899}.navlinks{gap:28px;display:flex}.navlinks a{color:#dbeafe;font-size:14px;text-decoration:none}.button{background:linear-gradient(135deg,var(--purple),var(--pink));color:#fff;border:0;border-radius:12px;padding:13px 20px;font-weight:800;text-decoration:none;display:inline-flex}.button.ghost{background:0 0;border:1px solid #334155}.hero{background:linear-gradient(90deg,#070a19f7,#070a19b8 50%,#070a1940),url(https://images.unsplash.com/photo-1571266028243-d220c9c3b2d2?auto=format&fit=crop&w=2000&q=85) 50%/cover;border-bottom:1px solid #202743;min-height:610px}.hero-copy{max-width:760px;padding:105px 0 35px}.eyebrow{color:#67e8f9;letter-spacing:.18em;text-transform:uppercase;font-weight:800}.hero h1{letter-spacing:-.05em;margin:14px 0 22px;font-size:72px;line-height:.95}.hero h1 span{color:#0000;background:linear-gradient(90deg,#c084fc,#f472b6,#22d3ee);-webkit-background-clip:text;background-clip:text}.hero p{color:#cbd5e1;max-width:620px;font-size:19px}.searchbox{background:#fff;border-radius:18px;grid-template-columns:1.2fr 1fr 1fr auto;gap:8px;margin-top:34px;padding:10px;display:grid;box-shadow:0 25px 80px #0008}.searchbox input,.searchbox select{color:#0f172a;background:#f8fafc;border:0;border-radius:10px;outline:none;padding:17px}.section{padding:72px 0}.section-head{justify-content:space-between;align-items:end;margin-bottom:25px;display:flex}.section h2{margin:0;font-size:34px}.muted{color:#94a3b8}.cards{grid-template-columns:repeat(4,1fr);gap:18px;display:grid}.card{background:#10162d;border:1px solid #27304d;border-radius:18px;overflow:hidden;box-shadow:0 14px 35px #0004}.card-img{background:50%/cover;height:235px}.card-body{padding:18px}.card h3{margin:0 0 8px;font-size:20px}.stars{color:var(--gold)}.price{margin:14px 0;font-size:20px;font-weight:900}.chips{flex-wrap:wrap;gap:7px;display:flex}.chip{color:#cbd5e1;background:#1e293b;border-radius:99px;padding:6px 9px;font-size:12px}.profile-hero{background:50%/cover;height:350px;position:relative}.profile-panel{color:#0f172a;background:#fff;border-radius:22px;grid-template-columns:130px 1fr 220px;gap:25px;margin:-90px auto 40px;padding:30px;display:grid;position:relative;box-shadow:0 30px 70px #0007}.avatar{object-fit:cover;border-radius:16px;width:130px;height:130px}.admin{color:#0f172a;background:#f8fafc;grid-template-columns:240px 1fr;min-height:100vh;display:grid}.sidebar{color:#fff;background:#0b1022;padding:28px 18px}.sidebar a{color:#cbd5e1;border-radius:8px;padding:11px;text-decoration:none;display:block}.sidebar a:hover{background:#1e293b}.admin-main{padding:35px}.stats{grid-template-columns:repeat(4,1fr);gap:18px;display:grid}.stat{background:#fff;border-radius:14px;padding:24px;box-shadow:0 3px 15px #0f172a0d}.stat strong{color:#7c3aed;font-size:30px;display:block}.cookie{color:#0f172a;z-index:50;background:#fff;border-radius:16px;max-width:650px;padding:18px;position:fixed;bottom:18px;left:18px;right:18px;box-shadow:0 20px 60px #0008}@media(max-width:900px){.navlinks{display:none}.hero h1{font-size:50px}.searchbox{grid-template-columns:1fr}.cards{grid-template-columns:1fr 1fr}.profile-panel{grid-template-columns:1fr;margin:-40px 16px 30px}.admin{grid-template-columns:1fr}.sidebar{display:none}.stats{grid-template-columns:1fr 1fr}}@media(max-width:600px){.cards,.stats{grid-template-columns:1fr}.hero h1{font-size:42px}.hero-copy{padding-top:70px}}.nav-actions{align-items:center;gap:9px;display:flex}.inline-form{margin:0;display:inline}.footer{border-top:1px solid #1e293b}.flash{border-radius:12px;margin-top:14px;padding:14px 18px}.flash.success{background:#064e3b}.cookie p{margin:6px 0 12px}.cookie-secondary{color:#0f172a}.auth-page{background:radial-gradient(circle at 20% 15%,#3b076455,#0000 35%),radial-gradient(circle at 85% 35%,#164e6355,#0000 32%),#070a19;min-height:calc(100vh - 160px);padding:70px 24px}.auth-card{background:#10162d;border:1px solid #27304d;border-radius:24px;width:min(100%,520px);margin:0 auto;padding:34px;box-shadow:0 28px 80px #0008}.auth-card h1{margin:10px 0 8px;font-size:36px}.auth-form{gap:16px;margin-top:26px;display:grid}.auth-form label{color:#e2e8f0;gap:8px;font-weight:700;display:grid}.auth-form input{color:#f8fafc;width:100%;font:inherit;background:#0b1022;border:1px solid #334155;border-radius:12px;outline:none;padding:14px 15px}.auth-form input:focus{border-color:#a855f7;box-shadow:0 0 0 3px #a855f722}.auth-form .check-row{grid-template-columns:auto 1fr;align-items:center;font-weight:500;display:flex}.auth-form .check-row input{width:auto}.button.full{cursor:pointer;justify-content:center;width:100%}.auth-links{color:#94a3b8;flex-direction:column;gap:10px;margin-top:22px;display:flex}.auth-links a{color:#67e8f9;text-decoration:none}.form-errors{color:#fecaca;background:#450a0a;border:1px solid #7f1d1d;border-radius:12px;gap:5px;margin-top:18px;padding:14px 16px;display:grid}@media(max-width:900px){.nav-actions{gap:6px}.nav-actions .button{padding:10px 12px}.auth-page{padding:40px 16px}}@media(max-width:600px){.nav{gap:12px;height:auto;min-height:70px}.nav-actions{flex-wrap:wrap;justify-content:flex-end}.auth-card{padding:24px}.auth-card h1{font-size:30px}} diff --git a/public/build/assets/app-B873fQy4.css b/public/build/assets/app-B873fQy4.css new file mode 100644 index 0000000..1fdc030 --- /dev/null +++ b/public/build/assets/app-B873fQy4.css @@ -0,0 +1 @@ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.static{position:static}.hidden{display:none}.table{display:table}.grow{flex-grow:1}.lowercase{text-transform:lowercase}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}:root{--bg:#070914;--panel:#101526;--panel-2:#151c31;--line:#26304a;--text:#f8fafc;--muted:#9aa8bd;--purple:#7c3aed;--pink:#ec4899;--cyan:#22d3ee;--gold:#fbbf24;--white:#fff;--admin-bg:#f5f7fb;--admin-ink:#172033;--admin-muted:#65738a;--admin-line:#e4e9f1;--shadow:0 18px 55px #0000003d}*{box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}a{color:inherit}.shell{width:min(100% - 40px,1240px);margin-inline:auto}.muted{color:var(--muted)}.site-header{-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);z-index:40;background:#070914e0;border-bottom:1px solid #ffffff12;height:76px;position:sticky;top:0}.nav{align-items:center;gap:32px;height:100%;display:flex}.brand{letter-spacing:-.04em;white-space:nowrap;align-items:center;gap:8px;font-size:24px;font-weight:900;text-decoration:none;display:inline-flex}.brand b{color:var(--pink)}.nav-panel{align-items:center;gap:34px;margin-left:auto;display:flex}.navlinks{align-items:center;gap:26px;display:flex}.navlinks a,.text-button{color:#dce5f4;cursor:pointer;font-size:14px;font-weight:700;font:inherit;background:0 0;border:0;padding:8px 0;text-decoration:none}.navlinks a:hover,.text-button:hover{color:#fff}.nav-actions{align-items:center;gap:12px;display:flex}.nav-account-link{color:#fff;align-items:center;gap:8px;font-size:14px;font-weight:800;text-decoration:none;display:flex}.mini-avatar{background:linear-gradient(135deg,var(--purple),var(--pink));border-radius:50%;place-items:center;width:31px;height:31px;font-size:12px;display:grid}.mobile-menu-button{color:#fff;background:0 0;border:1px solid #34405d;border-radius:10px;width:42px;height:42px;margin-left:auto;font-size:21px;display:none}.inline-form{margin:0}.button{background:linear-gradient(135deg,var(--purple),var(--pink));color:#fff;min-height:46px;font:inherit;cursor:pointer;border:0;border-radius:12px;justify-content:center;align-items:center;gap:8px;padding:0 19px;font-size:14px;font-weight:850;text-decoration:none;transition:transform .18s,filter .18s;display:inline-flex;box-shadow:0 9px 24px #7c3aed3d}.button:hover{filter:brightness(1.06);transform:translateY(-1px)}.button.ghost{box-shadow:none;background:0 0;border:1px solid #3a4663}.button.small{min-height:40px;padding:0 15px}.button.full{width:100%}.hero{background:url(https://images.unsplash.com/photo-1571266028243-d220c9c3b2d2?auto=format&fit=crop&w=2200&q=84) 50% 38%/cover no-repeat;align-items:center;min-height:640px;display:flex;position:relative}.hero-shade{background:linear-gradient(90deg,#070914fa,#070914e8 44%,#07091478,#0709142e);position:absolute;inset:0}.hero-layout{z-index:1;position:relative}.hero-copy{max-width:790px;padding:82px 0}.eyebrow{color:#67e8f9;letter-spacing:.18em;text-transform:uppercase;font-size:12px;font-weight:900}.hero h1{letter-spacing:-.06em;max-width:760px;margin:14px 0 22px;font-size:clamp(46px,6vw,78px);line-height:.97}.hero h1 span{color:#0000;background:linear-gradient(90deg,#c084fc,#f472b6,#67e8f9);-webkit-background-clip:text;background-clip:text}.hero-copy>p{color:#c3cede;max-width:650px;font-size:18px;line-height:1.65}.searchbox,.filterbar{background:#fff;border-radius:18px;gap:8px;padding:9px;display:grid;box-shadow:0 24px 70px #0000006b}.searchbox{grid-template-columns:1.2fr 1fr 1fr auto;margin-top:30px}.searchbox label,.filterbar label{background:#f6f8fb;border-radius:11px;gap:3px;padding:8px 12px;display:grid}.searchbox label span,.filterbar label span{color:#64748b;text-transform:uppercase;letter-spacing:.08em;font-size:10px;font-weight:900}.searchbox input,.searchbox select,.filterbar input,.filterbar select{color:#172033;width:100%;min-width:0;font:inherit;background:0 0;border:0;outline:0;font-size:14px}.hero-proof{color:#cbd5e1;flex-wrap:wrap;gap:22px;margin-top:18px;font-size:13px;font-weight:700;display:flex}.section{padding:78px 0}.section-alt{background:#0c1120;border-block:1px solid #ffffff0f}.section-head{justify-content:space-between;align-items:end;gap:24px;margin-bottom:28px;display:flex}.section-head h2,.section-intro h2,.split-feature h2,.pricing-box h2{letter-spacing:-.04em;margin:6px 0 8px;font-size:clamp(30px,4vw,44px)}.section-head p,.section-intro p,.split-feature .lead,.pricing-box p{color:var(--muted);line-height:1.65}.cards{gap:20px;display:grid}.dj-cards{grid-template-columns:repeat(4,minmax(0,1fr))}.card{background:var(--panel);border:1px solid var(--line);border-radius:18px;overflow:hidden;box-shadow:0 12px 34px #0000002e}.dj-card{min-width:0}.card-img{aspect-ratio:4/3;background-position:50%;background-size:cover;display:block}.card-body{padding:18px}.card-title-line{align-items:center;gap:8px;display:flex}.card-title-line h3{letter-spacing:-.02em;margin:0;font-size:19px}.verified{color:#fff;background:#2563eb;border-radius:50%;place-items:center;width:20px;height:20px;font-size:12px;font-weight:900;display:inline-grid}.verified.large{width:25px;height:25px}.stars{color:var(--gold);font-size:14px;font-weight:800}.stars span{color:var(--muted);font-weight:600}.card-body>p{min-height:42px;color:var(--muted);margin:10px 0;font-size:14px;line-height:1.5}.card-foot{border-top:1px solid var(--line);justify-content:space-between;align-items:center;gap:10px;padding-top:14px;display:flex}.card-foot strong{font-size:17px}.card-foot a{color:#a5f3fc;font-size:13px;font-weight:800;text-decoration:none}.steps{grid-template-columns:repeat(4,1fr);gap:18px;margin-top:30px;display:grid}.step-card{border:1px solid var(--line);background:linear-gradient(#11182b,#0e1425);border-radius:18px;padding:26px}.step-card>span{color:#c084fc;font-size:12px;font-weight:900}.step-card h3{margin:26px 0 8px;font-size:21px}.step-card p{color:var(--muted);margin:0;line-height:1.55}.split-feature{grid-template-columns:.9fr 1.1fr;align-items:center;gap:70px;display:grid}.feature-list{grid-template-columns:1fr 1fr;gap:14px;display:grid}.feature-list>div{background:var(--panel);border:1px solid var(--line);border-radius:16px;gap:6px;padding:22px;display:grid}.feature-list span{color:var(--muted);font-size:14px;line-height:1.5}.pricing-section{padding-top:0}.pricing-box{background:linear-gradient(135deg,#1b1141,#10223b);border:1px solid #3a3f68;border-radius:24px;justify-content:space-between;align-items:center;gap:40px;padding:42px;display:flex}.pricing-box>div{max-width:760px}.directory-page{padding:68px 0 82px}.directory-heading{justify-content:space-between;align-items:end;gap:20px;display:flex}.directory-heading h1{letter-spacing:-.05em;margin:6px 0;font-size:clamp(40px,6vw,62px)}.directory-heading p{color:var(--muted)}.results-count,.metric-chip{border:1px solid var(--line);color:#cbd5e1;background:#171e31;border-radius:999px;align-items:center;padding:8px 12px;font-size:12px;font-weight:800;display:inline-flex}.filterbar{grid-template-columns:1.1fr 1fr 1fr auto;margin:28px 0 34px}.directory-empty{grid-column:1/-1}.pagination-wrap{margin-top:32px}.pagination-wrap nav{color:#fff}.profile-hero{background:50%/cover;height:360px}.profile-shell{padding-bottom:80px}.profile-panel{color:#172033;background:#fff;border-radius:22px;grid-template-columns:126px 1fr 210px;align-items:center;gap:24px;margin-top:-82px;padding:26px;display:grid;position:relative;box-shadow:0 24px 70px #00000061}.avatar{object-fit:cover;border-radius:16px;width:126px;height:126px}.profile-title{align-items:center;gap:10px;display:flex}.profile-title h1{letter-spacing:-.04em;margin:0;font-size:36px}.profile-summary p{color:#64748b}.chips{flex-wrap:wrap;gap:7px;display:flex}.chip{color:#526078;background:#eef2f7;border-radius:999px;padding:6px 9px;font-size:11px;font-weight:800}.profile-price{border-left:1px solid #e2e8f0;flex-direction:column;align-items:flex-start;padding-left:22px;display:flex}.profile-price>span,.profile-price small{color:#64748b}.profile-price strong{font-size:36px;line-height:1.1}.profile-price .button{width:100%;margin-top:14px}.profile-grid{grid-template-columns:minmax(0,1fr) 370px;gap:34px;padding-top:38px;display:grid}.profile-section{padding:4px 0 24px}.profile-section h2,.enquiry-card h2{letter-spacing:-.03em;font-size:27px}.profile-bio{color:#aab6c8;font-size:16px;line-height:1.8}.review-card{border-top:1px solid var(--line);padding:20px 0}.review-card h3{margin:8px 0}.review-card p{color:var(--muted);line-height:1.65}.enquiry-card{background:var(--panel);border:1px solid var(--line);border-radius:19px;height:max-content;padding:24px;position:sticky;top:100px}.enquiry-card>p{color:var(--muted)}.enquiry-form,.settings-form{gap:14px;display:grid}.enquiry-form label,.settings-form label{gap:7px;display:grid}.enquiry-form label span,.settings-form label span{color:#b8c5d8;font-size:12px;font-weight:800}.enquiry-form input,.enquiry-form textarea,.settings-form input,.settings-form select{color:#fff;width:100%;font:inherit;background:#0b1020;border:1px solid #34405c;border-radius:10px;padding:12px 13px}.enquiry-form textarea{resize:vertical;min-height:120px}.flash{border-radius:12px;margin-top:14px;padding:13px 16px}.flash.success{background:#064e3b;border:1px solid #047857}.site-footer{background:#080b16;border-top:1px solid #1e293b;padding:56px 0 24px}.footer-grid{grid-template-columns:2fr 1fr 1fr;gap:50px;display:grid}.footer-grid>div{flex-direction:column;gap:10px;display:flex}.footer-grid p{max-width:470px;color:var(--muted);line-height:1.6}.footer-grid a:not(.brand){color:#9aa8bd;font-size:14px;text-decoration:none}.footer-bottom{color:#68768c;border-top:1px solid #1b2235;margin-top:40px;padding-top:22px;font-size:12px}.cookie{z-index:60;color:#172033;background:#fff;border-radius:16px;justify-content:space-between;align-items:center;gap:20px;max-width:720px;padding:18px;display:flex;position:fixed;bottom:20px;left:20px;right:20px;box-shadow:0 22px 70px #00000080}.cookie p{color:#64748b;margin:5px 0 0;font-size:13px}.cookie-actions{flex-shrink:0;gap:8px;display:flex}.cookie .button.ghost{color:#172033;border-color:#cbd5e1}.auth-page{background:radial-gradient(circle at 20% 15%,#7c3aed40,transparent 35%),radial-gradient(circle at 85% 35%,#22d3ee21,transparent 32%),var(--bg);min-height:calc(100vh - 76px);padding:64px 20px}.auth-card{background:var(--panel);border:1px solid var(--line);width:min(100%,510px);box-shadow:var(--shadow);border-radius:22px;margin:auto;padding:32px}.auth-card h1{margin:10px 0 8px;font-size:34px}.auth-form{gap:16px;margin-top:24px;display:grid}.auth-form label{color:#dbe4f2;gap:7px;font-weight:700;display:grid}.auth-form input{color:#fff;width:100%;font:inherit;background:#0a0f1d;border:1px solid #34405d;border-radius:11px;padding:13px 14px}.auth-form .check-row{align-items:center;gap:9px;font-weight:500;display:flex}.auth-form .check-row input{width:auto}.auth-links{color:var(--muted);flex-direction:column;gap:8px;margin-top:20px;display:flex}.auth-links a{color:#67e8f9;text-decoration:none}.form-errors{color:#fecaca;background:#450a0a;border:1px solid #7f1d1d;border-radius:10px;padding:12px 14px}.account-page{min-height:70vh;padding:54px 0 78px}.account-shell{grid-template-columns:240px minmax(0,1fr);gap:28px;display:grid}.account-sidebar{background:var(--panel);border:1px solid var(--line);border-radius:18px;height:max-content;position:sticky;top:100px;overflow:hidden}.account-person{border-bottom:1px solid var(--line);align-items:center;gap:11px;padding:18px;display:flex}.account-avatar{background:linear-gradient(135deg,var(--purple),var(--pink));border-radius:50%;place-items:center;width:42px;height:42px;font-weight:900;display:grid}.account-person div:last-child{min-width:0;display:grid}.account-person span{color:var(--muted);text-overflow:ellipsis;font-size:11px;overflow:hidden}.account-nav{padding:9px}.account-nav a{color:#bac6d8;border-radius:9px;padding:11px 12px;font-size:14px;font-weight:700;text-decoration:none;display:block}.account-nav a:hover,.account-nav a.active{color:#fff;background:#1b2440}.account-content{min-width:0}.page-heading{justify-content:space-between;align-items:flex-end;gap:22px;margin-bottom:24px;display:flex}.page-heading h1{letter-spacing:-.045em;margin:6px 0;font-size:clamp(34px,4vw,48px)}.page-heading p{color:var(--muted);margin:0}.account-stats{grid-template-columns:repeat(3,1fr);gap:14px;margin-bottom:20px;display:grid}.account-stat{background:var(--panel);border:1px solid var(--line);border-radius:15px;padding:20px}.account-stat span{color:var(--muted);font-size:12px;font-weight:800;display:block}.account-stat strong{margin-top:4px;font-size:30px;display:block}.dashboard-grid{grid-template-columns:1fr 1fr;gap:20px;display:grid}.panel{background:var(--panel);border:1px solid var(--line);border-radius:16px;min-width:0;padding:20px}.panel-head{justify-content:space-between;align-items:center;gap:14px;display:flex}.panel-head h2{margin:0;font-size:19px}.panel-head a,.panel-head span{color:#67e8f9;font-size:12px;font-weight:800;text-decoration:none}.list-row{border-top:1px solid var(--line);justify-content:space-between;align-items:center;gap:14px;padding:15px 0;text-decoration:none;display:flex}.list-row:first-of-type{margin-top:10px}.list-row div{gap:3px;display:grid}.list-row span{color:var(--muted);font-size:12px}.status-pill{color:#475569;white-space:nowrap;background:#e9eef6;border-radius:999px;align-items:center;width:max-content;padding:5px 8px;font-weight:800;display:inline-flex;font-size:11px!important}.empty-state{color:var(--muted);text-align:center;padding:28px 12px;line-height:1.6}.table-panel{padding:0;overflow:hidden}.responsive-table{width:100%;overflow-x:auto}.responsive-table table{border-collapse:collapse;width:100%;min-width:720px}.responsive-table th,.responsive-table td{text-align:left;vertical-align:middle;border-bottom:1px solid #ffffff14;padding:14px 16px;font-size:13px}.responsive-table th{color:#8f9db2;text-transform:uppercase;letter-spacing:.08em;font-size:10px}.responsive-table td small{color:var(--muted);margin-top:3px;display:block}.form-panel{max-width:720px}.settings-form input{background:#0b1020}.check-line{grid-template-columns:auto 1fr;align-items:center;display:flex!important}.check-line input{width:auto!important}.admin-body{background:var(--admin-bg);color:var(--admin-ink)}.admin-shell{grid-template-columns:248px minmax(0,1fr);min-height:100vh;display:grid}.admin-sidebar{color:#fff;z-index:80;background:#0b1020;flex-direction:column;height:100vh;padding:20px 14px;display:flex;position:sticky;top:0;overflow-y:auto}.admin-sidebar-head{justify-content:space-between;align-items:center;padding:0 8px 18px;display:flex}.admin-kicker{color:#66748c;text-transform:uppercase;letter-spacing:.12em;padding:0 10px 8px;font-size:10px;font-weight:900}.admin-nav{gap:2px;display:grid}.admin-nav a,.admin-sidebar-foot a,.admin-sidebar-foot button{color:#aab7ca;text-align:left;width:100%;font:inherit;cursor:pointer;background:0 0;border:0;border-radius:8px;padding:9px 10px;font-size:13px;font-weight:700;text-decoration:none;display:block}.admin-nav a:hover,.admin-nav a.active,.admin-sidebar-foot a:hover,.admin-sidebar-foot button:hover{color:#fff;background:#17203a}.admin-sidebar-foot{border-top:1px solid #202a42;margin-top:auto;padding-top:16px}.admin-content{min-width:0}.admin-topbar{border-bottom:1px solid var(--admin-line);z-index:30;background:#fff;justify-content:space-between;align-items:center;gap:15px;height:66px;padding:0 28px;display:flex;position:sticky;top:0}.admin-topbar>div{display:grid}.admin-topbar span{color:var(--admin-muted);font-size:11px}.admin-page{padding:30px}.admin-heading h1{color:var(--admin-ink)}.admin-heading p{color:var(--admin-muted)}.admin-stats{grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:18px;display:grid}.admin-stat{border:1px solid var(--admin-line);color:inherit;background:#fff;border-radius:14px;padding:20px;text-decoration:none;display:block;box-shadow:0 4px 18px #1f2d4b0a}.admin-stat span{color:var(--admin-muted);text-transform:uppercase;font-size:11px;font-weight:800;display:block}.admin-stat strong{letter-spacing:-.04em;margin:6px 0 4px;font-size:29px;display:block}.admin-stat small{color:#7c3aed;font-weight:800}.admin-grid{grid-template-columns:1fr 1fr;gap:16px;display:grid}.admin-card{border:1px solid var(--admin-line);background:#fff;border-radius:14px;min-width:0;padding:20px;box-shadow:0 4px 18px #1f2d4b0a}.admin-card-wide{grid-column:1/-1}.admin-card .panel-head h2{color:var(--admin-ink)}.admin-list-row{border-top:1px solid var(--admin-line);justify-content:space-between;align-items:center;gap:12px;padding:13px 0;font-size:12px;display:flex}.admin-list-row:first-of-type{margin-top:10px}.admin-list-row>div{display:grid}.admin-list-row span{color:var(--admin-muted)}.admin-card .responsive-table th,.admin-card .responsive-table td{border-color:var(--admin-line);color:var(--admin-ink)}.admin-card .responsive-table th{color:#7a879c}.table-card{padding:0;overflow:hidden}.admin-button,.toggle-button{color:#fff;min-height:33px;font:inherit;cursor:pointer;background:#172033;border:0;border-radius:8px;justify-content:center;align-items:center;padding:0 11px;font-size:11px;font-weight:800;text-decoration:none;display:inline-flex}.toggle-button{color:#5a677c;background:#e9eef6}.toggle-button.on{color:#166534;background:#dcfce7}.inline-controls{align-items:center;gap:7px;display:flex}.inline-controls select{color:#172033;min-width:110px;font:inherit;background:#fff;border:1px solid #d5dce7;border-radius:8px;padding:7px 9px;font-size:11px}.admin-muted{color:var(--admin-muted);line-height:1.6}.admin-flash{color:#166534;background:#dcfce7;border:1px solid #bbf7d0;border-radius:10px;margin:18px 30px 0;padding:12px 15px;font-size:13px}.settings-grid{grid-template-columns:repeat(2,1fr);gap:16px;display:grid}.settings-list>div{border-top:1px solid var(--admin-line);grid-template-columns:140px 1fr auto;gap:14px;padding:12px 0;font-size:12px;display:grid}.settings-list>div:first-child{margin-top:10px}.settings-list span{color:var(--admin-muted)}.action-card{color:inherit;text-decoration:none;display:block}.action-card:hover{border-color:#b8a5ff}.action-card h2{margin-top:0}.action-card p{color:var(--admin-muted);line-height:1.6}.action-card>span{color:#6d28d9;font-size:12px;font-weight:900}.role-grid{grid-template-columns:repeat(3,1fr);gap:16px;display:grid}.role-badge{color:#6d28d9;background:#ede9fe;border-radius:999px;padding:5px 8px;font-size:11px;font-weight:900;display:inline-flex}.role-count{margin-top:16px;font-size:30px;display:block}.feature-empty{text-align:center;padding:38px 15px}.feature-icon{color:#6d28d9;background:#ede9fe;border-radius:15px;place-items:center;width:54px;height:54px;margin:0 auto 14px;font-size:24px;font-weight:900;display:grid}.feature-empty p{max-width:560px;color:var(--admin-muted);margin:0 auto 20px;line-height:1.6}.icon-button{cursor:pointer;background:0 0;border:0;font-size:22px;display:none}.admin-overlay{display:none}@media(max-width:1100px){.dj-cards{grid-template-columns:repeat(3,minmax(0,1fr))}.steps{grid-template-columns:repeat(2,1fr)}.profile-grid{grid-template-columns:minmax(0,1fr) 330px}.admin-stats,.role-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:900px){.shell{width:min(100% - 28px,1240px)}.site-header,.nav{height:68px}.mobile-menu-button{display:block}.nav-panel{border:1px solid var(--line);box-shadow:var(--shadow);background:#0e1425;border-radius:14px;flex-direction:column;align-items:stretch;gap:12px;margin:0;padding:14px;display:none;position:absolute;top:68px;left:14px;right:14px}.nav-panel.open{display:flex}.navlinks,.nav-actions{flex-direction:column;align-items:stretch;gap:2px}.navlinks a,.nav-actions>a,.nav-actions .text-button{text-align:left;padding:11px 10px}.nav-actions{border-top:1px solid var(--line);padding-top:8px}.nav-actions .button{width:100%}.hero{min-height:auto}.hero-copy{padding:74px 0}.searchbox,.filterbar{grid-template-columns:1fr 1fr}.searchbox .button,.filterbar .button{grid-column:1/-1}.dj-cards{grid-template-columns:repeat(2,minmax(0,1fr))}.split-feature{grid-template-columns:1fr;gap:36px}.profile-panel{grid-template-columns:100px 1fr}.profile-price{border-top:1px solid #e2e8f0;border-left:0;grid-column:1/-1;grid-template-columns:auto auto 1fr auto;align-items:center;gap:8px;padding:18px 0 0;display:grid}.profile-price .button{margin:0}.profile-grid{grid-template-columns:1fr}.enquiry-card{position:static}.account-shell{grid-template-columns:1fr}.account-sidebar{position:static}.account-nav{gap:4px;display:flex;overflow-x:auto}.account-nav a{white-space:nowrap}.dashboard-grid{grid-template-columns:1fr}.admin-shell{display:block}.admin-sidebar{width:270px;transition:transform .2s;position:fixed;top:0;left:0;transform:translate(-105%)}.admin-sidebar.open{transform:none}.admin-overlay{z-index:70;background:#0b10208c;position:fixed;inset:0}.admin-overlay.open{display:block}.admin-menu,.admin-close{place-items:center;display:inline-grid}.admin-topbar{padding:0 18px}.admin-page{padding:22px 18px}.admin-flash{margin:14px 18px 0}.admin-grid,.settings-grid{grid-template-columns:1fr}}@media(max-width:640px){.shell{width:min(100% - 22px,1240px)}.brand{font-size:21px}.hero-shade{background:linear-gradient(#070914c7,#070914f7)}.hero-copy{padding:58px 0}.hero h1{font-size:44px}.hero-copy>p{font-size:16px}.searchbox,.filterbar{grid-template-columns:1fr;padding:8px}.searchbox .button,.filterbar .button{grid-column:auto}.hero-proof{gap:9px 16px;font-size:11px}.section{padding:58px 0}.section-head,.directory-heading,.page-heading,.pricing-box{flex-direction:column;align-items:flex-start}.section-head .button{width:100%}.dj-cards{grid-template-columns:1fr}.card-img{aspect-ratio:16/10}.steps,.feature-list{grid-template-columns:1fr}.pricing-box{padding:28px}.pricing-box .button{width:100%}.footer-grid{grid-template-columns:1fr;gap:28px}.cookie{flex-direction:column;align-items:stretch;bottom:10px;left:10px;right:10px}.cookie-actions{grid-template-columns:1fr 1fr;display:grid}.profile-hero{height:230px}.profile-shell{width:100%}.profile-panel{border-radius:17px;grid-template-columns:72px 1fr;gap:14px;margin:-34px 11px 0;padding:18px}.avatar{width:72px;height:72px}.profile-title h1{font-size:27px}.profile-summary p{font-size:13px}.profile-price{grid-template-columns:auto 1fr}.profile-price strong{font-size:30px}.profile-price small{display:none}.profile-price .button{grid-column:1/-1}.profile-grid{padding:28px 11px 0}.directory-page{padding:44px 0 60px}.directory-heading h1{font-size:42px}.account-page{padding:36px 0 58px}.account-person{display:none}.account-sidebar{border-radius:12px}.account-stats{grid-template-columns:1fr 1fr}.account-stat:last-child{grid-column:1/-1}.panel{padding:16px}.admin-topbar .button{display:none}.admin-page{padding:18px 12px}.admin-stats{grid-template-columns:1fr 1fr;gap:10px}.admin-stat{padding:15px}.admin-stat strong{font-size:24px}.settings-list>div,.role-grid{grid-template-columns:1fr}.inline-controls{flex-direction:column;align-items:stretch}.inline-controls select,.inline-controls .admin-button{width:100%}.auth-card{padding:23px}.auth-page{padding:38px 12px}}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false} diff --git a/public/build/assets/app-DMsN-rLE.js b/public/build/assets/app-fQMWg8Nx.js similarity index 51% rename from public/build/assets/app-DMsN-rLE.js rename to public/build/assets/app-fQMWg8Nx.js index 1f2bafe..8686178 100644 --- a/public/build/assets/app-DMsN-rLE.js +++ b/public/build/assets/app-fQMWg8Nx.js @@ -1,9 +1,9 @@ -function Ot(e,t){return function(){return e.apply(t,arguments)}}const{toString:rn}=Object.prototype,{getPrototypeOf:v}=Object,{iterator:he,toStringTag:St}=Symbol,de=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),_t=e=>typeof e=="string"&&(e==="__proto__"||e==="constructor"||e==="prototype"),At=(e,t,n)=>e===Object.prototype||!n&&t===null,sn=e=>{if(!Object.isExtensible(e))return!1;const t=Object.getOwnPropertyNames(e);return Object.getOwnPropertySymbols&&t.push(...Object.getOwnPropertySymbols(e)),t.every(n=>{if(_t(n))return!1;const r=Object.getOwnPropertyDescriptor(e,n);return!!r&&r.configurable&&r.writable===!0})},pe=(e,t)=>{let n=e;const r=[];for(;n!=null;){if(r.indexOf(n)!==-1)return!1;r.push(n);const s=v(n);if(At(n,s,n===e))return!1;if(de(n,t))return!0;n=s}return!1},on=(e,t)=>e!=null&&pe(e,t)?e[t]:void 0,an=e=>{if(e==null||typeof e!="object"&&typeof e!="function")return e;const t=v(e);if(t===null&&sn(e))return e;const n=Object.create(null),r=Object.create(null),s=[];let o=e;for(;o!=null&&s.indexOf(o)===-1;){s.push(o);const i=o===e?t:v(o);if(At(o,i,o===e))break;const c=Object.getOwnPropertyNames(o);Object.getOwnPropertySymbols&&c.push(...Object.getOwnPropertySymbols(o));for(const l of c)_t(l)||de(r,l)||(n[l]=e[l],r[l]=!0);o=i}return n},We=(e=>t=>{const n=rn.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),j=e=>(e=e.toLowerCase(),t=>We(t)===e),xe=e=>t=>typeof t===e,{isArray:Y}=Array,ee=xe("undefined");function se(e){return e!==null&&!ee(e)&&e.constructor!==null&&!ee(e.constructor)&&F(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Pt=j("ArrayBuffer");function cn(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Pt(e.buffer),t}const ln=xe("string"),F=xe("function"),Tt=xe("number"),oe=e=>e!==null&&typeof e=="object",un=e=>e===!0||e===!1,Oe=e=>{if(!oe(e))return!1;const t=v(e);return(t===null||t===Object.prototype||v(t)===null)&&!pe(e,St)&&!pe(e,he)},fn=e=>{if(!oe(e)||se(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},dn=j("Date"),pn=j("File"),hn=e=>!!(e&&typeof e.uri<"u"),mn=e=>e&&typeof e.getParts<"u",yn=j("Blob"),bn=j("FileList"),wn=j("Set"),gn=e=>oe(e)&&F(e.pipe);function En(){return typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}}const nt=En(),rt=typeof nt.FormData<"u"?nt.FormData:void 0,Rn=e=>{if(!e)return!1;if(rt&&e instanceof rt)return!0;const t=v(e);if(!t||t===Object.prototype||!F(e.append))return!1;const n=We(e);return n==="formdata"||n==="object"&&F(e.toString)&&e.toString()==="[object FormData]"},On=j("URLSearchParams"),[Sn,_n,An,Pn]=["ReadableStream","Request","Response","Headers"].map(j),Tn=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function me(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,s;if(typeof e!="object"&&(e=[e]),Y(e))for(r=0,s=e.length;r0;)if(s=n[r],t===s.toLowerCase())return s;return null}const Q=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Ct=e=>!ee(e)&&e!==Q;function Me(...e){const{caseless:t,skipUndefined:n}=Ct(this)&&this||{},r={},s=(o,i)=>{if(i==="__proto__"||i==="constructor"||i==="prototype")return;const c=t&&typeof i=="string"&&xt(r,i)||i,l=de(r,c)?r[c]:void 0;Oe(l)&&Oe(o)?r[c]=Me(l,o):Oe(o)?r[c]=Me({},o):Y(o)?r[c]=o.slice():(!n||!ee(o))&&(r[c]=o)};for(let o=0,i=e.length;o(me(t,(s,o)=>{n&&F(s)?Object.defineProperty(e,o,{__proto__:null,value:Ot(s,n),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,o,{__proto__:null,value:s,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:r}),e),Cn=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),Nn=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),Object.defineProperty(e.prototype,"constructor",{__proto__:null,value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{__proto__:null,value:t.prototype}),n&&Object.assign(e.prototype,n)},Dn=(e,t,n,r)=>{let s,o,i;const c={};if(t=t||{},e==null)return t;do{for(s=Object.getOwnPropertyNames(e),o=s.length;o-- >0;)i=s[o],(!r||r(i,e,t))&&!c[i]&&(t[i]=e[i],c[i]=!0);e=n!==!1&&v(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Ln=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},Un=e=>{if(!e)return null;if(Y(e))return e;let t=e.length;if(!Tt(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Fn=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&v(Uint8Array)),Bn=(e,t)=>{const r=(e&&e[he]).call(e);let s;for(;(s=r.next())&&!s.done;){const o=s.value;t.call(e,o[0],o[1])}},jn=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},In=j("HTMLFormElement"),kn=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,s){return r.toUpperCase()+s}),{propertyIsEnumerable:qn}=Object.prototype,Hn=j("RegExp"),Nt=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};me(n,(s,o)=>{let i;(i=t(s,o,e))!==!1&&(r[o]=i||s)}),Object.defineProperties(e,r)},Mn=e=>{Nt(e,(t,n)=>{if(F(e)&&["arguments","caller","callee"].includes(n))return!1;const r=e[n];if(F(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},$n=(e,t)=>{const n={},r=s=>{s.forEach(o=>{n[o]=!0})};return Y(e)?r(e):r(String(e).split(t)),n},zn=()=>{},Wn=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Vn(e){return!!(e&&F(e.append)&&e[St]==="FormData"&&e[he])}const Jn=e=>{const t=new WeakSet,n=r=>{if(oe(r)){if(t.has(r))return;if(se(r))return r;if(!("toJSON"in r)){t.add(r);let s;if(wn(r)){s=[];for(const o of r){const i=n(o);!ee(i)&&s.push(i)}}else s=Y(r)?[]:{},me(r,(o,i)=>{const c=n(o);!ee(c)&&(s[i]=c)});return t.delete(r),s}}return r};return n(e)},vn=j("AsyncFunction"),Kn=e=>e&&(oe(e)||F(e))&&F(e.then)&&F(e.catch),Dt=((e,t)=>e?setImmediate:t?((n,r)=>(Q.addEventListener("message",({source:s,data:o})=>{s===Q&&o===n&&r.length&&r.shift()()},!1),s=>{r.push(s),Q.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",F(Q.postMessage)),Xn=typeof queueMicrotask<"u"?queueMicrotask.bind(Q):typeof process<"u"&&process.nextTick||Dt,Lt=e=>e!=null&&F(e[he]),Gn=e=>e!=null&&pe(e,he)&&Lt(e),a={isArray:Y,isArrayBuffer:Pt,isBuffer:se,isFormData:Rn,isArrayBufferView:cn,isString:ln,isNumber:Tt,isBoolean:un,isObject:oe,isPlainObject:Oe,isEmptyObject:fn,isReadableStream:Sn,isRequest:_n,isResponse:An,isHeaders:Pn,isUndefined:ee,isDate:dn,isFile:pn,isReactNativeBlob:hn,isReactNative:mn,isBlob:yn,isRegExp:Hn,isFunction:F,isStream:gn,isURLSearchParams:On,isTypedArray:Fn,isFileList:bn,forEach:me,merge:Me,extend:xn,trim:Tn,stripBOM:Cn,inherits:Nn,toFlatObject:Dn,kindOf:We,kindOfTest:j,endsWith:Ln,toArray:Un,forEachEntry:Bn,matchAll:jn,isHTMLForm:In,hasOwnProperty:de,hasOwnProp:de,hasOwnInPrototypeChain:pe,getSafeProp:on,toSafeFlatObject:an,reduceDescriptors:Nt,freezeMethods:Mn,toObjectSet:$n,toCamelCase:kn,noop:zn,toFiniteNumber:Wn,findKey:xt,global:Q,isContextDefined:Ct,isSpecCompliantForm:Vn,toJSONObject:Jn,isAsyncFn:vn,isThenable:Kn,setImmediate:Dt,asap:Xn,isIterable:Lt,isSafeIterable:Gn},Qn=a.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Zn=e=>{const t={};let n,r,s;return e&&e.split(` -`).forEach(function(i){s=i.indexOf(":"),n=i.substring(0,s).trim().toLowerCase(),r=i.substring(s+1).trim();const c=a.hasOwnProp(t,n);!n||c&&a.hasOwnProp(Qn,n)||(n==="set-cookie"?c?t[n].push(r):t[n]=[r]:t[n]=c?t[n]+", "+r:r)}),t};function Yn(e){let t=0,n=e.length;for(;tt;){const r=e.charCodeAt(n-1);if(r!==9&&r!==32)break;n-=1}return t===0&&n===e.length?e:e.slice(t,n)}const er=new RegExp("[\\u0000-\\u0008\\u000a-\\u001f\\u007f]+","g"),tr=new RegExp("[^\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+","g");function Ve(e,t){return a.isArray(e)?e.map(n=>Ve(n,t)):Yn(String(e).replace(t,""))}const nr=e=>Ve(e,er),rr=e=>Ve(e,tr);function Ut(e){const t=Object.create(null);return a.forEach(e.toJSON(),(n,r)=>{t[r]=rr(n)}),t}const st=Symbol("internals");function le(e){return e&&String(e).trim().toLowerCase()}function Se(e){return e===!1||e==null?e:a.isArray(e)?e.map(Se):nr(String(e))}function sr(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const or=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;function Fe(e){let t=0,n=e.length;for(;tt;){const r=e.charCodeAt(n-1);if(r!==9&&r!==32)break;n-=1}return t===0&&n===e.length?e:e.slice(t,n)}function ir(e){const t=e.length-1;if(t<1||e.charCodeAt(0)!==34||e.charCodeAt(t)!==34)return e;let n="";for(let r=1;r=t))return e;n+=e[r]}return n}function ar(e){const t=Object.create(null),n=String(e);let r=0,s=!1,o=!1;function i(c){const l=Fe(n.slice(r,c)),d=l.indexOf("=");if(d<1)return;const f=Fe(l.slice(0,d));if(!or.test(f))return;const p=f.toLowerCase();if(p==="__proto__"||p==="constructor"||p==="prototype")return;const y=Fe(l.slice(d+1));t[p]=ir(y)}for(let c=0;c/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function Be(e,t,n,r,s){if(a.isFunction(r))return r.call(this,t,n);if(s&&(t=n),!!a.isString(t)){if(a.isString(r))return t.indexOf(r)!==-1;if(a.isRegExp(r))return r.test(t)}}function lr(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function ur(e,t){const n=a.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{__proto__:null,value:function(s,o,i){return this[r].call(this,t,s,o,i)},configurable:!0})})}let U=class{constructor(t){t&&this.set(t)}set(t,n,r){const s=this;function o(c,l,d){const f=le(l);if(!f)return;const p=a.findKey(s,f);(!p||s[p]===void 0||d===!0||d===void 0&&s[p]!==!1)&&(s[p||l]=Se(c))}const i=(c,l)=>a.forEach(c,(d,f)=>o(d,f,l));if(a.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(a.isString(t)&&(t=t.trim())&&!cr(t))i(Zn(t),n);else if(a.isObject(t)&&a.isSafeIterable(t)){let c=Object.create(null),l,d;for(const f of t){if(!a.isArray(f))throw new TypeError("Object iterator must return a key-value pair");d=f[0],a.hasOwnProp(c,d)?(l=c[d],c[d]=a.isArray(l)?[...l,f[1]]:[l,f[1]]):c[d]=f[1]}i(c,n)}else t!=null&&o(n,t,r);return this}get(t,n){if(t=le(t),t){const r=a.findKey(this,t);if(r){const s=this[r];if(!n)return s;if(n===!0)return sr(s);if(a.isFunction(n))return n.call(this,s,r);if(a.isRegExp(n))return n.exec(s);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=le(t),t){const r=a.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||Be(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let s=!1;function o(i){if(i=le(i),i){const c=a.findKey(r,i);c&&(!n||Be(r,r[c],c,n))&&(delete r[c],s=!0)}}return a.isArray(t)?t.forEach(o):o(t),s}clear(t){const n=Object.keys(this);let r=n.length,s=!1;for(;r--;){const o=n[r];(!t||Be(this,this[o],o,t,!0))&&(delete this[o],s=!0)}return s}normalize(t){const n=this,r={};return a.forEach(this,(s,o)=>{const i=a.findKey(r,o);if(i){n[i]=Se(s),delete n[o];return}const c=t?lr(o):String(o).trim();c!==o&&delete n[o],n[c]=Se(s),r[c]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return a.forEach(this,(r,s)=>{r!=null&&r!==!1&&(n[s]=t&&a.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` -`)}getSetCookie(){const t=this.get("set-cookie");return a.isArray(t)?t:t==null||t===!1?[]:[t]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static parseParameters(t){return ar(t)}static concat(t,...n){const r=new this(t);return n.forEach(s=>r.set(s)),r}static accessor(t){const r=(this[st]=this[st]={accessors:{}}).accessors,s=this.prototype;function o(i){const c=le(i);r[c]||(ur(s,i),r[c]=!0)}return a.isArray(t)?t.forEach(o):o(t),this}};U.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);a.reduceDescriptors(U.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});a.freezeMethods(U);const Pe="[REDACTED ****]";function fr(e){if(a.hasOwnProp(e,"toJSON"))return!0;let t=Object.getPrototypeOf(e);for(;t&&t!==Object.prototype;){if(a.hasOwnProp(t,"toJSON"))return!0;t=Object.getPrototypeOf(t)}return!1}function dr(e,t){const n=new Set(t.map(o=>String(o).toLowerCase())),r=[],s=o=>{if(o===null||typeof o!="object"||a.isBuffer(o))return o;if(r.indexOf(o)!==-1)return;o instanceof U&&(o=o.toJSON()),r.push(o);let i;if(a.isArray(o))i=[],o.forEach((c,l)=>{const d=s(c);a.isUndefined(d)||(i[l]=d)});else{if(!a.isPlainObject(o)&&fr(o))return r.pop(),o;i=Object.create(null);for(const[c,l]of Object.entries(o)){const d=n.has(c.toLowerCase())?Pe:s(l);a.isUndefined(d)||(i[c]=d)}}return r.pop(),i};return s(e)}function ot(e){try{return String(e)}catch{return""}}function pr(e){return e.errors.map(n=>{try{return n&&n.message?ot(n.message):ot(n)}catch{return""}}).filter(Boolean).join("; ")||e.name||"AggregateError"}let h=class Ft extends Error{static from(t,n,r,s,o,i){let c=t.message;!c&&a.isArray(t.errors)&&t.errors.length&&(c=pr(t));const l=new Ft(c,n||t.code,r,s,o);return Object.defineProperty(l,"cause",{__proto__:null,value:t,writable:!0,enumerable:!1,configurable:!0}),l.name=t.name,t.status!=null&&l.status==null&&(l.status=t.status),i&&Object.assign(l,i),l}constructor(t,n,r,s,o){super(t),Object.defineProperty(this,"message",{__proto__:null,value:t,enumerable:!0,writable:!0,configurable:!0}),this.name="AxiosError",this.isAxiosError=!0,n&&(this.code=n),r&&(this.config=r),s&&(this.request=s),o&&(this.response=o,this.status=o.status)}toJSON(){const t=this.config,n=t&&a.hasOwnProp(t,"redact")?t.redact:void 0,r=a.isArray(n)&&n.length>0?dr(t,n):a.toJSONObject(t);return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:r,code:this.code,status:this.status}}};h.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE";h.ERR_BAD_OPTION="ERR_BAD_OPTION";h.ECONNABORTED="ECONNABORTED";h.ETIMEDOUT="ETIMEDOUT";h.ECONNREFUSED="ECONNREFUSED";h.ERR_NETWORK="ERR_NETWORK";h.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS";h.ERR_DEPRECATED="ERR_DEPRECATED";h.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE";h.ERR_BAD_REQUEST="ERR_BAD_REQUEST";h.ERR_CANCELED="ERR_CANCELED";h.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT";h.ERR_INVALID_URL="ERR_INVALID_URL";h.ERR_FORM_DATA_DEPTH_EXCEEDED="ERR_FORM_DATA_DEPTH_EXCEEDED";const hr=null,Bt=100;function $e(e){return a.isPlainObject(e)||a.isArray(e)}function jt(e){return a.endsWith(e,"[]")?e.slice(0,-2):e}function je(e,t,n){return e?e.concat(t).map(function(s,o){return s=jt(s),!n&&o?"["+s+"]":s}).join(n?".":""):t}function mr(e){return a.isArray(e)&&!e.some($e)}const yr=a.toFlatObject(a,{},null,function(t){return/^is[A-Z]/.test(t)});function Ce(e,t,n){if(!a.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;const r=(m,g)=>{const b=a.getSafeProp(n,m);return a.isUndefined(b)?g:b},s=r("metaTokens",!0),o=r("visitor")||S,i=r("dots",!1),c=r("indexes",!1),l=r("Blob")||typeof Blob<"u"&&Blob,d=r("maxDepth",Bt),f=l&&a.isSpecCompliantForm(t),p=[];if(!a.isFunction(o))throw new TypeError("visitor must be a function");function y(m){if(m===null)return"";if(a.isDate(m))return m.toISOString();if(a.isBoolean(m))return m.toString();if(!f&&a.isBlob(m))throw new h("Blob is not supported. Use a Buffer instead.");if(a.isArrayBuffer(m)||a.isTypedArray(m)){if(f&&typeof l=="function")return new l([m]);throw new h("Blob is not supported. Use a Buffer instead.",h.ERR_NOT_SUPPORT)}return m}function E(m){if(m>d)throw new h("Object is too deeply nested ("+m+" levels). Max depth: "+d,h.ERR_FORM_DATA_DEPTH_EXCEEDED)}function R(m,g){if(d===1/0)return JSON.stringify(m);const b=[];return JSON.stringify(m,function(N,_){if(!a.isObject(_))return _;for(;b.length&&b[b.length-1]!==this;)b.pop();return b.push(_),E(g+b.length-1),_})}function S(m,g,b){let T=m;if(a.isReactNative(t)&&a.isReactNativeBlob(m))return t.append(je(b,g,i),y(m)),!1;if(m&&!b&&typeof m=="object"){if(a.endsWith(g,"{}"))g=s?g:g.slice(0,-2),m=R(m,1);else if(a.isArray(m)&&mr(m)||(a.isFileList(m)||a.endsWith(g,"[]"))&&(T=a.toArray(m)))return g=jt(g),T.forEach(function(_,k){!(a.isUndefined(_)||_===null)&&t.append(c===!0?je([g],k,i):c===null?g:g+"[]",y(_))}),!1}return $e(m)?!0:(t.append(je(b,g,i),y(m)),!1)}const P=Object.assign(yr,{defaultVisitor:S,convertValue:y,isVisitable:$e});function u(m,g,b=0){if(!a.isUndefined(m)){if(E(b),p.indexOf(m)!==-1)throw new Error("Circular reference detected in "+g.join("."));p.push(m),a.forEach(m,function(N,_){(!(a.isUndefined(N)||N===null)&&o.call(t,N,a.isString(_)?_.trim():_,g,P))===!0&&u(N,g?g.concat(_):[_],b+1)}),p.pop()}}if(!a.isObject(e))throw new TypeError("data must be an object");return u(e),t}function it(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"};return encodeURIComponent(e).replace(/[!'()~]|%20/g,function(r){return t[r]})}function Je(e,t){this._pairs=[],e&&Ce(e,this,t)}const It=Je.prototype;It.append=function(t,n){this._pairs.push([t,n])};It.toString=function(t){const n=t?r=>t.call(this,r,it):it;return this._pairs.map(function(s){return n(s[0])+"="+n(s[1])},"").join("&")};function br(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function kt(e,t,n){if(!t)return e;e=e||"";const r=a.isFunction(n)?{serialize:n}:n,s=a.getSafeProp(r,"encode")||br,o=a.getSafeProp(r,"serialize");let i;if(o?i=o(t,r):i=a.isURLSearchParams(t)?t.toString():new Je(t,r).toString(s),i){const c=e.indexOf("#");c!==-1&&(e=e.slice(0,c)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}const ue=Symbol("internals");function qt(e){return e?e.length:0}function at(e){if(e)for(;e.length&&e[e.length-1]===null;)e.pop()}function fe(e,t){const n=e.handlers,r=qt(n);n!==t.handlersRef?(t.handlersRef=n,t.handlerEntries.clear()):r!==t.handlersLength&&(r?t.handlerEntries.forEach(function(o,i){n[o.index]!==o.handler&&t.handlerEntries.delete(i)}):t.handlerEntries.clear()),t.handlersLength=r}class ct{constructor(){this.handlers=[],this[ue]={handlersRef:this.handlers,handlersLength:this.handlers.length,handlerEntries:new Map,iterationDepth:0,nextId:0}}use(t,n,r){const s={fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null},o=this[ue];this.handlers==null&&(this.handlers=[]),fe(this,o);const i=o.nextId++;return this.handlers.push(s),o.handlerEntries.set(i,{handler:s,index:this.handlers.length-1}),o.handlersLength=this.handlers.length,i}eject(t){const n=this[ue];fe(this,n);const r=n.handlerEntries.get(t);if(r){if(n.handlerEntries.delete(t),this.handlers[r.index]!==r.handler)return;this.handlers[r.index]=null,n.iterationDepth||(at(this.handlers),n.handlersLength=this.handlers.length)}}clear(){this.handlers&&(this.handlers=[],fe(this,this[ue]))}forEach(t){const n=this[ue];fe(this,n),n.iterationDepth++;try{a.forEach(this.handlers,function(s){s!==null&&t(s)})}finally{--n.iterationDepth||(fe(this,n),at(this.handlers),n.handlersLength=qt(this.handlers))}}}const ve={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0,advertiseZstdAcceptEncoding:!1,validateStatusUndefinedResolves:!0},wr=typeof URLSearchParams<"u"?URLSearchParams:Je,gr=typeof FormData<"u"?FormData:null,Er=typeof Blob<"u"?Blob:null,Rr={isBrowser:!0,classes:{URLSearchParams:wr,FormData:gr,Blob:Er},protocols:["http","https","file","blob","url","data"]},Ke=typeof window<"u"&&typeof document<"u",ze=typeof navigator=="object"&&navigator||void 0,Or=Ke&&(!ze||["ReactNative","NativeScript","NS"].indexOf(ze.product)<0),Sr=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",_r=Ke&&window.location.href||"http://localhost",Ar=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Ke,hasStandardBrowserEnv:Or,hasStandardBrowserWebWorkerEnv:Sr,navigator:ze,origin:_r},Symbol.toStringTag,{value:"Module"})),x={...Ar,...Rr};function Pr(e,t){return Ce(e,new x.classes.URLSearchParams,{visitor:function(n,r,s,o){return x.isNode&&a.isBuffer(n)?(this.append(r,n.toString("base64")),!1):o.defaultVisitor.apply(this,arguments)},...t})}const lt=Bt;function Ht(e){if(e>lt)throw new h("FormData field is too deeply nested ("+e+" levels). Max depth: "+lt,h.ERR_FORM_DATA_DEPTH_EXCEEDED)}function Tr(e){const t=[],n=/[^.[\]]+|\[([^.[\]]*)]/g;let r;for(;(r=n.exec(e))!==null;)Ht(t.length),t.push(r[0]==="[]"?"":r[1]||r[0]);return t}function xr(e){const t={},n=Object.keys(e);let r;const s=n.length;let o;for(r=0;r=n.length;return i=!i&&a.isArray(s)?s.length:i,l?(a.hasOwnProp(s,i)?s[i]=a.isArray(s[i])?s[i].concat(r):[s[i],r]:s[i]=r,!c):((!a.hasOwnProp(s,i)||!a.isObject(s[i]))&&(s[i]=[]),t(n,r,s[i],o)&&a.isArray(s[i])&&(s[i]=xr(s[i])),!c)}if(a.isFormData(e)&&a.isFunction(e.entries)){const n={};return a.forEachEntry(e,(r,s)=>{t(Tr(r),s,n,0)}),n}return null}const $t=Object.freeze(["get","delete","head","options","post","put","patch","purge","link","unlink","query"]),re=(e,t)=>e!=null&&a.hasOwnProp(e,t)?e[t]:void 0;function Cr(e,t,n){if(a.isString(e))try{return(t||JSON.parse)(e),a.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const ye={transitional:ve,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",s=r.indexOf("application/json")>-1,o=a.isObject(t);if(o&&a.isHTMLForm(t)&&(t=new FormData(t)),a.isFormData(t))return s?JSON.stringify(Mt(t)):t;if(a.isArrayBuffer(t)||a.isBuffer(t)||a.isStream(t)||a.isFile(t)||a.isBlob(t)||a.isReadableStream(t))return t;if(a.isArrayBufferView(t))return t.buffer;if(a.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let c;if(o){const l=re(this,"formSerializer");if(r.indexOf("application/x-www-form-urlencoded")>-1)return Pr(t,l).toString();if((c=a.isFileList(t))||r.indexOf("multipart/form-data")>-1){const d=re(this,"env"),f=d&&d.FormData;return Ce(c?{"files[]":t}:t,f&&new f,l)}}return o||s?(n.setContentType("application/json",!1),Cr(t)):t}],transformResponse:[function(t){const n=re(this,"transitional")||ye.transitional,r=n&&n.forcedJSONParsing,s=re(this,"responseType"),o=s==="json";if(a.isResponse(t)||a.isReadableStream(t))return t;if(t&&a.isString(t)&&(r&&!s||o)){const c=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t,re(this,"parseReviver"))}catch(l){if(c)throw l.name==="SyntaxError"?h.from(l,h.ERR_BAD_RESPONSE,this,null,re(this,"response")):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:x.classes.FormData,Blob:x.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};a.forEach($t,e=>{ye.headers[e]={}});function Ie(e,t){const n=this||ye,r=t||n,s=U.from(r.headers);let o=r.data;return a.forEach(e,function(c){o=c.call(n,o,s.normalize(),t?t.status:void 0)}),s.normalize(),o}function zt(e){return!!(e&&e.__CANCEL__)}let be=class extends h{constructor(t,n,r){super(t??"canceled",h.ERR_CANCELED,n,r),this.name="CanceledError",this.__CANCEL__=!0}};function Wt(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new h("Request failed with status code "+n.status,n.status>=400&&n.status<500?h.ERR_BAD_REQUEST:h.ERR_BAD_RESPONSE,n.config,n.request,n))}const Nr=/[\t\n\r]/g;function Vt(e){if(typeof e!="string")return e;let t=0;for(;t{n=p,s=null,o&&(clearTimeout(o),o=null),e(...f)};return[(...f)=>{const p=Date.now(),y=p-n;y>=r?i(f,p):(s=f,o||(o=setTimeout(()=>{o=null,i(s)},r-y)))},()=>s&&i(s),(...f)=>i(f)]}const Te=(e,t,n=3)=>{let r=0;const s=Dr(50,250);return Lr(o=>{if(!o||!a.isNumber(o.loaded))return;const i=o.loaded,c=o.lengthComputable?o.total:void 0,l=Math.max(0,c!=null?Math.min(i,c):i),d=Math.max(0,l-r),f=s(d);r=Math.max(r,l);const p={loaded:l,total:c,progress:c?l/c:void 0,bytes:d,rate:f||void 0,estimated:f&&c?(c-l)/f:void 0,event:o,lengthComputable:c!=null,[t?"download":"upload"]:!0};e(p)},n)},ut=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},ft=(e,t=a.asap)=>(...n)=>t(()=>e(...n)),Ur=x.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,x.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(x.origin),x.navigator&&/(msie|trident)/i.test(x.navigator.userAgent)):()=>!0,Fr=x.hasStandardBrowserEnv?{write(e,t,n,r,s,o,i){if(typeof document>"u")return;const c=[`${e}=${encodeURIComponent(t)}`];a.isNumber(n)&&c.push(`expires=${new Date(n).toUTCString()}`),a.isString(r)&&c.push(`path=${r}`),a.isString(s)&&c.push(`domain=${s}`),o===!0&&c.push("secure"),a.isString(i)&&c.push(`SameSite=${i}`),document.cookie=c.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.split(";");for(let n=0;n0&&e.charCodeAt(n-1)===47;)n--;return e.slice(0,n)+"/"+t.replace(/^\/+/,"")}const Ir=/^https?:(?!\/\/)/i;function kr(e){return e&&e.replace(/(^|&)([^=&]*=)?[^&]+/g,(t,n,r="")=>`${n}${r}${Pe}`)}function qr(e){const t=e.replace(/^(https?:\/{0,2})[^/?#]*@/i,`$1${Pe}@`),n=t.indexOf("#"),s=(n===-1?t:t.slice(0,n)).replace(/([?&][^=&#]*=)[^&#]*/g,`$1${Pe}`);return n===-1?s:`${s}#${kr(t.slice(n+1))}`}function dt(e,t){if(typeof e=="string"){const n=Vt(e);if(Ir.test(n))throw new h(`Invalid URL ${JSON.stringify(qr(n))}: missing "//" after protocol`,h.ERR_INVALID_URL,t)}}function Jt(e,t,n,r){dt(t,r);let s=!Br(t);return e&&(s||n===!1)?(dt(e,r),jr(e,t)):t}const pt=e=>e instanceof U?{...e}:e,Hr=e=>Object.getOwnPropertySymbols&&Object.getOwnPropertyDescriptor?Object.keys(e).concat(Object.getOwnPropertySymbols(e).filter(t=>Object.getOwnPropertyDescriptor(e,t).enumerable)):Object.keys(e);function te(e,t){e=e||{},t=t||{};const n=Object.create(null);Object.defineProperty(n,"hasOwnProperty",{__proto__:null,value:Object.prototype.hasOwnProperty,enumerable:!1,writable:!0,configurable:!0});function r(f,p,y,E){return a.isPlainObject(f)&&a.isPlainObject(p)?a.merge.call({caseless:E},f,p):a.isPlainObject(p)?a.merge({},p):a.isArray(p)?p.slice():p}function s(f,p,y,E){if(a.isUndefined(p)){if(!a.isUndefined(f))return r(void 0,f,y,E)}else return r(f,p,y,E)}function o(f,p){if(!a.isUndefined(p))return r(void 0,p)}function i(f,p){if(a.isUndefined(p)){if(!a.isUndefined(f))return r(void 0,f)}else return r(void 0,p)}function c(f){const p=a.hasOwnProp(t,"transitional")?t.transitional:void 0;if(!a.isUndefined(p))if(a.isPlainObject(p)){if(a.hasOwnProp(p,f))return p[f]}else return;const y=a.hasOwnProp(e,"transitional")?e.transitional:void 0;if(a.isPlainObject(y)&&a.hasOwnProp(y,f))return y[f]}function l(f,p,y){if(a.hasOwnProp(t,y))return r(f,p);if(a.hasOwnProp(e,y))return r(void 0,f)}const d={url:o,method:o,data:o,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutErrorMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,allowedSocketPaths:i,responseEncoding:i,validateStatus:l,headers:(f,p,y)=>s(pt(f),pt(p),y,!0)};return a.forEach(Hr({...e,...t}),function(p){if(p==="__proto__"||p==="constructor"||p==="prototype")return;const y=a.hasOwnProp(d,p)?d[p]:s,E=a.hasOwnProp(e,p)?e[p]:void 0,R=a.hasOwnProp(t,p)?t[p]:void 0,S=y(E,R,p);a.isUndefined(S)&&y!==l||(n[p]=S)}),a.hasOwnProp(t,"validateStatus")&&a.isUndefined(t.validateStatus)&&c("validateStatusUndefinedResolves")===!1&&(a.hasOwnProp(e,"validateStatus")?n.validateStatus=r(void 0,e.validateStatus):delete n.validateStatus),n}const Mr=["content-type","content-length"];function $r(e,t,n){if(n!=="content-only"){e.set(t);return}Object.entries(t||{}).forEach(([r,s])=>{Mr.includes(r.toLowerCase())&&e.set(r,s)})}const zr=e=>encodeURIComponent(e).replace(/%([0-9A-F]{2})/gi,(t,n)=>String.fromCharCode(parseInt(n,16)));function vt(e){const t=te({},e),n=y=>a.hasOwnProp(t,y)?t[y]:void 0,r=n("data");let s=n("withXSRFToken");const o=n("xsrfHeaderName"),i=n("xsrfCookieName");let c=n("headers");const l=n("auth"),d=n("baseURL"),f=n("allowAbsoluteUrls"),p=n("url");if(t.headers=c=U.from(c),t.url=kt(Jt(d,p,f,t),n("params"),n("paramsSerializer")),l){const y=a.getSafeProp(l,"username")||"",E=a.getSafeProp(l,"password")||"";try{c.set("Authorization","Basic "+btoa(y+":"+(E?zr(E):"")))}catch(R){throw h.from(R,h.ERR_BAD_OPTION_VALUE,e)}}if(a.isFormData(r)){const y=a.getSafeProp(r,"getHeaders");x.hasStandardBrowserEnv||x.hasStandardBrowserWebWorkerEnv||a.isReactNative(r)?c.setContentType(void 0):a.isFunction(y)&&$r(c,y.call(r),n("formDataHeaderPolicy"))}if(x.hasStandardBrowserEnv&&(a.isFunction(s)&&(s=s(t)),s===!0||s==null&&Ur(t.url))){const E=o&&i&&Fr.read(i);E&&c.set(o,E)}return t}const Wr=typeof XMLHttpRequest<"u",Vr=Wr&&function(e){return new Promise(function(n,r){const s=vt(e);let o=s.data;const i=U.from(s.headers).normalize();let{responseType:c,onUploadProgress:l,onDownloadProgress:d}=s,f,p,y,E,R,S;function P(){E&&E(),R&&R(),s.cancelToken&&s.cancelToken.unsubscribe(f),s.signal&&s.signal.removeEventListener("abort",f)}let u=new XMLHttpRequest;u.open(s.method.toUpperCase(),s.url,!0),u.timeout=s.timeout;function m(b){if(!u)return;if(u.status===0&&(ke(Vt(s.url))||ke(x.origin))!=="file"&&!(u.responseURL&&u.responseURL.startsWith("file:"))){r(new h("Request aborted",h.ECONNABORTED,e,u)),P(),u=null;return}try{b?S&&S(b):R&&R()}catch(k){setTimeout(()=>{throw k})}if(!u)return;const T=U.from("getAllResponseHeaders"in u&&u.getAllResponseHeaders()),_={data:!c||c==="text"||c==="json"?u.responseText:u.response,status:u.status,statusText:u.statusText,headers:T,config:e,request:u};Wt(function(K){n(K),P()},function(K){r(K),P()},_),u=null}"onloadend"in u?u.onloadend=m:u.onreadystatechange=function(){!u||u.readyState!==4||u.status===0&&!(u.responseURL&&u.responseURL.startsWith("file:"))||setTimeout(m)},u.onabort=function(){u&&(r(new h("Request aborted",h.ECONNABORTED,e,u)),P(),u=null)},u.onerror=function(T){const N=T&&T.message?T.message:"Network Error",_=new h(N,h.ERR_NETWORK,e,u);_.event=T||null,r(_),P(),u=null},u.ontimeout=function(){let T=s.timeout?"timeout of "+s.timeout+"ms exceeded":"timeout exceeded";const N=s.transitional||ve;s.timeoutErrorMessage&&(T=s.timeoutErrorMessage),r(new h(T,N.clarifyTimeoutError?h.ETIMEDOUT:h.ECONNABORTED,e,u)),P(),u=null},o===void 0&&i.setContentType(null),"setRequestHeader"in u&&a.forEach(Ut(i),function(T,N){u.setRequestHeader(N,T)}),a.isUndefined(s.withCredentials)||(u.withCredentials=!!s.withCredentials),c&&c!=="json"&&(u.responseType=s.responseType),d&&([y,R,S]=Te(d,!0),u.addEventListener("progress",y)),l&&u.upload&&([p,E]=Te(l),u.upload.addEventListener("progress",p),u.upload.addEventListener("loadend",E)),(s.cancelToken||s.signal)&&(f=b=>{u&&(r(!b||b.type?new be(null,e,u):b),u.abort(),P(),u=null)},s.cancelToken&&s.cancelToken.subscribe(f),s.signal&&(s.signal.aborted?f():s.signal.addEventListener("abort",f)));const g=ke(s.url);if(g&&!x.protocols.includes(g)){r(new h("Unsupported protocol "+g+":",h.ERR_BAD_REQUEST,e)),P();return}u.send(o||null)})},Jr=(e,t)=>{if(e=e?e.filter(Boolean):[],!t&&!e.length)return;const n=new AbortController;let r=!1;const s=function(l){if(!r){r=!0,i();const d=l instanceof Error?l:this.reason;n.abort(d instanceof h?d:new be(d instanceof Error?d.message:d))}};let o=t&&setTimeout(()=>{o=null,s(new h(`timeout of ${t}ms exceeded`,h.ETIMEDOUT))},t);const i=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach(l=>{l.unsubscribe?l.unsubscribe(s):l.removeEventListener("abort",s)}),e=null)};e.forEach(l=>{if(!r){if(l.aborted){s.call(l);return}l.addEventListener("abort",s,{once:!0})}});const{signal:c}=n;return c.unsubscribe=()=>a.asap(i),c},vr=function*(e,t){let n=e.byteLength;if(n{const s=Kr(e,t);let o=0,i,c=l=>{i||(i=!0,r&&r(l))};return new ReadableStream({async pull(l){try{const{done:d,value:f}=await s.next();if(d){c(),l.close();return}let p=f.byteLength;if(n){let y=o+=p;n(y)}l.enqueue(new Uint8Array(f))}catch(d){throw c(d),d}},cancel(l){return c(l),s.return()}},{highWaterMark:2})},mt=e=>e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102,Kt=(e,t,n)=>t+2e<=57?e-48:(e&223)-55,Gr=e=>e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||e===43||e===47||e===45||e===95,Qr=e=>e===9||e===10||e===12||e===13||e===32,Zr=e=>{const t=Math.floor(e/4),n=e%4;return t*3+(n===2?1:n===3?2:0)},Yr=e=>{const t=e.length;let n=0;return t>0&&e.charCodeAt(t-1)===61&&(n++,t>1&&e.charCodeAt(t-2)===61&&n++),Math.floor((t-n)*3/4)},es=e=>{const t=e.length;let n=0,r=0,s=!1;for(let o=0;o0){s=!0;continue}n++}}return s||r>2||r>0&&(n+r)%4!==0||n%4===1?Yr(e):Zr(n)},ts=(e,t)=>{if(!e||typeof e!="string"||!e.startsWith("data:"))return 0;const n=e.indexOf(",");if(n<0)return 0;const r=e.slice(5,n),s=e.slice(n+1);if(/;base64/i.test(r))return t(s);let i=0;for(let c=0,l=s.length;c=55296&&d<=56319&&c+1=56320&&f<=57343?(i+=4,c++):i+=3}else i+=3}return i};function ns(e){const t=typeof e=="string"?e.indexOf("#"):-1;return ts(t===-1?e:e.slice(0,t),es)}const Xe="1.20.0",bt=64*1024,rs={cache:"default",redirect:"follow",referrer:"about:client",referrerPolicy:"",mode:"cors",integrity:"",keepalive:!1,priority:"auto",window:null},{isFunction:Re}=a,ss=e=>encodeURIComponent(e).replace(/%([0-9A-F]{2})/gi,(t,n)=>String.fromCharCode(parseInt(n,16))),wt=e=>{if(!a.isString(e))return e;try{return decodeURIComponent(e)}catch{return e}},gt=(e,...t)=>{try{return!!e(...t)}catch{return!1}},os=e=>{const t=e.indexOf("://");let n=e;return t!==-1&&(n=n.slice(t+3)),n.includes("@")||n.includes(":")},is=e=>{const t=a.global!==void 0&&a.global!==null?a.global:globalThis,{ReadableStream:n,TextEncoder:r}=t;e=a.merge.call({skipUndefined:!0},{Request:t.Request,Response:t.Response},e);const{fetch:s,Request:o,Response:i}=e,c=s?Re(s):typeof fetch=="function",l=Re(o),d=Re(i);if(!c)return!1;const f=c&&Re(n),p=c&&(typeof r=="function"?(u=>m=>u.encode(m))(new r):async u=>new Uint8Array(await new o(u).arrayBuffer())),y=l&&f&>(()=>{let u=!1;const m=new o(x.origin,{body:new n,method:"POST",get duplex(){return u=!0,"half"}}),g=m.headers.has("Content-Type");return m.body!=null&&m.body.cancel(),u&&!g}),E=d&&f&>(()=>a.isReadableStream(new i("").body)),R={stream:E&&(u=>u.body)};c&&["text","arrayBuffer","blob","formData","stream"].forEach(u=>{!R[u]&&(R[u]=(m,g)=>{let b=m&&m[u];if(b)return b.call(m);throw new h(`Response type '${u}' is not supported`,h.ERR_NOT_SUPPORT,g)})});const S=async u=>{if(u==null)return 0;if(a.isBlob(u))return u.size;if(a.isSpecCompliantForm(u))return(await new o(x.origin,{method:"POST",body:u}).arrayBuffer()).byteLength;if(a.isArrayBufferView(u)||a.isArrayBuffer(u))return u.byteLength;if(a.isURLSearchParams(u)&&(u=u+""),a.isString(u))return(await p(u)).byteLength},P=async(u,m)=>{const g=a.toFiniteNumber(u.getContentLength());return g??S(m)};return async u=>{let{url:m,method:g,data:b,signal:T,cancelToken:N,timeout:_,onDownloadProgress:k,onUploadProgress:K,responseType:z,headers:W,withCredentials:we="same-origin",fetchOptions:De,maxContentLength:q,maxBodyLength:ge,maxRedirects:Yt}=vt(u);const ie=a.isNumber(q)&&q>-1,Le=a.isNumber(ge)&&ge>-1,en=O=>a.hasOwnProp(u,O)?u[O]:void 0;let Qe=s||fetch;z=z?(z+"").toLowerCase():"text";let V=Jr([T,N&&N.toAbortSignal()],_),C=null;const X=V&&V.unsubscribe&&(()=>{V.unsubscribe()});let ne,ae=null;const Ze=()=>new h("Request body larger than maxBodyLength limit",h.ERR_BAD_REQUEST,u,C);try{let O;const B=en("auth");if(B){const w=a.getSafeProp(B,"username")||"",D=a.getSafeProp(B,"password")||"";O={username:w,password:D}}if(os(m)){const w=new URL(m,x.origin);if(!O&&(w.username||w.password)){const D=wt(w.username),J=wt(w.password);O={username:D,password:J}}(w.username||w.password)&&(w.username="",w.password="",m=w.href)}if(O&&(W.delete("authorization"),W.set("Authorization","Basic "+btoa(ss((O.username||"")+":"+(O.password||""))))),ie&&typeof m=="string"&&m.startsWith("data:")&&ns(m)>q)throw new h("maxContentLength size of "+q+" exceeded",h.ERR_BAD_RESPONSE,u,C);if(Le&&g!=="get"&&g!=="head"){const w=await S(b);if(typeof w=="number"&&isFinite(w)&&(ne=w,w>ge))throw Ze()}const Ee=Le&&(a.isReadableStream(b)||a.isStream(b)),Ye=(w,D,J)=>ht(w,bt,G=>{if(Le&&G>ge)throw ae=Ze();D&&D(G)},J);if(y&&g!=="get"&&g!=="head"&&(K||Ee)){if(ne=ne??await P(W,b),ne!==0||Ee){let w=new o(m,{method:"POST",body:b,duplex:"half"}),D;if(a.isFormData(b)&&(D=w.headers.get("content-type"))&&W.setContentType(D),w.body){const[J,G]=K&&ut(ne,Te(ft(K)))||[];b=Ye(w.body,J,G)}}}else if(Ee&&!l&&f&&g!=="get"&&g!=="head")b=Ye(b);else if(Ee&&l&&!y&&g!=="get"&&g!=="head")throw new h("Stream request bodies are not supported by the current fetch implementation",h.ERR_NOT_SUPPORT,u,C);a.isString(we)||(we=we?"include":"omit");const tn=l&&"credentials"in o.prototype;if(a.isFormData(b)){const w=W.getContentType();w&&/^multipart\/form-data/i.test(w)&&!/boundary=/i.test(w)&&W.delete("content-type")}W.set("User-Agent","axios/"+Xe,!1);const I=De==null?De:Object.assign(Object.create(null),De);I&&(delete I.body,delete I.headers,delete I.method,delete I.signal,delete I.duplex,delete I.credentials);const H=Object.assign(Object.create(null),I,{signal:V,method:g.toUpperCase(),headers:Ut(W.normalize()),body:b,duplex:"half",credentials:tn?we:void 0});l&&(a.forEach(rs,(w,D)=>{H[D]===void 0&&(H[D]=w)}),H.signal===void 0&&(H.signal=null),H.body===void 0&&(H.body=null)),Yt===0&&(H.redirect="manual",I&&(I.redirect="manual")),C=l&&new o(m,H);let M=await(l?Qe(C,I):Qe(m,H));const et=U.from(M.headers);if(ie){const w=a.toFiniteNumber(et.getContentLength());if(w!=null&&w>q)throw new h("maxContentLength size of "+q+" exceeded",h.ERR_BAD_RESPONSE,u,C)}const Ue=E&&(z==="stream"||z==="response");if(E&&M.body&&(k||ie||Ue&&X)){const w={};["status","statusText","headers"].forEach(ce=>{w[ce]=M[ce]});const D=a.toFiniteNumber(et.getContentLength()),[J,G]=k&&ut(D,Te(ft(k),!0))||[];let tt=0;const nn=ce=>{if(ie&&(tt=ce,tt>q))throw new h("maxContentLength size of "+q+" exceeded",h.ERR_BAD_RESPONSE,u,C);J&&J(ce)};M=new i(ht(M.body,bt,nn,()=>{G&&G(),X&&X()}),w)}z=z||"text";let $=await R[a.findKey(R,z)||"text"](M,u);if(ie&&!E&&!Ue){let w;if($!=null&&(typeof $.byteLength=="number"?w=$.byteLength:typeof $.size=="number"?w=$.size:typeof $=="string"&&(w=typeof r=="function"?new r().encode($).byteLength:$.length)),typeof w=="number"&&w>q)throw new h("maxContentLength size of "+q+" exceeded",h.ERR_BAD_RESPONSE,u,C)}return!Ue&&X&&X(),await new Promise((w,D)=>{Wt(w,D,{data:$,headers:U.from(M.headers),status:M.status,statusText:M.statusText,config:u,request:C})})}catch(O){if(X&&X(),V&&V.aborted&&V.reason instanceof h){const B=V.reason;throw B.config=u,C&&(B.request=C),O!==B&&Object.defineProperty(B,"cause",{__proto__:null,value:O,writable:!0,enumerable:!1,configurable:!0}),B}if(ae)throw C&&!ae.request&&(ae.request=C),ae;if(O instanceof h)throw C&&!O.request&&(O.request=C),O;if(O&&O.name==="TypeError"&&/Load failed|fetch/i.test(O.message)){const B=new h("Network Error",h.ERR_NETWORK,u,C,O&&O.response);throw Object.defineProperty(B,"cause",{__proto__:null,value:O.cause||O,writable:!0,enumerable:!1,configurable:!0}),B}throw h.from(O,O&&O.code,u,C,O&&O.response)}}},as=new Map,Xt=e=>{let t=e&&e.env||{};const{fetch:n,Request:r,Response:s}=t,o=[r,s,n];let i=o.length,c=i,l,d,f=as;for(;c--;)l=o[c],d=f.get(l),d===void 0&&f.set(l,d=c?new Map:is(t)),f=d;return d};Xt();const Ge={http:hr,xhr:Vr,fetch:{get:Xt}};a.forEach(Ge,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{__proto__:null,value:t})}catch{}Object.defineProperty(e,"adapterName",{__proto__:null,value:t})}});const Et=e=>`- ${e}`,cs=e=>a.isFunction(e)||e===null||e===!1;function ls(e,t){e=a.isArray(e)?e:[e];const{length:n}=e;let r,s;const o={};for(let i=0;i`adapter ${l} `+(d===!1?"is not supported by the environment":"is not available in the build"));let c=n?i.length>1?`since : -`+i.map(Et).join(` -`):" "+Et(i[0]):"as no adapter specified";throw new h("There is no suitable adapter to dispatch the request "+c,h.ERR_NOT_SUPPORT)}return s}const Gt={getAdapter:ls,adapters:Ge};function qe(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new be(null,e)}function He(e){const t=a.toSafeFlatObject(e);return qe(t),t.headers=U.from(a.getSafeProp(t,"headers")),t.data=Ie.call(t,t.transformRequest),["post","put","patch"].indexOf(t.method)!==-1&&t.headers.setContentType("application/x-www-form-urlencoded",!1),Gt.getAdapter(t.adapter||ye.adapter,t)(t).then(function(s){qe(t),t.response=s;try{s.data=Ie.call(t,t.transformResponse,s)}finally{delete t.response}return s.headers=U.from(s.headers),s},function(s){if(!zt(s)&&(qe(t),s&&s.response)){t.response=s.response;try{s.response.data=Ie.call(t,t.transformResponse,s.response)}finally{delete t.response}s.response.headers=U.from(s.response.headers)}return Promise.reject(s)})}const Ne={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Ne[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const Rt={};Ne.transitional=function(t,n,r){function s(o,i){return"[Axios v"+Xe+"] Transitional option '"+o+"'"+i+(r?". "+r:"")}return(o,i,c)=>{if(t===!1)throw new h(s(i," has been removed"+(n?" in "+n:"")),h.ERR_DEPRECATED);return n&&!Rt[i]&&(Rt[i]=!0,console.warn(s(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(o,i,c):!0}};Ne.spelling=function(t){return(n,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function us(e,t,n){if(typeof e!="object"||e===null)throw new h("options must be an object",h.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let s=r.length;for(;s-- >0;){const o=r[s],i=Object.prototype.hasOwnProperty.call(t,o)?t[o]:void 0;if(i){const c=e[o],l=c===void 0||i(c,o,e);if(l!==!0)throw new h("option "+o+" must be "+l,h.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new h("Unknown option "+o,h.ERR_BAD_OPTION)}}const _e={assertOptions:us,validators:Ne},L=_e.validators;let Z=class{constructor(t){this.defaults=t||{},this.interceptors={request:new ct,response:new ct}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error)try{let s={};Error.captureStackTrace?Error.captureStackTrace(s):s=new Error;const o=s.stack;let i="";if(typeof o=="string"){const c=o.indexOf(` +function At(e,t){return function(){return e.apply(t,arguments)}}const{toString:cn}=Object.prototype,{getPrototypeOf:J}=Object,{iterator:me,toStringTag:_t}=Symbol,pe=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Pt=e=>typeof e=="string"&&(e==="__proto__"||e==="constructor"||e==="prototype"),xt=(e,t,n)=>e===Object.prototype||!n&&t===null,ln=e=>{if(!Object.isExtensible(e))return!1;const t=Object.getOwnPropertyNames(e);return Object.getOwnPropertySymbols&&t.push(...Object.getOwnPropertySymbols(e)),t.every(n=>{if(Pt(n))return!1;const r=Object.getOwnPropertyDescriptor(e,n);return!!r&&r.configurable&&r.writable===!0})},he=(e,t)=>{let n=e;const r=[];for(;n!=null;){if(r.indexOf(n)!==-1)return!1;r.push(n);const s=J(n);if(xt(n,s,n===e))return!1;if(pe(n,t))return!0;n=s}return!1},un=(e,t)=>e!=null&&he(e,t)?e[t]:void 0,fn=e=>{if(e==null||typeof e!="object"&&typeof e!="function")return e;const t=J(e);if(t===null&&ln(e))return e;const n=Object.create(null),r=Object.create(null),s=[];let o=e;for(;o!=null&&s.indexOf(o)===-1;){s.push(o);const i=o===e?t:J(o);if(xt(o,i,o===e))break;const c=Object.getOwnPropertyNames(o);Object.getOwnPropertySymbols&&c.push(...Object.getOwnPropertySymbols(o));for(const l of c)Pt(l)||pe(r,l)||(n[l]=e[l],r[l]=!0);o=i}return n},ve=(e=>t=>{const n=cn.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),j=e=>(e=e.toLowerCase(),t=>ve(t)===e),Ce=e=>t=>typeof t===e,{isArray:Y}=Array,ee=Ce("undefined");function oe(e){return e!==null&&!ee(e)&&e.constructor!==null&&!ee(e.constructor)&&F(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Tt=j("ArrayBuffer");function dn(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Tt(e.buffer),t}const pn=Ce("string"),F=Ce("function"),Ct=Ce("number"),ie=e=>e!==null&&typeof e=="object",hn=e=>e===!0||e===!1,Se=e=>{if(!ie(e))return!1;const t=J(e);return(t===null||t===Object.prototype||J(t)===null)&&!he(e,_t)&&!he(e,me)},mn=e=>{if(!ie(e)||oe(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},yn=j("Date"),bn=j("File"),wn=e=>!!(e&&typeof e.uri<"u"),gn=e=>e&&typeof e.getParts<"u",En=j("Blob"),Rn=j("FileList"),On=j("Set"),Sn=e=>ie(e)&&F(e.pipe);function An(){return typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}}const st=An(),ot=typeof st.FormData<"u"?st.FormData:void 0,_n=e=>{if(!e)return!1;if(ot&&e instanceof ot)return!0;const t=J(e);if(!t||t===Object.prototype||!F(e.append))return!1;const n=ve(e);return n==="formdata"||n==="object"&&F(e.toString)&&e.toString()==="[object FormData]"},Pn=j("URLSearchParams"),[xn,Tn,Cn,Nn]=["ReadableStream","Request","Response","Headers"].map(j),Dn=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function ye(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,s;if(typeof e!="object"&&(e=[e]),Y(e))for(r=0,s=e.length;r0;)if(s=n[r],t===s.toLowerCase())return s;return null}const Q=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Dt=e=>!ee(e)&&e!==Q;function $e(...e){const{caseless:t,skipUndefined:n}=Dt(this)&&this||{},r={},s=(o,i)=>{if(i==="__proto__"||i==="constructor"||i==="prototype")return;const c=t&&typeof i=="string"&&Nt(r,i)||i,l=pe(r,c)?r[c]:void 0;Se(l)&&Se(o)?r[c]=$e(l,o):Se(o)?r[c]=$e({},o):Y(o)?r[c]=o.slice():(!n||!ee(o))&&(r[c]=o)};for(let o=0,i=e.length;o(ye(t,(s,o)=>{n&&F(s)?Object.defineProperty(e,o,{__proto__:null,value:At(s,n),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,o,{__proto__:null,value:s,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:r}),e),Un=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),Fn=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),Object.defineProperty(e.prototype,"constructor",{__proto__:null,value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{__proto__:null,value:t.prototype}),n&&Object.assign(e.prototype,n)},Bn=(e,t,n,r)=>{let s,o,i;const c={};if(t=t||{},e==null)return t;do{for(s=Object.getOwnPropertyNames(e),o=s.length;o-- >0;)i=s[o],(!r||r(i,e,t))&&!c[i]&&(t[i]=e[i],c[i]=!0);e=n!==!1&&J(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},jn=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},kn=e=>{if(!e)return null;if(Y(e))return e;let t=e.length;if(!Ct(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},In=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&J(Uint8Array)),qn=(e,t)=>{const r=(e&&e[me]).call(e);let s;for(;(s=r.next())&&!s.done;){const o=s.value;t.call(e,o[0],o[1])}},Hn=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},Mn=j("HTMLFormElement"),$n=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,s){return r.toUpperCase()+s}),{propertyIsEnumerable:zn}=Object.prototype,Wn=j("RegExp"),Lt=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};ye(n,(s,o)=>{let i;(i=t(s,o,e))!==!1&&(r[o]=i||s)}),Object.defineProperties(e,r)},vn=e=>{Lt(e,(t,n)=>{if(F(e)&&["arguments","caller","callee"].includes(n))return!1;const r=e[n];if(F(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},Vn=(e,t)=>{const n={},r=s=>{s.forEach(o=>{n[o]=!0})};return Y(e)?r(e):r(String(e).split(t)),n},Jn=()=>{},Kn=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Xn(e){return!!(e&&F(e.append)&&e[_t]==="FormData"&&e[me])}const Gn=e=>{const t=new WeakSet,n=r=>{if(ie(r)){if(t.has(r))return;if(oe(r))return r;if(!("toJSON"in r)){t.add(r);let s;if(On(r)){s=[];for(const o of r){const i=n(o);!ee(i)&&s.push(i)}}else s=Y(r)?[]:{},ye(r,(o,i)=>{const c=n(o);!ee(c)&&(s[i]=c)});return t.delete(r),s}}return r};return n(e)},Qn=j("AsyncFunction"),Zn=e=>e&&(ie(e)||F(e))&&F(e.then)&&F(e.catch),Ut=((e,t)=>e?setImmediate:t?((n,r)=>(Q.addEventListener("message",({source:s,data:o})=>{s===Q&&o===n&&r.length&&r.shift()()},!1),s=>{r.push(s),Q.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",F(Q.postMessage)),Yn=typeof queueMicrotask<"u"?queueMicrotask.bind(Q):typeof process<"u"&&process.nextTick||Ut,Ft=e=>e!=null&&F(e[me]),er=e=>e!=null&&he(e,me)&&Ft(e),a={isArray:Y,isArrayBuffer:Tt,isBuffer:oe,isFormData:_n,isArrayBufferView:dn,isString:pn,isNumber:Ct,isBoolean:hn,isObject:ie,isPlainObject:Se,isEmptyObject:mn,isReadableStream:xn,isRequest:Tn,isResponse:Cn,isHeaders:Nn,isUndefined:ee,isDate:yn,isFile:bn,isReactNativeBlob:wn,isReactNative:gn,isBlob:En,isRegExp:Wn,isFunction:F,isStream:Sn,isURLSearchParams:Pn,isTypedArray:In,isFileList:Rn,forEach:ye,merge:$e,extend:Ln,trim:Dn,stripBOM:Un,inherits:Fn,toFlatObject:Bn,kindOf:ve,kindOfTest:j,endsWith:jn,toArray:kn,forEachEntry:qn,matchAll:Hn,isHTMLForm:Mn,hasOwnProperty:pe,hasOwnProp:pe,hasOwnInPrototypeChain:he,getSafeProp:un,toSafeFlatObject:fn,reduceDescriptors:Lt,freezeMethods:vn,toObjectSet:Vn,toCamelCase:$n,noop:Jn,toFiniteNumber:Kn,findKey:Nt,global:Q,isContextDefined:Dt,isSpecCompliantForm:Xn,toJSONObject:Gn,isAsyncFn:Qn,isThenable:Zn,setImmediate:Ut,asap:Yn,isIterable:Ft,isSafeIterable:er},tr=a.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),nr=e=>{const t={};let n,r,s;return e&&e.split(` +`).forEach(function(i){s=i.indexOf(":"),n=i.substring(0,s).trim().toLowerCase(),r=i.substring(s+1).trim();const c=a.hasOwnProp(t,n);!n||c&&a.hasOwnProp(tr,n)||(n==="set-cookie"?c?t[n].push(r):t[n]=[r]:t[n]=c?t[n]+", "+r:r)}),t};function rr(e){let t=0,n=e.length;for(;tt;){const r=e.charCodeAt(n-1);if(r!==9&&r!==32)break;n-=1}return t===0&&n===e.length?e:e.slice(t,n)}const sr=new RegExp("[\\u0000-\\u0008\\u000a-\\u001f\\u007f]+","g"),or=new RegExp("[^\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+","g");function Ve(e,t){return a.isArray(e)?e.map(n=>Ve(n,t)):rr(String(e).replace(t,""))}const ir=e=>Ve(e,sr),ar=e=>Ve(e,or);function Bt(e){const t=Object.create(null);return a.forEach(e.toJSON(),(n,r)=>{t[r]=ar(n)}),t}const it=Symbol("internals");function ue(e){return e&&String(e).trim().toLowerCase()}function Ae(e){return e===!1||e==null?e:a.isArray(e)?e.map(Ae):ir(String(e))}function cr(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const lr=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;function Be(e){let t=0,n=e.length;for(;tt;){const r=e.charCodeAt(n-1);if(r!==9&&r!==32)break;n-=1}return t===0&&n===e.length?e:e.slice(t,n)}function ur(e){const t=e.length-1;if(t<1||e.charCodeAt(0)!==34||e.charCodeAt(t)!==34)return e;let n="";for(let r=1;r=t))return e;n+=e[r]}return n}function fr(e){const t=Object.create(null),n=String(e);let r=0,s=!1,o=!1;function i(c){const l=Be(n.slice(r,c)),d=l.indexOf("=");if(d<1)return;const f=Be(l.slice(0,d));if(!lr.test(f))return;const p=f.toLowerCase();if(p==="__proto__"||p==="constructor"||p==="prototype")return;const y=Be(l.slice(d+1));t[p]=ur(y)}for(let c=0;c/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function je(e,t,n,r,s){if(a.isFunction(r))return r.call(this,t,n);if(s&&(t=n),!!a.isString(t)){if(a.isString(r))return t.indexOf(r)!==-1;if(a.isRegExp(r))return r.test(t)}}function pr(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function hr(e,t){const n=a.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{__proto__:null,value:function(s,o,i){return this[r].call(this,t,s,o,i)},configurable:!0})})}let U=class{constructor(t){t&&this.set(t)}set(t,n,r){const s=this;function o(c,l,d){const f=ue(l);if(!f)return;const p=a.findKey(s,f);(!p||s[p]===void 0||d===!0||d===void 0&&s[p]!==!1)&&(s[p||l]=Ae(c))}const i=(c,l)=>a.forEach(c,(d,f)=>o(d,f,l));if(a.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(a.isString(t)&&(t=t.trim())&&!dr(t))i(nr(t),n);else if(a.isObject(t)&&a.isSafeIterable(t)){let c=Object.create(null),l,d;for(const f of t){if(!a.isArray(f))throw new TypeError("Object iterator must return a key-value pair");d=f[0],a.hasOwnProp(c,d)?(l=c[d],c[d]=a.isArray(l)?[...l,f[1]]:[l,f[1]]):c[d]=f[1]}i(c,n)}else t!=null&&o(n,t,r);return this}get(t,n){if(t=ue(t),t){const r=a.findKey(this,t);if(r){const s=this[r];if(!n)return s;if(n===!0)return cr(s);if(a.isFunction(n))return n.call(this,s,r);if(a.isRegExp(n))return n.exec(s);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=ue(t),t){const r=a.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||je(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let s=!1;function o(i){if(i=ue(i),i){const c=a.findKey(r,i);c&&(!n||je(r,r[c],c,n))&&(delete r[c],s=!0)}}return a.isArray(t)?t.forEach(o):o(t),s}clear(t){const n=Object.keys(this);let r=n.length,s=!1;for(;r--;){const o=n[r];(!t||je(this,this[o],o,t,!0))&&(delete this[o],s=!0)}return s}normalize(t){const n=this,r={};return a.forEach(this,(s,o)=>{const i=a.findKey(r,o);if(i){n[i]=Ae(s),delete n[o];return}const c=t?pr(o):String(o).trim();c!==o&&delete n[o],n[c]=Ae(s),r[c]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return a.forEach(this,(r,s)=>{r!=null&&r!==!1&&(n[s]=t&&a.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` +`)}getSetCookie(){const t=this.get("set-cookie");return a.isArray(t)?t:t==null||t===!1?[]:[t]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static parseParameters(t){return fr(t)}static concat(t,...n){const r=new this(t);return n.forEach(s=>r.set(s)),r}static accessor(t){const r=(this[it]=this[it]={accessors:{}}).accessors,s=this.prototype;function o(i){const c=ue(i);r[c]||(hr(s,i),r[c]=!0)}return a.isArray(t)?t.forEach(o):o(t),this}};U.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);a.reduceDescriptors(U.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});a.freezeMethods(U);const xe="[REDACTED ****]";function mr(e){if(a.hasOwnProp(e,"toJSON"))return!0;let t=Object.getPrototypeOf(e);for(;t&&t!==Object.prototype;){if(a.hasOwnProp(t,"toJSON"))return!0;t=Object.getPrototypeOf(t)}return!1}function yr(e,t){const n=new Set(t.map(o=>String(o).toLowerCase())),r=[],s=o=>{if(o===null||typeof o!="object"||a.isBuffer(o))return o;if(r.indexOf(o)!==-1)return;o instanceof U&&(o=o.toJSON()),r.push(o);let i;if(a.isArray(o))i=[],o.forEach((c,l)=>{const d=s(c);a.isUndefined(d)||(i[l]=d)});else{if(!a.isPlainObject(o)&&mr(o))return r.pop(),o;i=Object.create(null);for(const[c,l]of Object.entries(o)){const d=n.has(c.toLowerCase())?xe:s(l);a.isUndefined(d)||(i[c]=d)}}return r.pop(),i};return s(e)}function at(e){try{return String(e)}catch{return""}}function br(e){return e.errors.map(n=>{try{return n&&n.message?at(n.message):at(n)}catch{return""}}).filter(Boolean).join("; ")||e.name||"AggregateError"}let h=class jt extends Error{static from(t,n,r,s,o,i){let c=t.message;!c&&a.isArray(t.errors)&&t.errors.length&&(c=br(t));const l=new jt(c,n||t.code,r,s,o);return Object.defineProperty(l,"cause",{__proto__:null,value:t,writable:!0,enumerable:!1,configurable:!0}),l.name=t.name,t.status!=null&&l.status==null&&(l.status=t.status),i&&Object.assign(l,i),l}constructor(t,n,r,s,o){super(t),Object.defineProperty(this,"message",{__proto__:null,value:t,enumerable:!0,writable:!0,configurable:!0}),this.name="AxiosError",this.isAxiosError=!0,n&&(this.code=n),r&&(this.config=r),s&&(this.request=s),o&&(this.response=o,this.status=o.status)}toJSON(){const t=this.config,n=t&&a.hasOwnProp(t,"redact")?t.redact:void 0,r=a.isArray(n)&&n.length>0?yr(t,n):a.toJSONObject(t);return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:r,code:this.code,status:this.status}}};h.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE";h.ERR_BAD_OPTION="ERR_BAD_OPTION";h.ECONNABORTED="ECONNABORTED";h.ETIMEDOUT="ETIMEDOUT";h.ECONNREFUSED="ECONNREFUSED";h.ERR_NETWORK="ERR_NETWORK";h.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS";h.ERR_DEPRECATED="ERR_DEPRECATED";h.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE";h.ERR_BAD_REQUEST="ERR_BAD_REQUEST";h.ERR_CANCELED="ERR_CANCELED";h.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT";h.ERR_INVALID_URL="ERR_INVALID_URL";h.ERR_FORM_DATA_DEPTH_EXCEEDED="ERR_FORM_DATA_DEPTH_EXCEEDED";const wr=null,kt=100;function ze(e){return a.isPlainObject(e)||a.isArray(e)}function It(e){return a.endsWith(e,"[]")?e.slice(0,-2):e}function ke(e,t,n){return e?e.concat(t).map(function(s,o){return s=It(s),!n&&o?"["+s+"]":s}).join(n?".":""):t}function gr(e){return a.isArray(e)&&!e.some(ze)}const Er=a.toFlatObject(a,{},null,function(t){return/^is[A-Z]/.test(t)});function Ne(e,t,n){if(!a.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;const r=(m,g)=>{const b=a.getSafeProp(n,m);return a.isUndefined(b)?g:b},s=r("metaTokens",!0),o=r("visitor")||S,i=r("dots",!1),c=r("indexes",!1),l=r("Blob")||typeof Blob<"u"&&Blob,d=r("maxDepth",kt),f=l&&a.isSpecCompliantForm(t),p=[];if(!a.isFunction(o))throw new TypeError("visitor must be a function");function y(m){if(m===null)return"";if(a.isDate(m))return m.toISOString();if(a.isBoolean(m))return m.toString();if(!f&&a.isBlob(m))throw new h("Blob is not supported. Use a Buffer instead.");if(a.isArrayBuffer(m)||a.isTypedArray(m)){if(f&&typeof l=="function")return new l([m]);throw new h("Blob is not supported. Use a Buffer instead.",h.ERR_NOT_SUPPORT)}return m}function E(m){if(m>d)throw new h("Object is too deeply nested ("+m+" levels). Max depth: "+d,h.ERR_FORM_DATA_DEPTH_EXCEEDED)}function R(m,g){if(d===1/0)return JSON.stringify(m);const b=[];return JSON.stringify(m,function(N,A){if(!a.isObject(A))return A;for(;b.length&&b[b.length-1]!==this;)b.pop();return b.push(A),E(g+b.length-1),A})}function S(m,g,b){let x=m;if(a.isReactNative(t)&&a.isReactNativeBlob(m))return t.append(ke(b,g,i),y(m)),!1;if(m&&!b&&typeof m=="object"){if(a.endsWith(g,"{}"))g=s?g:g.slice(0,-2),m=R(m,1);else if(a.isArray(m)&&gr(m)||(a.isFileList(m)||a.endsWith(g,"[]"))&&(x=a.toArray(m)))return g=It(g),x.forEach(function(A,I){!(a.isUndefined(A)||A===null)&&t.append(c===!0?ke([g],I,i):c===null?g:g+"[]",y(A))}),!1}return ze(m)?!0:(t.append(ke(b,g,i),y(m)),!1)}const P=Object.assign(Er,{defaultVisitor:S,convertValue:y,isVisitable:ze});function u(m,g,b=0){if(!a.isUndefined(m)){if(E(b),p.indexOf(m)!==-1)throw new Error("Circular reference detected in "+g.join("."));p.push(m),a.forEach(m,function(N,A){(!(a.isUndefined(N)||N===null)&&o.call(t,N,a.isString(A)?A.trim():A,g,P))===!0&&u(N,g?g.concat(A):[A],b+1)}),p.pop()}}if(!a.isObject(e))throw new TypeError("data must be an object");return u(e),t}function ct(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"};return encodeURIComponent(e).replace(/[!'()~]|%20/g,function(r){return t[r]})}function Je(e,t){this._pairs=[],e&&Ne(e,this,t)}const qt=Je.prototype;qt.append=function(t,n){this._pairs.push([t,n])};qt.toString=function(t){const n=t?r=>t.call(this,r,ct):ct;return this._pairs.map(function(s){return n(s[0])+"="+n(s[1])},"").join("&")};function Rr(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Ht(e,t,n){if(!t)return e;e=e||"";const r=a.isFunction(n)?{serialize:n}:n,s=a.getSafeProp(r,"encode")||Rr,o=a.getSafeProp(r,"serialize");let i;if(o?i=o(t,r):i=a.isURLSearchParams(t)?t.toString():new Je(t,r).toString(s),i){const c=e.indexOf("#");c!==-1&&(e=e.slice(0,c)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}const fe=Symbol("internals");function Mt(e){return e?e.length:0}function lt(e){if(e)for(;e.length&&e[e.length-1]===null;)e.pop()}function de(e,t){const n=e.handlers,r=Mt(n);n!==t.handlersRef?(t.handlersRef=n,t.handlerEntries.clear()):r!==t.handlersLength&&(r?t.handlerEntries.forEach(function(o,i){n[o.index]!==o.handler&&t.handlerEntries.delete(i)}):t.handlerEntries.clear()),t.handlersLength=r}class ut{constructor(){this.handlers=[],this[fe]={handlersRef:this.handlers,handlersLength:this.handlers.length,handlerEntries:new Map,iterationDepth:0,nextId:0}}use(t,n,r){const s={fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null},o=this[fe];this.handlers==null&&(this.handlers=[]),de(this,o);const i=o.nextId++;return this.handlers.push(s),o.handlerEntries.set(i,{handler:s,index:this.handlers.length-1}),o.handlersLength=this.handlers.length,i}eject(t){const n=this[fe];de(this,n);const r=n.handlerEntries.get(t);if(r){if(n.handlerEntries.delete(t),this.handlers[r.index]!==r.handler)return;this.handlers[r.index]=null,n.iterationDepth||(lt(this.handlers),n.handlersLength=this.handlers.length)}}clear(){this.handlers&&(this.handlers=[],de(this,this[fe]))}forEach(t){const n=this[fe];de(this,n),n.iterationDepth++;try{a.forEach(this.handlers,function(s){s!==null&&t(s)})}finally{--n.iterationDepth||(de(this,n),lt(this.handlers),n.handlersLength=Mt(this.handlers))}}}const Ke={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0,advertiseZstdAcceptEncoding:!1,validateStatusUndefinedResolves:!0},Or=typeof URLSearchParams<"u"?URLSearchParams:Je,Sr=typeof FormData<"u"?FormData:null,Ar=typeof Blob<"u"?Blob:null,_r={isBrowser:!0,classes:{URLSearchParams:Or,FormData:Sr,Blob:Ar},protocols:["http","https","file","blob","url","data"]},Xe=typeof window<"u"&&typeof document<"u",We=typeof navigator=="object"&&navigator||void 0,Pr=Xe&&(!We||["ReactNative","NativeScript","NS"].indexOf(We.product)<0),xr=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",Tr=Xe&&window.location.href||"http://localhost",Cr=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Xe,hasStandardBrowserEnv:Pr,hasStandardBrowserWebWorkerEnv:xr,navigator:We,origin:Tr},Symbol.toStringTag,{value:"Module"})),T={...Cr,..._r};function Nr(e,t){return Ne(e,new T.classes.URLSearchParams,{visitor:function(n,r,s,o){return T.isNode&&a.isBuffer(n)?(this.append(r,n.toString("base64")),!1):o.defaultVisitor.apply(this,arguments)},...t})}const ft=kt;function $t(e){if(e>ft)throw new h("FormData field is too deeply nested ("+e+" levels). Max depth: "+ft,h.ERR_FORM_DATA_DEPTH_EXCEEDED)}function Dr(e){const t=[],n=/[^.[\]]+|\[([^.[\]]*)]/g;let r;for(;(r=n.exec(e))!==null;)$t(t.length),t.push(r[0]==="[]"?"":r[1]||r[0]);return t}function Lr(e){const t={},n=Object.keys(e);let r;const s=n.length;let o;for(r=0;r=n.length;return i=!i&&a.isArray(s)?s.length:i,l?(a.hasOwnProp(s,i)?s[i]=a.isArray(s[i])?s[i].concat(r):[s[i],r]:s[i]=r,!c):((!a.hasOwnProp(s,i)||!a.isObject(s[i]))&&(s[i]=[]),t(n,r,s[i],o)&&a.isArray(s[i])&&(s[i]=Lr(s[i])),!c)}if(a.isFormData(e)&&a.isFunction(e.entries)){const n={};return a.forEachEntry(e,(r,s)=>{t(Dr(r),s,n,0)}),n}return null}const Wt=Object.freeze(["get","delete","head","options","post","put","patch","purge","link","unlink","query"]),re=(e,t)=>e!=null&&a.hasOwnProp(e,t)?e[t]:void 0;function Ur(e,t,n){if(a.isString(e))try{return(t||JSON.parse)(e),a.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const be={transitional:Ke,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",s=r.indexOf("application/json")>-1,o=a.isObject(t);if(o&&a.isHTMLForm(t)&&(t=new FormData(t)),a.isFormData(t))return s?JSON.stringify(zt(t)):t;if(a.isArrayBuffer(t)||a.isBuffer(t)||a.isStream(t)||a.isFile(t)||a.isBlob(t)||a.isReadableStream(t))return t;if(a.isArrayBufferView(t))return t.buffer;if(a.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let c;if(o){const l=re(this,"formSerializer");if(r.indexOf("application/x-www-form-urlencoded")>-1)return Nr(t,l).toString();if((c=a.isFileList(t))||r.indexOf("multipart/form-data")>-1){const d=re(this,"env"),f=d&&d.FormData;return Ne(c?{"files[]":t}:t,f&&new f,l)}}return o||s?(n.setContentType("application/json",!1),Ur(t)):t}],transformResponse:[function(t){const n=re(this,"transitional")||be.transitional,r=n&&n.forcedJSONParsing,s=re(this,"responseType"),o=s==="json";if(a.isResponse(t)||a.isReadableStream(t))return t;if(t&&a.isString(t)&&(r&&!s||o)){const c=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t,re(this,"parseReviver"))}catch(l){if(c)throw l.name==="SyntaxError"?h.from(l,h.ERR_BAD_RESPONSE,this,null,re(this,"response")):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:T.classes.FormData,Blob:T.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};a.forEach(Wt,e=>{be.headers[e]={}});function Ie(e,t){const n=this||be,r=t||n,s=U.from(r.headers);let o=r.data;return a.forEach(e,function(c){o=c.call(n,o,s.normalize(),t?t.status:void 0)}),s.normalize(),o}function vt(e){return!!(e&&e.__CANCEL__)}let we=class extends h{constructor(t,n,r){super(t??"canceled",h.ERR_CANCELED,n,r),this.name="CanceledError",this.__CANCEL__=!0}};function Vt(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new h("Request failed with status code "+n.status,n.status>=400&&n.status<500?h.ERR_BAD_REQUEST:h.ERR_BAD_RESPONSE,n.config,n.request,n))}const Fr=/[\t\n\r]/g;function Jt(e){if(typeof e!="string")return e;let t=0;for(;t{n=p,s=null,o&&(clearTimeout(o),o=null),e(...f)};return[(...f)=>{const p=Date.now(),y=p-n;y>=r?i(f,p):(s=f,o||(o=setTimeout(()=>{o=null,i(s)},r-y)))},()=>s&&i(s),(...f)=>i(f)]}const Te=(e,t,n=3)=>{let r=0;const s=Br(50,250);return jr(o=>{if(!o||!a.isNumber(o.loaded))return;const i=o.loaded,c=o.lengthComputable?o.total:void 0,l=Math.max(0,c!=null?Math.min(i,c):i),d=Math.max(0,l-r),f=s(d);r=Math.max(r,l);const p={loaded:l,total:c,progress:c?l/c:void 0,bytes:d,rate:f||void 0,estimated:f&&c?(c-l)/f:void 0,event:o,lengthComputable:c!=null,[t?"download":"upload"]:!0};e(p)},n)},dt=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},pt=(e,t=a.asap)=>(...n)=>t(()=>e(...n)),kr=T.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,T.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(T.origin),T.navigator&&/(msie|trident)/i.test(T.navigator.userAgent)):()=>!0,Ir=T.hasStandardBrowserEnv?{write(e,t,n,r,s,o,i){if(typeof document>"u")return;const c=[`${e}=${encodeURIComponent(t)}`];a.isNumber(n)&&c.push(`expires=${new Date(n).toUTCString()}`),a.isString(r)&&c.push(`path=${r}`),a.isString(s)&&c.push(`domain=${s}`),o===!0&&c.push("secure"),a.isString(i)&&c.push(`SameSite=${i}`),document.cookie=c.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.split(";");for(let n=0;n0&&e.charCodeAt(n-1)===47;)n--;return e.slice(0,n)+"/"+t.replace(/^\/+/,"")}const Mr=/^https?:(?!\/\/)/i;function $r(e){return e&&e.replace(/(^|&)([^=&]*=)?[^&]+/g,(t,n,r="")=>`${n}${r}${xe}`)}function zr(e){const t=e.replace(/^(https?:\/{0,2})[^/?#]*@/i,`$1${xe}@`),n=t.indexOf("#"),s=(n===-1?t:t.slice(0,n)).replace(/([?&][^=&#]*=)[^&#]*/g,`$1${xe}`);return n===-1?s:`${s}#${$r(t.slice(n+1))}`}function ht(e,t){if(typeof e=="string"){const n=Jt(e);if(Mr.test(n))throw new h(`Invalid URL ${JSON.stringify(zr(n))}: missing "//" after protocol`,h.ERR_INVALID_URL,t)}}function Kt(e,t,n,r){ht(t,r);let s=!qr(t);return e&&(s||n===!1)?(ht(e,r),Hr(e,t)):t}const mt=e=>e instanceof U?{...e}:e,Wr=e=>Object.getOwnPropertySymbols&&Object.getOwnPropertyDescriptor?Object.keys(e).concat(Object.getOwnPropertySymbols(e).filter(t=>Object.getOwnPropertyDescriptor(e,t).enumerable)):Object.keys(e);function te(e,t){e=e||{},t=t||{};const n=Object.create(null);Object.defineProperty(n,"hasOwnProperty",{__proto__:null,value:Object.prototype.hasOwnProperty,enumerable:!1,writable:!0,configurable:!0});function r(f,p,y,E){return a.isPlainObject(f)&&a.isPlainObject(p)?a.merge.call({caseless:E},f,p):a.isPlainObject(p)?a.merge({},p):a.isArray(p)?p.slice():p}function s(f,p,y,E){if(a.isUndefined(p)){if(!a.isUndefined(f))return r(void 0,f,y,E)}else return r(f,p,y,E)}function o(f,p){if(!a.isUndefined(p))return r(void 0,p)}function i(f,p){if(a.isUndefined(p)){if(!a.isUndefined(f))return r(void 0,f)}else return r(void 0,p)}function c(f){const p=a.hasOwnProp(t,"transitional")?t.transitional:void 0;if(!a.isUndefined(p))if(a.isPlainObject(p)){if(a.hasOwnProp(p,f))return p[f]}else return;const y=a.hasOwnProp(e,"transitional")?e.transitional:void 0;if(a.isPlainObject(y)&&a.hasOwnProp(y,f))return y[f]}function l(f,p,y){if(a.hasOwnProp(t,y))return r(f,p);if(a.hasOwnProp(e,y))return r(void 0,f)}const d={url:o,method:o,data:o,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutErrorMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,allowedSocketPaths:i,responseEncoding:i,validateStatus:l,headers:(f,p,y)=>s(mt(f),mt(p),y,!0)};return a.forEach(Wr({...e,...t}),function(p){if(p==="__proto__"||p==="constructor"||p==="prototype")return;const y=a.hasOwnProp(d,p)?d[p]:s,E=a.hasOwnProp(e,p)?e[p]:void 0,R=a.hasOwnProp(t,p)?t[p]:void 0,S=y(E,R,p);a.isUndefined(S)&&y!==l||(n[p]=S)}),a.hasOwnProp(t,"validateStatus")&&a.isUndefined(t.validateStatus)&&c("validateStatusUndefinedResolves")===!1&&(a.hasOwnProp(e,"validateStatus")?n.validateStatus=r(void 0,e.validateStatus):delete n.validateStatus),n}const vr=["content-type","content-length"];function Vr(e,t,n){if(n!=="content-only"){e.set(t);return}Object.entries(t||{}).forEach(([r,s])=>{vr.includes(r.toLowerCase())&&e.set(r,s)})}const Jr=e=>encodeURIComponent(e).replace(/%([0-9A-F]{2})/gi,(t,n)=>String.fromCharCode(parseInt(n,16)));function Xt(e){const t=te({},e),n=y=>a.hasOwnProp(t,y)?t[y]:void 0,r=n("data");let s=n("withXSRFToken");const o=n("xsrfHeaderName"),i=n("xsrfCookieName");let c=n("headers");const l=n("auth"),d=n("baseURL"),f=n("allowAbsoluteUrls"),p=n("url");if(t.headers=c=U.from(c),t.url=Ht(Kt(d,p,f,t),n("params"),n("paramsSerializer")),l){const y=a.getSafeProp(l,"username")||"",E=a.getSafeProp(l,"password")||"";try{c.set("Authorization","Basic "+btoa(y+":"+(E?Jr(E):"")))}catch(R){throw h.from(R,h.ERR_BAD_OPTION_VALUE,e)}}if(a.isFormData(r)){const y=a.getSafeProp(r,"getHeaders");T.hasStandardBrowserEnv||T.hasStandardBrowserWebWorkerEnv||a.isReactNative(r)?c.setContentType(void 0):a.isFunction(y)&&Vr(c,y.call(r),n("formDataHeaderPolicy"))}if(T.hasStandardBrowserEnv&&(a.isFunction(s)&&(s=s(t)),s===!0||s==null&&kr(t.url))){const E=o&&i&&Ir.read(i);E&&c.set(o,E)}return t}const Kr=typeof XMLHttpRequest<"u",Xr=Kr&&function(e){return new Promise(function(n,r){const s=Xt(e);let o=s.data;const i=U.from(s.headers).normalize();let{responseType:c,onUploadProgress:l,onDownloadProgress:d}=s,f,p,y,E,R,S;function P(){E&&E(),R&&R(),s.cancelToken&&s.cancelToken.unsubscribe(f),s.signal&&s.signal.removeEventListener("abort",f)}let u=new XMLHttpRequest;u.open(s.method.toUpperCase(),s.url,!0),u.timeout=s.timeout;function m(b){if(!u)return;if(u.status===0&&(qe(Jt(s.url))||qe(T.origin))!=="file"&&!(u.responseURL&&u.responseURL.startsWith("file:"))){r(new h("Request aborted",h.ECONNABORTED,e,u)),P(),u=null;return}try{b?S&&S(b):R&&R()}catch(I){setTimeout(()=>{throw I})}if(!u)return;const x=U.from("getAllResponseHeaders"in u&&u.getAllResponseHeaders()),A={data:!c||c==="text"||c==="json"?u.responseText:u.response,status:u.status,statusText:u.statusText,headers:x,config:e,request:u};Vt(function(K){n(K),P()},function(K){r(K),P()},A),u=null}"onloadend"in u?u.onloadend=m:u.onreadystatechange=function(){!u||u.readyState!==4||u.status===0&&!(u.responseURL&&u.responseURL.startsWith("file:"))||setTimeout(m)},u.onabort=function(){u&&(r(new h("Request aborted",h.ECONNABORTED,e,u)),P(),u=null)},u.onerror=function(x){const N=x&&x.message?x.message:"Network Error",A=new h(N,h.ERR_NETWORK,e,u);A.event=x||null,r(A),P(),u=null},u.ontimeout=function(){let x=s.timeout?"timeout of "+s.timeout+"ms exceeded":"timeout exceeded";const N=s.transitional||Ke;s.timeoutErrorMessage&&(x=s.timeoutErrorMessage),r(new h(x,N.clarifyTimeoutError?h.ETIMEDOUT:h.ECONNABORTED,e,u)),P(),u=null},o===void 0&&i.setContentType(null),"setRequestHeader"in u&&a.forEach(Bt(i),function(x,N){u.setRequestHeader(N,x)}),a.isUndefined(s.withCredentials)||(u.withCredentials=!!s.withCredentials),c&&c!=="json"&&(u.responseType=s.responseType),d&&([y,R,S]=Te(d,!0),u.addEventListener("progress",y)),l&&u.upload&&([p,E]=Te(l),u.upload.addEventListener("progress",p),u.upload.addEventListener("loadend",E)),(s.cancelToken||s.signal)&&(f=b=>{u&&(r(!b||b.type?new we(null,e,u):b),u.abort(),P(),u=null)},s.cancelToken&&s.cancelToken.subscribe(f),s.signal&&(s.signal.aborted?f():s.signal.addEventListener("abort",f)));const g=qe(s.url);if(g&&!T.protocols.includes(g)){r(new h("Unsupported protocol "+g+":",h.ERR_BAD_REQUEST,e)),P();return}u.send(o||null)})},Gr=(e,t)=>{if(e=e?e.filter(Boolean):[],!t&&!e.length)return;const n=new AbortController;let r=!1;const s=function(l){if(!r){r=!0,i();const d=l instanceof Error?l:this.reason;n.abort(d instanceof h?d:new we(d instanceof Error?d.message:d))}};let o=t&&setTimeout(()=>{o=null,s(new h(`timeout of ${t}ms exceeded`,h.ETIMEDOUT))},t);const i=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach(l=>{l.unsubscribe?l.unsubscribe(s):l.removeEventListener("abort",s)}),e=null)};e.forEach(l=>{if(!r){if(l.aborted){s.call(l);return}l.addEventListener("abort",s,{once:!0})}});const{signal:c}=n;return c.unsubscribe=()=>a.asap(i),c},Qr=function*(e,t){let n=e.byteLength;if(n{const s=Zr(e,t);let o=0,i,c=l=>{i||(i=!0,r&&r(l))};return new ReadableStream({async pull(l){try{const{done:d,value:f}=await s.next();if(d){c(),l.close();return}let p=f.byteLength;if(n){let y=o+=p;n(y)}l.enqueue(new Uint8Array(f))}catch(d){throw c(d),d}},cancel(l){return c(l),s.return()}},{highWaterMark:2})},bt=e=>e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102,Gt=(e,t,n)=>t+2e<=57?e-48:(e&223)-55,es=e=>e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||e===43||e===47||e===45||e===95,ts=e=>e===9||e===10||e===12||e===13||e===32,ns=e=>{const t=Math.floor(e/4),n=e%4;return t*3+(n===2?1:n===3?2:0)},rs=e=>{const t=e.length;let n=0;return t>0&&e.charCodeAt(t-1)===61&&(n++,t>1&&e.charCodeAt(t-2)===61&&n++),Math.floor((t-n)*3/4)},ss=e=>{const t=e.length;let n=0,r=0,s=!1;for(let o=0;o0){s=!0;continue}n++}}return s||r>2||r>0&&(n+r)%4!==0||n%4===1?rs(e):ns(n)},os=(e,t)=>{if(!e||typeof e!="string"||!e.startsWith("data:"))return 0;const n=e.indexOf(",");if(n<0)return 0;const r=e.slice(5,n),s=e.slice(n+1);if(/;base64/i.test(r))return t(s);let i=0;for(let c=0,l=s.length;c=55296&&d<=56319&&c+1=56320&&f<=57343?(i+=4,c++):i+=3}else i+=3}return i};function is(e){const t=typeof e=="string"?e.indexOf("#"):-1;return os(t===-1?e:e.slice(0,t),ss)}const Ge="1.20.0",gt=64*1024,as={cache:"default",redirect:"follow",referrer:"about:client",referrerPolicy:"",mode:"cors",integrity:"",keepalive:!1,priority:"auto",window:null},{isFunction:Oe}=a,cs=e=>encodeURIComponent(e).replace(/%([0-9A-F]{2})/gi,(t,n)=>String.fromCharCode(parseInt(n,16))),Et=e=>{if(!a.isString(e))return e;try{return decodeURIComponent(e)}catch{return e}},Rt=(e,...t)=>{try{return!!e(...t)}catch{return!1}},ls=e=>{const t=e.indexOf("://");let n=e;return t!==-1&&(n=n.slice(t+3)),n.includes("@")||n.includes(":")},us=e=>{const t=a.global!==void 0&&a.global!==null?a.global:globalThis,{ReadableStream:n,TextEncoder:r}=t;e=a.merge.call({skipUndefined:!0},{Request:t.Request,Response:t.Response},e);const{fetch:s,Request:o,Response:i}=e,c=s?Oe(s):typeof fetch=="function",l=Oe(o),d=Oe(i);if(!c)return!1;const f=c&&Oe(n),p=c&&(typeof r=="function"?(u=>m=>u.encode(m))(new r):async u=>new Uint8Array(await new o(u).arrayBuffer())),y=l&&f&&Rt(()=>{let u=!1;const m=new o(T.origin,{body:new n,method:"POST",get duplex(){return u=!0,"half"}}),g=m.headers.has("Content-Type");return m.body!=null&&m.body.cancel(),u&&!g}),E=d&&f&&Rt(()=>a.isReadableStream(new i("").body)),R={stream:E&&(u=>u.body)};c&&["text","arrayBuffer","blob","formData","stream"].forEach(u=>{!R[u]&&(R[u]=(m,g)=>{let b=m&&m[u];if(b)return b.call(m);throw new h(`Response type '${u}' is not supported`,h.ERR_NOT_SUPPORT,g)})});const S=async u=>{if(u==null)return 0;if(a.isBlob(u))return u.size;if(a.isSpecCompliantForm(u))return(await new o(T.origin,{method:"POST",body:u}).arrayBuffer()).byteLength;if(a.isArrayBufferView(u)||a.isArrayBuffer(u))return u.byteLength;if(a.isURLSearchParams(u)&&(u=u+""),a.isString(u))return(await p(u)).byteLength},P=async(u,m)=>{const g=a.toFiniteNumber(u.getContentLength());return g??S(m)};return async u=>{let{url:m,method:g,data:b,signal:x,cancelToken:N,timeout:A,onDownloadProgress:I,onUploadProgress:K,responseType:z,headers:W,withCredentials:ge="same-origin",fetchOptions:Le,maxContentLength:q,maxBodyLength:Ee,maxRedirects:rn}=Xt(u);const ae=a.isNumber(q)&&q>-1,Ue=a.isNumber(Ee)&&Ee>-1,sn=O=>a.hasOwnProp(u,O)?u[O]:void 0;let Ye=s||fetch;z=z?(z+"").toLowerCase():"text";let v=Gr([x,N&&N.toAbortSignal()],A),C=null;const X=v&&v.unsubscribe&&(()=>{v.unsubscribe()});let ne,ce=null;const et=()=>new h("Request body larger than maxBodyLength limit",h.ERR_BAD_REQUEST,u,C);try{let O;const B=sn("auth");if(B){const w=a.getSafeProp(B,"username")||"",D=a.getSafeProp(B,"password")||"";O={username:w,password:D}}if(ls(m)){const w=new URL(m,T.origin);if(!O&&(w.username||w.password)){const D=Et(w.username),V=Et(w.password);O={username:D,password:V}}(w.username||w.password)&&(w.username="",w.password="",m=w.href)}if(O&&(W.delete("authorization"),W.set("Authorization","Basic "+btoa(cs((O.username||"")+":"+(O.password||""))))),ae&&typeof m=="string"&&m.startsWith("data:")&&is(m)>q)throw new h("maxContentLength size of "+q+" exceeded",h.ERR_BAD_RESPONSE,u,C);if(Ue&&g!=="get"&&g!=="head"){const w=await S(b);if(typeof w=="number"&&isFinite(w)&&(ne=w,w>Ee))throw et()}const Re=Ue&&(a.isReadableStream(b)||a.isStream(b)),tt=(w,D,V)=>yt(w,gt,G=>{if(Ue&&G>Ee)throw ce=et();D&&D(G)},V);if(y&&g!=="get"&&g!=="head"&&(K||Re)){if(ne=ne??await P(W,b),ne!==0||Re){let w=new o(m,{method:"POST",body:b,duplex:"half"}),D;if(a.isFormData(b)&&(D=w.headers.get("content-type"))&&W.setContentType(D),w.body){const[V,G]=K&&dt(ne,Te(pt(K)))||[];b=tt(w.body,V,G)}}}else if(Re&&!l&&f&&g!=="get"&&g!=="head")b=tt(b);else if(Re&&l&&!y&&g!=="get"&&g!=="head")throw new h("Stream request bodies are not supported by the current fetch implementation",h.ERR_NOT_SUPPORT,u,C);a.isString(ge)||(ge=ge?"include":"omit");const on=l&&"credentials"in o.prototype;if(a.isFormData(b)){const w=W.getContentType();w&&/^multipart\/form-data/i.test(w)&&!/boundary=/i.test(w)&&W.delete("content-type")}W.set("User-Agent","axios/"+Ge,!1);const k=Le==null?Le:Object.assign(Object.create(null),Le);k&&(delete k.body,delete k.headers,delete k.method,delete k.signal,delete k.duplex,delete k.credentials);const H=Object.assign(Object.create(null),k,{signal:v,method:g.toUpperCase(),headers:Bt(W.normalize()),body:b,duplex:"half",credentials:on?ge:void 0});l&&(a.forEach(as,(w,D)=>{H[D]===void 0&&(H[D]=w)}),H.signal===void 0&&(H.signal=null),H.body===void 0&&(H.body=null)),rn===0&&(H.redirect="manual",k&&(k.redirect="manual")),C=l&&new o(m,H);let M=await(l?Ye(C,k):Ye(m,H));const nt=U.from(M.headers);if(ae){const w=a.toFiniteNumber(nt.getContentLength());if(w!=null&&w>q)throw new h("maxContentLength size of "+q+" exceeded",h.ERR_BAD_RESPONSE,u,C)}const Fe=E&&(z==="stream"||z==="response");if(E&&M.body&&(I||ae||Fe&&X)){const w={};["status","statusText","headers"].forEach(le=>{w[le]=M[le]});const D=a.toFiniteNumber(nt.getContentLength()),[V,G]=I&&dt(D,Te(pt(I),!0))||[];let rt=0;const an=le=>{if(ae&&(rt=le,rt>q))throw new h("maxContentLength size of "+q+" exceeded",h.ERR_BAD_RESPONSE,u,C);V&&V(le)};M=new i(yt(M.body,gt,an,()=>{G&&G(),X&&X()}),w)}z=z||"text";let $=await R[a.findKey(R,z)||"text"](M,u);if(ae&&!E&&!Fe){let w;if($!=null&&(typeof $.byteLength=="number"?w=$.byteLength:typeof $.size=="number"?w=$.size:typeof $=="string"&&(w=typeof r=="function"?new r().encode($).byteLength:$.length)),typeof w=="number"&&w>q)throw new h("maxContentLength size of "+q+" exceeded",h.ERR_BAD_RESPONSE,u,C)}return!Fe&&X&&X(),await new Promise((w,D)=>{Vt(w,D,{data:$,headers:U.from(M.headers),status:M.status,statusText:M.statusText,config:u,request:C})})}catch(O){if(X&&X(),v&&v.aborted&&v.reason instanceof h){const B=v.reason;throw B.config=u,C&&(B.request=C),O!==B&&Object.defineProperty(B,"cause",{__proto__:null,value:O,writable:!0,enumerable:!1,configurable:!0}),B}if(ce)throw C&&!ce.request&&(ce.request=C),ce;if(O instanceof h)throw C&&!O.request&&(O.request=C),O;if(O&&O.name==="TypeError"&&/Load failed|fetch/i.test(O.message)){const B=new h("Network Error",h.ERR_NETWORK,u,C,O&&O.response);throw Object.defineProperty(B,"cause",{__proto__:null,value:O.cause||O,writable:!0,enumerable:!1,configurable:!0}),B}throw h.from(O,O&&O.code,u,C,O&&O.response)}}},fs=new Map,Qt=e=>{let t=e&&e.env||{};const{fetch:n,Request:r,Response:s}=t,o=[r,s,n];let i=o.length,c=i,l,d,f=fs;for(;c--;)l=o[c],d=f.get(l),d===void 0&&f.set(l,d=c?new Map:us(t)),f=d;return d};Qt();const Qe={http:wr,xhr:Xr,fetch:{get:Qt}};a.forEach(Qe,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{__proto__:null,value:t})}catch{}Object.defineProperty(e,"adapterName",{__proto__:null,value:t})}});const Ot=e=>`- ${e}`,ds=e=>a.isFunction(e)||e===null||e===!1;function ps(e,t){e=a.isArray(e)?e:[e];const{length:n}=e;let r,s;const o={};for(let i=0;i`adapter ${l} `+(d===!1?"is not supported by the environment":"is not available in the build"));let c=n?i.length>1?`since : +`+i.map(Ot).join(` +`):" "+Ot(i[0]):"as no adapter specified";throw new h("There is no suitable adapter to dispatch the request "+c,h.ERR_NOT_SUPPORT)}return s}const Zt={getAdapter:ps,adapters:Qe};function He(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new we(null,e)}function Me(e){const t=a.toSafeFlatObject(e);return He(t),t.headers=U.from(a.getSafeProp(t,"headers")),t.data=Ie.call(t,t.transformRequest),["post","put","patch"].indexOf(t.method)!==-1&&t.headers.setContentType("application/x-www-form-urlencoded",!1),Zt.getAdapter(t.adapter||be.adapter,t)(t).then(function(s){He(t),t.response=s;try{s.data=Ie.call(t,t.transformResponse,s)}finally{delete t.response}return s.headers=U.from(s.headers),s},function(s){if(!vt(s)&&(He(t),s&&s.response)){t.response=s.response;try{s.response.data=Ie.call(t,t.transformResponse,s.response)}finally{delete t.response}s.response.headers=U.from(s.response.headers)}return Promise.reject(s)})}const De={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{De[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const St={};De.transitional=function(t,n,r){function s(o,i){return"[Axios v"+Ge+"] Transitional option '"+o+"'"+i+(r?". "+r:"")}return(o,i,c)=>{if(t===!1)throw new h(s(i," has been removed"+(n?" in "+n:"")),h.ERR_DEPRECATED);return n&&!St[i]&&(St[i]=!0,console.warn(s(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(o,i,c):!0}};De.spelling=function(t){return(n,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function hs(e,t,n){if(typeof e!="object"||e===null)throw new h("options must be an object",h.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let s=r.length;for(;s-- >0;){const o=r[s],i=Object.prototype.hasOwnProperty.call(t,o)?t[o]:void 0;if(i){const c=e[o],l=c===void 0||i(c,o,e);if(l!==!0)throw new h("option "+o+" must be "+l,h.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new h("Unknown option "+o,h.ERR_BAD_OPTION)}}const _e={assertOptions:hs,validators:De},L=_e.validators;let Z=class{constructor(t){this.defaults=t||{},this.interceptors={request:new ut,response:new ut}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error)try{let s={};Error.captureStackTrace?Error.captureStackTrace(s):s=new Error;const o=s.stack;let i="";if(typeof o=="string"){const c=o.indexOf(` `);i=c===-1?"":o.slice(c+1)}if(!r.stack)r.stack=i;else if(i){const c=i.indexOf(` `),l=c===-1?-1:i.indexOf(` `,c+1),d=l===-1?"":i.slice(l+1);String(r.stack).endsWith(d)||(r.stack+=` -`+i)}}catch{}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=te(this.defaults,n);const{transitional:r,paramsSerializer:s,headers:o}=n;r!==void 0&&_e.assertOptions(r,{silentJSONParsing:L.transitional(L.boolean),forcedJSONParsing:L.transitional(L.boolean),clarifyTimeoutError:L.transitional(L.boolean),legacyInterceptorReqResOrdering:L.transitional(L.boolean),advertiseZstdAcceptEncoding:L.transitional(L.boolean),validateStatusUndefinedResolves:L.transitional(L.boolean)},!1),s!=null&&(a.isFunction(s)?n.paramsSerializer={serialize:s}:_e.assertOptions(s,{encode:L.function,serialize:L.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),_e.assertOptions(n,{baseUrl:L.spelling("baseURL"),withXsrfToken:L.spelling("withXSRFToken")},!0),n.method=(a.getSafeProp(n,"method")||a.getSafeProp(this.defaults,"method")||"get").toLowerCase();let i=o&&a.merge(o.common,o[n.method]);o&&a.forEach($t.concat("common"),R=>{delete o[R]}),n.headers=U.concat(i,o);const c=[];let l=!0;this.interceptors.request.forEach(function(S){if(typeof S.runWhen=="function"&&S.runWhen(n)===!1)return;l=l&&S.synchronous;const P=n.transitional||ve;P&&P.legacyInterceptorReqResOrdering?c.unshift(S.fulfilled,S.rejected):c.push(S.fulfilled,S.rejected)});const d=[];this.interceptors.response.forEach(function(S){d.push(S.fulfilled,S.rejected)});let f,p=0,y;if(!l){const R=[He.bind(this),void 0];for(R.unshift(...c),R.push(...d),y=R.length,f=Promise.resolve(n);pHe.call(this,E)))}catch(u){f=Promise.reject(u)}break}}if(!f)try{f=He.call(this,E)}catch(R){f=Promise.reject(R)}for(p=0,y=d.length;p{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](s);r._listeners=null}),this.promise.then=s=>{let o;const i=new Promise(c=>{r.subscribe(c),o=c}).then(s);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,c){r.reason||(r.reason=new be(o,i,c),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new Qt(function(s){t=s}),cancel:t}}};function ds(e){return function(n){return e.apply(null,n)}}function ps(e){return a.isObject(e)&&e.isAxiosError===!0}const Ae={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,ContentTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,UnprocessableContent:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerReturnsAnUnknownError:520,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Ae).forEach(([e,t])=>{Ae[t]===void 0&&(Ae[t]=e)});function Zt(e){const t=new Z(e),n=Ot(Z.prototype.request,t);return a.extend(n,Z.prototype,t,{allOwnKeys:!0}),a.extend(n,t,null,{allOwnKeys:!0}),n.create=function(s){return Zt(te(e,s))},n}const A=Zt(ye);A.Axios=Z;A.CanceledError=be;A.CancelToken=fs;A.isCancel=zt;A.VERSION=Xe;A.toFormData=Ce;A.AxiosError=h;A.Cancel=A.CanceledError;A.all=function(t){return Promise.all(t)};A.spread=ds;A.isAxiosError=ps;A.mergeConfig=te;A.AxiosHeaders=U;A.formToJSON=e=>Mt(a.isHTMLForm(e)?new FormData(e):e);A.getAdapter=Gt.getAdapter;A.HttpStatusCode=Ae;A.default=A;const{Axios:bs,AxiosError:ws,CanceledError:gs,isCancel:Es,CancelToken:Rs,VERSION:Os,all:Ss,Cancel:_s,isAxiosError:As,spread:Ps,toFormData:Ts,AxiosHeaders:xs,HttpStatusCode:Cs,formToJSON:Ns,getAdapter:Ds,mergeConfig:Ls,create:Us}=A;window.axios=A;window.axios.defaults.headers.common["X-Requested-With"]="XMLHttpRequest"; +`+i)}}catch{}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=te(this.defaults,n);const{transitional:r,paramsSerializer:s,headers:o}=n;r!==void 0&&_e.assertOptions(r,{silentJSONParsing:L.transitional(L.boolean),forcedJSONParsing:L.transitional(L.boolean),clarifyTimeoutError:L.transitional(L.boolean),legacyInterceptorReqResOrdering:L.transitional(L.boolean),advertiseZstdAcceptEncoding:L.transitional(L.boolean),validateStatusUndefinedResolves:L.transitional(L.boolean)},!1),s!=null&&(a.isFunction(s)?n.paramsSerializer={serialize:s}:_e.assertOptions(s,{encode:L.function,serialize:L.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),_e.assertOptions(n,{baseUrl:L.spelling("baseURL"),withXsrfToken:L.spelling("withXSRFToken")},!0),n.method=(a.getSafeProp(n,"method")||a.getSafeProp(this.defaults,"method")||"get").toLowerCase();let i=o&&a.merge(o.common,o[n.method]);o&&a.forEach(Wt.concat("common"),R=>{delete o[R]}),n.headers=U.concat(i,o);const c=[];let l=!0;this.interceptors.request.forEach(function(S){if(typeof S.runWhen=="function"&&S.runWhen(n)===!1)return;l=l&&S.synchronous;const P=n.transitional||Ke;P&&P.legacyInterceptorReqResOrdering?c.unshift(S.fulfilled,S.rejected):c.push(S.fulfilled,S.rejected)});const d=[];this.interceptors.response.forEach(function(S){d.push(S.fulfilled,S.rejected)});let f,p=0,y;if(!l){const R=[Me.bind(this),void 0];for(R.unshift(...c),R.push(...d),y=R.length,f=Promise.resolve(n);pMe.call(this,E)))}catch(u){f=Promise.reject(u)}break}}if(!f)try{f=Me.call(this,E)}catch(R){f=Promise.reject(R)}for(p=0,y=d.length;p{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](s);r._listeners=null}),this.promise.then=s=>{let o;const i=new Promise(c=>{r.subscribe(c),o=c}).then(s);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,c){r.reason||(r.reason=new we(o,i,c),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new Yt(function(s){t=s}),cancel:t}}};function ys(e){return function(n){return e.apply(null,n)}}function bs(e){return a.isObject(e)&&e.isAxiosError===!0}const Pe={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,ContentTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,UnprocessableContent:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerReturnsAnUnknownError:520,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Pe).forEach(([e,t])=>{Pe[t]===void 0&&(Pe[t]=e)});function en(e){const t=new Z(e),n=At(Z.prototype.request,t);return a.extend(n,Z.prototype,t,{allOwnKeys:!0}),a.extend(n,t,null,{allOwnKeys:!0}),n.create=function(s){return en(te(e,s))},n}const _=en(be);_.Axios=Z;_.CanceledError=we;_.CancelToken=ms;_.isCancel=vt;_.VERSION=Ge;_.toFormData=Ne;_.AxiosError=h;_.Cancel=_.CanceledError;_.all=function(t){return Promise.all(t)};_.spread=ys;_.isAxiosError=bs;_.mergeConfig=te;_.AxiosHeaders=U;_.formToJSON=e=>zt(a.isHTMLForm(e)?new FormData(e):e);_.getAdapter=Zt.getAdapter;_.HttpStatusCode=Pe;_.default=_;const{Axios:Os,AxiosError:Ss,CanceledError:As,isCancel:_s,CancelToken:Ps,VERSION:xs,all:Ts,Cancel:Cs,isAxiosError:Ns,spread:Ds,toFormData:Ls,AxiosHeaders:Us,HttpStatusCode:Fs,formToJSON:Bs,getAdapter:js,mergeConfig:ks,create:Is}=_;window.axios=_;window.axios.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";const se=document.querySelector("[data-menu-toggle]"),tn=document.querySelector("[data-menu-panel]");se?.addEventListener("click",()=>{const e=tn?.classList.toggle("open")??!1;se.setAttribute("aria-expanded",String(e)),se.textContent=e?"×":"☰"});document.querySelectorAll("[data-menu-panel] a").forEach(e=>{e.addEventListener("click",()=>{tn?.classList.remove("open"),se?.setAttribute("aria-expanded","false"),se&&(se.textContent="☰")})});const ws=document.querySelector("#adminSidebar"),nn=document.querySelector("[data-admin-overlay]"),Ze=e=>{ws?.classList.toggle("open",e),nn?.classList.toggle("open",e),document.body.classList.toggle("admin-menu-open",e)};document.querySelector("[data-admin-open]")?.addEventListener("click",()=>Ze(!0));document.querySelector("[data-admin-close]")?.addEventListener("click",()=>Ze(!1));nn?.addEventListener("click",()=>Ze(!1)); diff --git a/public/build/manifest.json b/public/build/manifest.json index 1d9b51c..1f54ec9 100644 --- a/public/build/manifest.json +++ b/public/build/manifest.json @@ -1,6 +1,6 @@ { "resources/css/app.css": { - "file": "assets/app-4ylyCDk1.css", + "file": "assets/app-B873fQy4.css", "src": "resources/css/app.css", "isEntry": true, "name": "app", @@ -9,7 +9,7 @@ ] }, "resources/js/app.js": { - "file": "assets/app-DMsN-rLE.js", + "file": "assets/app-fQMWg8Nx.js", "name": "app", "src": "resources/js/app.js", "isEntry": true diff --git a/resources/css/app.css b/resources/css/app.css index fcc9947..5766544 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1,4 +1,16 @@ @import "tailwindcss"; -:root{--ink:#070a19;--panel:#0d1228;--purple:#7c3aed;--pink:#ec4899;--cyan:#22d3ee;--gold:#fbbf24}*{box-sizing:border-box}body{margin:0;background:#070a19;color:#f8fafc;font-family:Inter,ui-sans-serif,system-ui,sans-serif}.shell{max-width:1280px;margin:auto;padding:0 24px}.nav{height:76px;display:flex;align-items:center;justify-content:space-between}.brand{font-size:25px;font-weight:900;color:white;text-decoration:none}.brand b{color:#ec4899}.navlinks{display:flex;gap:28px}.navlinks a{color:#dbeafe;text-decoration:none;font-size:14px}.button{display:inline-flex;padding:13px 20px;border-radius:12px;background:linear-gradient(135deg,var(--purple),var(--pink));color:white;text-decoration:none;border:0;font-weight:800}.button.ghost{background:transparent;border:1px solid #334155}.hero{min-height:610px;background:linear-gradient(90deg,rgba(7,10,25,.97) 0%,rgba(7,10,25,.72) 50%,rgba(7,10,25,.25)),url('https://images.unsplash.com/photo-1571266028243-d220c9c3b2d2?auto=format&fit=crop&w=2000&q=85') center/cover;border-bottom:1px solid #202743}.hero-copy{padding:105px 0 35px;max-width:760px}.eyebrow{color:#67e8f9;font-weight:800;letter-spacing:.18em;text-transform:uppercase}.hero h1{font-size:72px;line-height:.95;margin:14px 0 22px;letter-spacing:-.05em}.hero h1 span{background:linear-gradient(90deg,#c084fc,#f472b6,#22d3ee);background-clip:text;color:transparent}.hero p{font-size:19px;color:#cbd5e1;max-width:620px}.searchbox{margin-top:34px;padding:10px;background:white;border-radius:18px;display:grid;grid-template-columns:1.2fr 1fr 1fr auto;gap:8px;box-shadow:0 25px 80px #0008}.searchbox input,.searchbox select{border:0;padding:17px;color:#0f172a;background:#f8fafc;border-radius:10px;outline:none}.section{padding:72px 0}.section-head{display:flex;justify-content:space-between;align-items:end;margin-bottom:25px}.section h2{font-size:34px;margin:0}.muted{color:#94a3b8}.cards{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}.card{background:#10162d;border:1px solid #27304d;border-radius:18px;overflow:hidden;box-shadow:0 14px 35px #0004}.card-img{height:235px;background:center/cover}.card-body{padding:18px}.card h3{margin:0 0 8px;font-size:20px}.stars{color:var(--gold)}.price{font-size:20px;font-weight:900;margin:14px 0}.chips{display:flex;gap:7px;flex-wrap:wrap}.chip{font-size:12px;padding:6px 9px;background:#1e293b;border-radius:99px;color:#cbd5e1}.profile-hero{height:350px;background:center/cover;position:relative}.profile-panel{margin:-90px auto 40px;position:relative;background:white;color:#0f172a;border-radius:22px;padding:30px;display:grid;grid-template-columns:130px 1fr 220px;gap:25px;box-shadow:0 30px 70px #0007}.avatar{width:130px;height:130px;border-radius:16px;object-fit:cover}.admin{display:grid;grid-template-columns:240px 1fr;min-height:100vh;background:#f8fafc;color:#0f172a}.sidebar{background:#0b1022;color:white;padding:28px 18px}.sidebar a{display:block;color:#cbd5e1;text-decoration:none;padding:11px;border-radius:8px}.sidebar a:hover{background:#1e293b}.admin-main{padding:35px}.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}.stat{background:white;padding:24px;border-radius:14px;box-shadow:0 3px 15px #0f172a0d}.stat strong{display:block;font-size:30px;color:#7c3aed}.cookie{position:fixed;bottom:18px;left:18px;right:18px;max-width:650px;background:#fff;color:#0f172a;border-radius:16px;padding:18px;box-shadow:0 20px 60px #0008;z-index:50}@media(max-width:900px){.navlinks{display:none}.hero h1{font-size:50px}.searchbox{grid-template-columns:1fr}.cards{grid-template-columns:1fr 1fr}.profile-panel{grid-template-columns:1fr;margin:-40px 16px 30px}.admin{grid-template-columns:1fr}.sidebar{display:none}.stats{grid-template-columns:1fr 1fr}}@media(max-width:600px){.cards,.stats{grid-template-columns:1fr}.hero h1{font-size:42px}.hero-copy{padding-top:70px}} -.nav-actions{display:flex;gap:9px;align-items:center}.inline-form{display:inline;margin:0}.footer{border-top:1px solid #1e293b}.flash{margin-top:14px;padding:14px 18px;border-radius:12px}.flash.success{background:#064e3b}.cookie p{margin:6px 0 12px}.cookie-secondary{color:#0f172a}.auth-page{min-height:calc(100vh - 160px);padding:70px 24px;background:radial-gradient(circle at 20% 15%,#3b076455,transparent 35%),radial-gradient(circle at 85% 35%,#164e6355,transparent 32%),#070a19}.auth-card{width:min(100%,520px);margin:0 auto;background:#10162d;border:1px solid #27304d;border-radius:24px;padding:34px;box-shadow:0 28px 80px #0008}.auth-card h1{margin:10px 0 8px;font-size:36px}.auth-form{display:grid;gap:16px;margin-top:26px}.auth-form label{display:grid;gap:8px;font-weight:700;color:#e2e8f0}.auth-form input{width:100%;border:1px solid #334155;background:#0b1022;color:#f8fafc;border-radius:12px;padding:14px 15px;font:inherit;outline:none}.auth-form input:focus{border-color:#a855f7;box-shadow:0 0 0 3px #a855f722}.auth-form .check-row{display:flex;grid-template-columns:auto 1fr;align-items:center;font-weight:500}.auth-form .check-row input{width:auto}.button.full{justify-content:center;width:100%;cursor:pointer}.auth-links{display:flex;flex-direction:column;gap:10px;margin-top:22px;color:#94a3b8}.auth-links a{color:#67e8f9;text-decoration:none}.form-errors{margin-top:18px;padding:14px 16px;border:1px solid #7f1d1d;background:#450a0a;color:#fecaca;border-radius:12px;display:grid;gap:5px} -@media(max-width:900px){.nav-actions{gap:6px}.nav-actions .button{padding:10px 12px}.auth-page{padding:40px 16px}}@media(max-width:600px){.nav{height:auto;min-height:70px;gap:12px}.nav-actions{flex-wrap:wrap;justify-content:flex-end}.auth-card{padding:24px}.auth-card h1{font-size:30px}} + +:root{--bg:#070914;--panel:#101526;--panel-2:#151c31;--line:#26304a;--text:#f8fafc;--muted:#9aa8bd;--purple:#7c3aed;--pink:#ec4899;--cyan:#22d3ee;--gold:#fbbf24;--white:#fff;--admin-bg:#f5f7fb;--admin-ink:#172033;--admin-muted:#65738a;--admin-line:#e4e9f1;--shadow:0 18px 55px rgba(0,0,0,.24)} +*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;-webkit-font-smoothing:antialiased}a{color:inherit}.shell{width:min(100% - 40px,1240px);margin-inline:auto}.muted{color:var(--muted)} +.site-header{height:76px;border-bottom:1px solid rgba(255,255,255,.07);background:rgba(7,9,20,.88);backdrop-filter:blur(18px);position:sticky;top:0;z-index:40}.nav{height:100%;display:flex;align-items:center;gap:32px}.brand{display:inline-flex;align-items:center;gap:8px;font-size:24px;font-weight:900;letter-spacing:-.04em;text-decoration:none;white-space:nowrap}.brand b{color:var(--pink)}.nav-panel{margin-left:auto;display:flex;align-items:center;gap:34px}.navlinks{display:flex;align-items:center;gap:26px}.navlinks a,.text-button{font-size:14px;font-weight:700;color:#dce5f4;text-decoration:none;background:none;border:0;padding:8px 0;cursor:pointer;font:inherit}.navlinks a:hover,.text-button:hover{color:#fff}.nav-actions{display:flex;align-items:center;gap:12px}.nav-account-link{display:flex;align-items:center;gap:8px;color:#fff;text-decoration:none;font-weight:800;font-size:14px}.mini-avatar{display:grid;place-items:center;width:31px;height:31px;border-radius:50%;background:linear-gradient(135deg,var(--purple),var(--pink));font-size:12px}.mobile-menu-button{display:none;margin-left:auto;background:transparent;border:1px solid #34405d;color:#fff;border-radius:10px;width:42px;height:42px;font-size:21px}.inline-form{margin:0}.button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:46px;padding:0 19px;border:0;border-radius:12px;background:linear-gradient(135deg,var(--purple),var(--pink));color:#fff;font:inherit;font-size:14px;font-weight:850;text-decoration:none;cursor:pointer;box-shadow:0 9px 24px rgba(124,58,237,.24);transition:transform .18s ease,filter .18s ease}.button:hover{transform:translateY(-1px);filter:brightness(1.06)}.button.ghost{background:transparent;border:1px solid #3a4663;box-shadow:none}.button.small{min-height:40px;padding:0 15px}.button.full{width:100%} +.hero{min-height:640px;position:relative;display:flex;align-items:center;background:url('https://images.unsplash.com/photo-1571266028243-d220c9c3b2d2?auto=format&fit=crop&w=2200&q=84') center 38%/cover no-repeat}.hero-shade{position:absolute;inset:0;background:linear-gradient(90deg,rgba(7,9,20,.98) 0%,rgba(7,9,20,.91) 44%,rgba(7,9,20,.47) 72%,rgba(7,9,20,.18) 100%)}.hero-layout{position:relative;z-index:1}.hero-copy{max-width:790px;padding:82px 0}.eyebrow{color:#67e8f9;font-size:12px;font-weight:900;letter-spacing:.18em;text-transform:uppercase}.hero h1{max-width:760px;margin:14px 0 22px;font-size:clamp(46px,6vw,78px);line-height:.97;letter-spacing:-.06em}.hero h1 span{background:linear-gradient(90deg,#c084fc,#f472b6,#67e8f9);-webkit-background-clip:text;background-clip:text;color:transparent}.hero-copy>p{max-width:650px;color:#c3cede;font-size:18px;line-height:1.65}.searchbox,.filterbar{display:grid;gap:8px;background:#fff;border-radius:18px;padding:9px;box-shadow:0 24px 70px rgba(0,0,0,.42)}.searchbox{grid-template-columns:1.2fr 1fr 1fr auto;margin-top:30px}.searchbox label,.filterbar label{display:grid;gap:3px;padding:8px 12px;border-radius:11px;background:#f6f8fb}.searchbox label span,.filterbar label span{font-size:10px;font-weight:900;color:#64748b;text-transform:uppercase;letter-spacing:.08em}.searchbox input,.searchbox select,.filterbar input,.filterbar select{min-width:0;width:100%;border:0;outline:0;background:transparent;color:#172033;font:inherit;font-size:14px}.hero-proof{display:flex;gap:22px;flex-wrap:wrap;margin-top:18px;color:#cbd5e1;font-size:13px;font-weight:700} +.section{padding:78px 0}.section-alt{background:#0c1120;border-block:1px solid rgba(255,255,255,.06)}.section-head{display:flex;justify-content:space-between;align-items:end;gap:24px;margin-bottom:28px}.section-head h2,.section-intro h2,.split-feature h2,.pricing-box h2{font-size:clamp(30px,4vw,44px);letter-spacing:-.04em;margin:6px 0 8px}.section-head p,.section-intro p,.split-feature .lead,.pricing-box p{color:var(--muted);line-height:1.65}.cards{display:grid;gap:20px}.dj-cards{grid-template-columns:repeat(4,minmax(0,1fr))}.card{background:var(--panel);border:1px solid var(--line);border-radius:18px;overflow:hidden;box-shadow:0 12px 34px rgba(0,0,0,.18)}.dj-card{min-width:0}.card-img{display:block;aspect-ratio:4/3;background-position:center;background-size:cover}.card-body{padding:18px}.card-title-line{display:flex;align-items:center;gap:8px}.card-title-line h3{margin:0;font-size:19px;letter-spacing:-.02em}.verified{display:inline-grid;place-items:center;width:20px;height:20px;border-radius:50%;background:#2563eb;color:#fff;font-size:12px;font-weight:900}.verified.large{width:25px;height:25px}.stars{color:var(--gold);font-size:14px;font-weight:800}.stars span{color:var(--muted);font-weight:600}.card-body>p{min-height:42px;margin:10px 0;color:var(--muted);font-size:14px;line-height:1.5}.card-foot{display:flex;justify-content:space-between;align-items:center;gap:10px;padding-top:14px;border-top:1px solid var(--line)}.card-foot strong{font-size:17px}.card-foot a{color:#a5f3fc;text-decoration:none;font-size:13px;font-weight:800}.steps{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;margin-top:30px}.step-card{padding:26px;border:1px solid var(--line);border-radius:18px;background:linear-gradient(180deg,#11182b,#0e1425)}.step-card>span{font-size:12px;font-weight:900;color:#c084fc}.step-card h3{margin:26px 0 8px;font-size:21px}.step-card p{margin:0;color:var(--muted);line-height:1.55}.split-feature{display:grid;grid-template-columns:.9fr 1.1fr;gap:70px;align-items:center}.feature-list{display:grid;grid-template-columns:1fr 1fr;gap:14px}.feature-list>div{display:grid;gap:6px;padding:22px;background:var(--panel);border:1px solid var(--line);border-radius:16px}.feature-list span{color:var(--muted);line-height:1.5;font-size:14px}.pricing-section{padding-top:0}.pricing-box{display:flex;align-items:center;justify-content:space-between;gap:40px;padding:42px;border-radius:24px;background:linear-gradient(135deg,#1b1141,#10223b);border:1px solid #3a3f68}.pricing-box>div{max-width:760px} +.directory-page{padding:68px 0 82px}.directory-heading{display:flex;justify-content:space-between;align-items:end;gap:20px}.directory-heading h1{font-size:clamp(40px,6vw,62px);margin:6px 0 6px;letter-spacing:-.05em}.directory-heading p{color:var(--muted)}.results-count,.metric-chip{display:inline-flex;align-items:center;padding:8px 12px;border-radius:999px;background:#171e31;border:1px solid var(--line);font-size:12px;font-weight:800;color:#cbd5e1}.filterbar{grid-template-columns:1.1fr 1fr 1fr auto;margin:28px 0 34px}.directory-empty{grid-column:1/-1}.pagination-wrap{margin-top:32px}.pagination-wrap nav{color:#fff} +.profile-hero{height:360px;background:center/cover}.profile-shell{padding-bottom:80px}.profile-panel{position:relative;margin-top:-82px;background:#fff;color:#172033;border-radius:22px;padding:26px;display:grid;grid-template-columns:126px 1fr 210px;gap:24px;align-items:center;box-shadow:0 24px 70px rgba(0,0,0,.38)}.avatar{width:126px;height:126px;border-radius:16px;object-fit:cover}.profile-title{display:flex;align-items:center;gap:10px}.profile-title h1{margin:0;font-size:36px;letter-spacing:-.04em}.profile-summary p{color:#64748b}.chips{display:flex;gap:7px;flex-wrap:wrap}.chip{padding:6px 9px;border-radius:999px;background:#eef2f7;color:#526078;font-size:11px;font-weight:800}.profile-price{display:flex;flex-direction:column;align-items:flex-start;padding-left:22px;border-left:1px solid #e2e8f0}.profile-price>span,.profile-price small{color:#64748b}.profile-price strong{font-size:36px;line-height:1.1}.profile-price .button{margin-top:14px;width:100%}.profile-grid{display:grid;grid-template-columns:minmax(0,1fr) 370px;gap:34px;padding-top:38px}.profile-section{padding:4px 0 24px}.profile-section h2,.enquiry-card h2{font-size:27px;letter-spacing:-.03em}.profile-bio{color:#aab6c8;font-size:16px;line-height:1.8}.review-card{padding:20px 0;border-top:1px solid var(--line)}.review-card h3{margin:8px 0}.review-card p{color:var(--muted);line-height:1.65}.enquiry-card{height:max-content;position:sticky;top:100px;padding:24px;background:var(--panel);border:1px solid var(--line);border-radius:19px}.enquiry-card>p{color:var(--muted)}.enquiry-form,.settings-form{display:grid;gap:14px}.enquiry-form label,.settings-form label{display:grid;gap:7px}.enquiry-form label span,.settings-form label span{font-size:12px;font-weight:800;color:#b8c5d8}.enquiry-form input,.enquiry-form textarea,.settings-form input,.settings-form select{width:100%;border:1px solid #34405c;background:#0b1020;color:#fff;border-radius:10px;padding:12px 13px;font:inherit}.enquiry-form textarea{min-height:120px;resize:vertical} +.flash{margin-top:14px;padding:13px 16px;border-radius:12px}.flash.success{background:#064e3b;border:1px solid #047857}.site-footer{border-top:1px solid #1e293b;background:#080b16;padding:56px 0 24px}.footer-grid{display:grid;grid-template-columns:2fr 1fr 1fr;gap:50px}.footer-grid>div{display:flex;flex-direction:column;gap:10px}.footer-grid p{max-width:470px;color:var(--muted);line-height:1.6}.footer-grid a:not(.brand){color:#9aa8bd;text-decoration:none;font-size:14px}.footer-bottom{margin-top:40px;padding-top:22px;border-top:1px solid #1b2235;color:#68768c;font-size:12px}.cookie{position:fixed;left:20px;right:20px;bottom:20px;z-index:60;max-width:720px;padding:18px;display:flex;align-items:center;justify-content:space-between;gap:20px;background:#fff;color:#172033;border-radius:16px;box-shadow:0 22px 70px rgba(0,0,0,.5)}.cookie p{margin:5px 0 0;color:#64748b;font-size:13px}.cookie-actions{display:flex;gap:8px;flex-shrink:0}.cookie .button.ghost{color:#172033;border-color:#cbd5e1} +.auth-page{min-height:calc(100vh - 76px);padding:64px 20px;background:radial-gradient(circle at 20% 15%,rgba(124,58,237,.25),transparent 35%),radial-gradient(circle at 85% 35%,rgba(34,211,238,.13),transparent 32%),var(--bg)}.auth-card{width:min(100%,510px);margin:auto;background:var(--panel);border:1px solid var(--line);border-radius:22px;padding:32px;box-shadow:var(--shadow)}.auth-card h1{font-size:34px;margin:10px 0 8px}.auth-form{display:grid;gap:16px;margin-top:24px}.auth-form label{display:grid;gap:7px;font-weight:700;color:#dbe4f2}.auth-form input{width:100%;border:1px solid #34405d;background:#0a0f1d;color:#fff;border-radius:11px;padding:13px 14px;font:inherit}.auth-form .check-row{display:flex;align-items:center;gap:9px;font-weight:500}.auth-form .check-row input{width:auto}.auth-links{display:flex;flex-direction:column;gap:8px;margin-top:20px;color:var(--muted)}.auth-links a{color:#67e8f9;text-decoration:none}.form-errors{padding:12px 14px;border:1px solid #7f1d1d;background:#450a0a;color:#fecaca;border-radius:10px} +.account-page{padding:54px 0 78px;min-height:70vh}.account-shell{display:grid;grid-template-columns:240px minmax(0,1fr);gap:28px}.account-sidebar{height:max-content;position:sticky;top:100px;background:var(--panel);border:1px solid var(--line);border-radius:18px;overflow:hidden}.account-person{display:flex;align-items:center;gap:11px;padding:18px;border-bottom:1px solid var(--line)}.account-avatar{width:42px;height:42px;display:grid;place-items:center;border-radius:50%;background:linear-gradient(135deg,var(--purple),var(--pink));font-weight:900}.account-person div:last-child{display:grid;min-width:0}.account-person span{font-size:11px;color:var(--muted);overflow:hidden;text-overflow:ellipsis}.account-nav{padding:9px}.account-nav a{display:block;padding:11px 12px;border-radius:9px;color:#bac6d8;text-decoration:none;font-size:14px;font-weight:700}.account-nav a:hover,.account-nav a.active{background:#1b2440;color:#fff}.account-content{min-width:0}.page-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:22px;margin-bottom:24px}.page-heading h1{font-size:clamp(34px,4vw,48px);margin:6px 0;letter-spacing:-.045em}.page-heading p{margin:0;color:var(--muted)}.account-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-bottom:20px}.account-stat{padding:20px;background:var(--panel);border:1px solid var(--line);border-radius:15px}.account-stat span{display:block;color:var(--muted);font-size:12px;font-weight:800}.account-stat strong{display:block;margin-top:4px;font-size:30px}.dashboard-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px}.panel{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:20px;min-width:0}.panel-head{display:flex;justify-content:space-between;align-items:center;gap:14px}.panel-head h2{margin:0;font-size:19px}.panel-head a,.panel-head span{color:#67e8f9;text-decoration:none;font-size:12px;font-weight:800}.list-row{display:flex;justify-content:space-between;align-items:center;gap:14px;padding:15px 0;border-top:1px solid var(--line);text-decoration:none}.list-row:first-of-type{margin-top:10px}.list-row div{display:grid;gap:3px}.list-row span{color:var(--muted);font-size:12px}.status-pill{display:inline-flex;align-items:center;width:max-content;padding:5px 8px;border-radius:999px;background:#e9eef6;color:#475569;font-size:11px!important;font-weight:800;white-space:nowrap}.empty-state{padding:28px 12px;color:var(--muted);text-align:center;line-height:1.6}.table-panel{padding:0;overflow:hidden}.responsive-table{width:100%;overflow-x:auto}.responsive-table table{width:100%;border-collapse:collapse;min-width:720px}.responsive-table th,.responsive-table td{padding:14px 16px;text-align:left;border-bottom:1px solid rgba(255,255,255,.08);font-size:13px;vertical-align:middle}.responsive-table th{color:#8f9db2;font-size:10px;text-transform:uppercase;letter-spacing:.08em}.responsive-table td small{display:block;color:var(--muted);margin-top:3px}.form-panel{max-width:720px}.settings-form input{background:#0b1020}.check-line{display:flex!important;grid-template-columns:auto 1fr;align-items:center}.check-line input{width:auto!important} +.admin-body{background:var(--admin-bg);color:var(--admin-ink)}.admin-shell{min-height:100vh;display:grid;grid-template-columns:248px minmax(0,1fr)}.admin-sidebar{position:sticky;top:0;height:100vh;display:flex;flex-direction:column;padding:20px 14px;background:#0b1020;color:#fff;overflow-y:auto;z-index:80}.admin-sidebar-head{display:flex;align-items:center;justify-content:space-between;padding:0 8px 18px}.admin-kicker{padding:0 10px 8px;color:#66748c;font-size:10px;font-weight:900;text-transform:uppercase;letter-spacing:.12em}.admin-nav{display:grid;gap:2px}.admin-nav a,.admin-sidebar-foot a,.admin-sidebar-foot button{display:block;width:100%;padding:9px 10px;border:0;border-radius:8px;background:transparent;color:#aab7ca;text-align:left;text-decoration:none;font:inherit;font-size:13px;font-weight:700;cursor:pointer}.admin-nav a:hover,.admin-nav a.active,.admin-sidebar-foot a:hover,.admin-sidebar-foot button:hover{background:#17203a;color:#fff}.admin-sidebar-foot{margin-top:auto;padding-top:16px;border-top:1px solid #202a42}.admin-content{min-width:0}.admin-topbar{height:66px;padding:0 28px;display:flex;align-items:center;justify-content:space-between;gap:15px;background:#fff;border-bottom:1px solid var(--admin-line);position:sticky;top:0;z-index:30}.admin-topbar>div{display:grid}.admin-topbar span{font-size:11px;color:var(--admin-muted)}.admin-page{padding:30px}.admin-heading h1{color:var(--admin-ink)}.admin-heading p{color:var(--admin-muted)}.admin-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:18px}.admin-stat{display:block;padding:20px;background:#fff;border:1px solid var(--admin-line);border-radius:14px;color:inherit;text-decoration:none;box-shadow:0 4px 18px rgba(31,45,75,.04)}.admin-stat span{display:block;color:var(--admin-muted);font-size:11px;font-weight:800;text-transform:uppercase}.admin-stat strong{display:block;margin:6px 0 4px;font-size:29px;letter-spacing:-.04em}.admin-stat small{color:#7c3aed;font-weight:800}.admin-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}.admin-card{padding:20px;background:#fff;border:1px solid var(--admin-line);border-radius:14px;box-shadow:0 4px 18px rgba(31,45,75,.04);min-width:0}.admin-card-wide{grid-column:1/-1}.admin-card .panel-head h2{color:var(--admin-ink)}.admin-list-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:13px 0;border-top:1px solid var(--admin-line);font-size:12px}.admin-list-row:first-of-type{margin-top:10px}.admin-list-row>div{display:grid}.admin-list-row span{color:var(--admin-muted)}.admin-card .responsive-table th,.admin-card .responsive-table td{border-color:var(--admin-line);color:var(--admin-ink)}.admin-card .responsive-table th{color:#7a879c}.table-card{padding:0;overflow:hidden}.admin-button,.toggle-button{display:inline-flex;align-items:center;justify-content:center;min-height:33px;padding:0 11px;border:0;border-radius:8px;background:#172033;color:#fff;font:inherit;font-size:11px;font-weight:800;text-decoration:none;cursor:pointer}.toggle-button{background:#e9eef6;color:#5a677c}.toggle-button.on{background:#dcfce7;color:#166534}.inline-controls{display:flex;align-items:center;gap:7px}.inline-controls select{min-width:110px;padding:7px 9px;border:1px solid #d5dce7;border-radius:8px;background:#fff;color:#172033;font:inherit;font-size:11px}.admin-muted{color:var(--admin-muted);line-height:1.6}.admin-flash{margin:18px 30px 0;padding:12px 15px;border-radius:10px;background:#dcfce7;color:#166534;border:1px solid #bbf7d0;font-size:13px}.settings-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}.settings-list>div{display:grid;grid-template-columns:140px 1fr auto;gap:14px;padding:12px 0;border-top:1px solid var(--admin-line);font-size:12px}.settings-list>div:first-child{margin-top:10px}.settings-list span{color:var(--admin-muted)}.action-card{display:block;color:inherit;text-decoration:none}.action-card:hover{border-color:#b8a5ff}.action-card h2{margin-top:0}.action-card p{color:var(--admin-muted);line-height:1.6}.action-card>span{color:#6d28d9;font-size:12px;font-weight:900}.role-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.role-badge{display:inline-flex;padding:5px 8px;border-radius:999px;background:#ede9fe;color:#6d28d9;font-size:11px;font-weight:900}.role-count{display:block;font-size:30px;margin-top:16px}.feature-empty{text-align:center;padding:38px 15px}.feature-icon{width:54px;height:54px;margin:0 auto 14px;display:grid;place-items:center;border-radius:15px;background:#ede9fe;color:#6d28d9;font-size:24px;font-weight:900}.feature-empty p{max-width:560px;margin:0 auto 20px;color:var(--admin-muted);line-height:1.6}.icon-button{display:none;border:0;background:transparent;font-size:22px;cursor:pointer}.admin-overlay{display:none} +@media(max-width:1100px){.dj-cards{grid-template-columns:repeat(3,minmax(0,1fr))}.steps{grid-template-columns:repeat(2,1fr)}.profile-grid{grid-template-columns:minmax(0,1fr) 330px}.admin-stats{grid-template-columns:repeat(2,1fr)}.role-grid{grid-template-columns:repeat(2,1fr)}} +@media(max-width:900px){.shell{width:min(100% - 28px,1240px)}.site-header{height:68px}.nav{height:68px}.mobile-menu-button{display:block}.nav-panel{display:none;position:absolute;top:68px;left:14px;right:14px;margin:0;padding:14px;flex-direction:column;align-items:stretch;gap:12px;background:#0e1425;border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow)}.nav-panel.open{display:flex}.navlinks,.nav-actions{align-items:stretch;flex-direction:column;gap:2px}.navlinks a,.nav-actions>a,.nav-actions .text-button{padding:11px 10px;text-align:left}.nav-actions{padding-top:8px;border-top:1px solid var(--line)}.nav-actions .button{width:100%}.hero{min-height:auto}.hero-copy{padding:74px 0}.searchbox,.filterbar{grid-template-columns:1fr 1fr}.searchbox .button,.filterbar .button{grid-column:1/-1}.dj-cards{grid-template-columns:repeat(2,minmax(0,1fr))}.split-feature{grid-template-columns:1fr;gap:36px}.profile-panel{grid-template-columns:100px 1fr}.profile-price{grid-column:1/-1;padding:18px 0 0;border-left:0;border-top:1px solid #e2e8f0;display:grid;grid-template-columns:auto auto 1fr auto;gap:8px;align-items:center}.profile-price .button{margin:0}.profile-grid{grid-template-columns:1fr}.enquiry-card{position:static}.account-shell{grid-template-columns:1fr}.account-sidebar{position:static}.account-nav{display:flex;gap:4px;overflow-x:auto}.account-nav a{white-space:nowrap}.dashboard-grid{grid-template-columns:1fr}.admin-shell{display:block}.admin-sidebar{position:fixed;left:0;top:0;width:270px;transform:translateX(-105%);transition:transform .2s ease}.admin-sidebar.open{transform:none}.admin-overlay{position:fixed;inset:0;background:rgba(11,16,32,.55);z-index:70}.admin-overlay.open{display:block}.admin-menu,.admin-close{display:inline-grid;place-items:center}.admin-topbar{padding:0 18px}.admin-page{padding:22px 18px}.admin-flash{margin:14px 18px 0}.admin-grid{grid-template-columns:1fr}.settings-grid{grid-template-columns:1fr}} +@media(max-width:640px){.shell{width:min(100% - 22px,1240px)}.brand{font-size:21px}.hero-shade{background:linear-gradient(180deg,rgba(7,9,20,.78),rgba(7,9,20,.97))}.hero-copy{padding:58px 0}.hero h1{font-size:44px}.hero-copy>p{font-size:16px}.searchbox,.filterbar{grid-template-columns:1fr;padding:8px}.searchbox .button,.filterbar .button{grid-column:auto}.hero-proof{gap:9px 16px;font-size:11px}.section{padding:58px 0}.section-head,.directory-heading,.page-heading,.pricing-box{align-items:flex-start;flex-direction:column}.section-head .button{width:100%}.dj-cards{grid-template-columns:1fr}.card-img{aspect-ratio:16/10}.steps{grid-template-columns:1fr}.feature-list{grid-template-columns:1fr}.pricing-box{padding:28px}.pricing-box .button{width:100%}.footer-grid{grid-template-columns:1fr;gap:28px}.cookie{left:10px;right:10px;bottom:10px;flex-direction:column;align-items:stretch}.cookie-actions{display:grid;grid-template-columns:1fr 1fr}.profile-hero{height:230px}.profile-shell{width:100%}.profile-panel{margin:-34px 11px 0;padding:18px;grid-template-columns:72px 1fr;gap:14px;border-radius:17px}.avatar{width:72px;height:72px}.profile-title h1{font-size:27px}.profile-summary p{font-size:13px}.profile-price{grid-template-columns:auto 1fr}.profile-price strong{font-size:30px}.profile-price small{display:none}.profile-price .button{grid-column:1/-1}.profile-grid{padding:28px 11px 0}.directory-page{padding:44px 0 60px}.directory-heading h1{font-size:42px}.account-page{padding:36px 0 58px}.account-person{display:none}.account-sidebar{border-radius:12px}.account-stats{grid-template-columns:1fr 1fr}.account-stat:last-child{grid-column:1/-1}.panel{padding:16px}.admin-topbar .button{display:none}.admin-page{padding:18px 12px}.admin-stats{grid-template-columns:1fr 1fr;gap:10px}.admin-stat{padding:15px}.admin-stat strong{font-size:24px}.settings-list>div{grid-template-columns:1fr}.role-grid{grid-template-columns:1fr}.inline-controls{align-items:stretch;flex-direction:column}.inline-controls select,.inline-controls .admin-button{width:100%}.auth-card{padding:23px}.auth-page{padding:38px 12px}} diff --git a/resources/js/app.js b/resources/js/app.js index eb10405..6234683 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1 +1,30 @@ -import './bootstrap'; \ No newline at end of file +import './bootstrap'; + +const menuButton = document.querySelector('[data-menu-toggle]'); +const menuPanel = document.querySelector('[data-menu-panel]'); + +menuButton?.addEventListener('click', () => { + const open = menuPanel?.classList.toggle('open') ?? false; + menuButton.setAttribute('aria-expanded', String(open)); + menuButton.textContent = open ? '×' : '☰'; +}); + +document.querySelectorAll('[data-menu-panel] a').forEach((link) => { + link.addEventListener('click', () => { + menuPanel?.classList.remove('open'); + menuButton?.setAttribute('aria-expanded', 'false'); + if (menuButton) menuButton.textContent = '☰'; + }); +}); + +const adminSidebar = document.querySelector('#adminSidebar'); +const adminOverlay = document.querySelector('[data-admin-overlay]'); +const setAdminMenu = (open) => { + adminSidebar?.classList.toggle('open', open); + adminOverlay?.classList.toggle('open', open); + document.body.classList.toggle('admin-menu-open', open); +}; + +document.querySelector('[data-admin-open]')?.addEventListener('click', () => setAdminMenu(true)); +document.querySelector('[data-admin-close]')?.addEventListener('click', () => setAdminMenu(false)); +adminOverlay?.addEventListener('click', () => setAdminMenu(false)); diff --git a/resources/views/account/bookings.blade.php b/resources/views/account/bookings.blade.php new file mode 100644 index 0000000..466f619 --- /dev/null +++ b/resources/views/account/bookings.blade.php @@ -0,0 +1,8 @@ +@extends('layouts.account') +@section('title','My bookings — BeatBook') +@section('account-content') +
Your account

Bookings

Your confirmed and pending events in one place.

+
+@forelse($bookings as $item)@empty@endforelse +
DJEvent dateTotalDepositPaymentStatus
{{ $item->djProfile?->stage_name ?? 'DJ' }}{{ optional($item->event_date)->format('j M Y') }}£{{ number_format((float)$item->total,2) }}£{{ number_format((float)$item->deposit,2) }}{{ $item->paid_at ? 'Paid' : 'Outstanding' }}{{ ucfirst($item->status) }}
No bookings yet.
{{ $bookings->links() }} +@endsection diff --git a/resources/views/account/dashboard.blade.php b/resources/views/account/dashboard.blade.php new file mode 100644 index 0000000..95c85ea --- /dev/null +++ b/resources/views/account/dashboard.blade.php @@ -0,0 +1,16 @@ +@extends('layouts.account') +@section('title','Dashboard — BeatBook') +@section('account-content') +
Your account

Welcome back, {{ Str::before($user->name, ' ') }}

Manage your enquiries, bookings and account details.

Find a DJ
+ + +@endsection diff --git a/resources/views/account/enquiries.blade.php b/resources/views/account/enquiries.blade.php new file mode 100644 index 0000000..0f1ff8d --- /dev/null +++ b/resources/views/account/enquiries.blade.php @@ -0,0 +1,8 @@ +@extends('layouts.account') +@section('title','My enquiries — BeatBook') +@section('account-content') +
Your account

Enquiries

Track every enquiry you have sent to a DJ.

New enquiry
+
+@forelse($enquiries as $item)@empty@endforelse +
DJEventDateVenueBudgetStatus
{{ $item->djProfile?->stage_name ?? 'DJ' }}{{ $item->event_type }}{{ optional($item->event_date)->format('j M Y') }}{{ $item->venue }}{{ $item->budget ? '£'.number_format((float)$item->budget,2) : '—' }}{{ ucfirst($item->status) }}
No enquiries yet.
{{ $enquiries->links() }} +@endsection diff --git a/resources/views/account/profile.blade.php b/resources/views/account/profile.blade.php new file mode 100644 index 0000000..c899230 --- /dev/null +++ b/resources/views/account/profile.blade.php @@ -0,0 +1,13 @@ +@extends('layouts.account') +@section('title','Account details — BeatBook') +@section('account-content') +
Your account

Account details

Keep your contact information up to date.

+
@csrf @method('PATCH') + + + + +@if($errors->any())
@foreach($errors->all() as $error)
{{ $error }}
@endforeach
@endif +
+
+@endsection diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php index 9eb1aef..6296461 100644 --- a/resources/views/admin/dashboard.blade.php +++ b/resources/views/admin/dashboard.blade.php @@ -1,41 +1,12 @@ - - - - - - BeatBook Admin - @vite(['resources/css/app.css']) - - -
- -
-

Dashboard

-

Marketplace overview and moderation queue.

-
- @foreach($stats as $key => $value) -
{{ ucfirst($key) }}{{ number_format($value) }}
- @endforeach -
-
-

Operations

-

Revenue charts, recent bookings, verification requests, support tickets and review moderation plug into this dashboard.

-
-
+@extends('layouts.admin') +@section('title','Dashboard') +@section('page-title','Dashboard') +@section('content') +
Marketplace control centre

Dashboard

Live overview of users, DJs, bookings and moderation.

+
@foreach($stats as $key=>$value){{ ucfirst($key) }}{{ number_format($value) }}Open section →@endforeach
+
+

Newest users

Manage
@forelse($recentUsers as $user)
{{ $user->name }}{{ $user->email }}
{{ $user->created_at?->diffForHumans() }}
@empty
No users yet.
@endforelse
+

Latest enquiries

Clients
@forelse($recentEnquiries as $item)
{{ $item->user?->name }}{{ $item->djProfile?->stage_name }} · {{ $item->event_type }}
{{ ucfirst($item->status) }}
@empty
No enquiries yet.
@endforelse
+

Recent bookings

View all
@forelse($recentBookings as $item)@empty@endforelse
ClientDJDateTotalStatus
{{ $item->client?->name }}{{ $item->djProfile?->stage_name }}{{ optional($item->event_date)->format('j M Y') }}£{{ number_format((float)$item->total,2) }}{{ ucfirst($item->status) }}
No bookings yet.
- - +@endsection diff --git a/resources/views/admin/sections/bookings.blade.php b/resources/views/admin/sections/bookings.blade.php new file mode 100644 index 0000000..0c8f5af --- /dev/null +++ b/resources/views/admin/sections/bookings.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Bookings') @section('page-title','Bookings') @section('content') +
Events

Bookings

All marketplace bookings and event values.

{{ number_format($counts['bookings']) }} bookings
+
@forelse($bookings as $item)@empty@endforelse
ClientDJEvent dateTotalDepositStatus
{{ $item->client?->name }}{{ $item->djProfile?->stage_name }}{{ optional($item->event_date)->format('j M Y') }}£{{ number_format((float)$item->total,2) }}£{{ number_format((float)$item->deposit,2) }}{{ ucfirst($item->status) }}
No bookings yet.
{{ $bookings->links() }} +@endsection diff --git a/resources/views/admin/sections/clients.blade.php b/resources/views/admin/sections/clients.blade.php new file mode 100644 index 0000000..83beeec --- /dev/null +++ b/resources/views/admin/sections/clients.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Clients') @section('page-title','Clients') @section('content') +
Customers

Clients

Review client activity across enquiries and bookings.

{{ number_format($counts['clients']) }} clients
+
@forelse($clients as $client)@empty@endforelse
ClientPhoneEnquiriesBookingsJoined
{{ $client->name }}{{ $client->email }}{{ $client->phone ?: '—' }}{{ $client->enquiries_count }}{{ $client->bookings_count }}{{ $client->created_at?->format('j M Y') }}
No clients yet.
{{ $clients->links() }} +@endsection diff --git a/resources/views/admin/sections/content.blade.php b/resources/views/admin/sections/content.blade.php new file mode 100644 index 0000000..860490b --- /dev/null +++ b/resources/views/admin/sections/content.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Content') @section('page-title','Content') @section('content') +
Website

Content

Public-site content and marketplace presentation.

+ +@endsection diff --git a/resources/views/admin/sections/djs.blade.php b/resources/views/admin/sections/djs.blade.php new file mode 100644 index 0000000..d0146bf --- /dev/null +++ b/resources/views/admin/sections/djs.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','DJs & businesses') @section('page-title','DJs & businesses') @section('content') +
Marketplace supply

DJs & businesses

Control visibility and featured placement.

{{ number_format($counts['djs']) }} profiles
+
@forelse($djs as $dj)@empty@endforelse
DJOwnerCityPricePublishedFeatured
{{ $dj->stage_name }}{{ $dj->business?->name ?: 'Independent' }}{{ $dj->user?->email }}{{ $dj->city }}{{ $dj->price_from ? '£'.number_format((float)$dj->price_from) : '—' }}
@csrf @method('PATCH')
@csrf @method('PATCH')
No DJ profiles yet.
{{ $djs->links() }} +@endsection diff --git a/resources/views/admin/sections/messages.blade.php b/resources/views/admin/sections/messages.blade.php new file mode 100644 index 0000000..b3f3224 --- /dev/null +++ b/resources/views/admin/sections/messages.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Messages') @section('page-title','Messages') @section('content') +
Communication

Messages

Marketplace messaging will appear here once conversations are created.

+
✉

No conversations yet

Enquiry messaging can be added here without exposing private contact details between clients and DJs.

View clients
+@endsection diff --git a/resources/views/admin/sections/notifications.blade.php b/resources/views/admin/sections/notifications.blade.php new file mode 100644 index 0000000..bbe5ef5 --- /dev/null +++ b/resources/views/admin/sections/notifications.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Notifications') @section('page-title','Notifications') @section('content') +
Delivery

Notifications

System alerts and delivery health.

+

Notification channels

EmailLaravel mail channelConfigured
DatabaseIn-app notificationsReady

Recommended events

Booking confirmation, new enquiry, review request, payment receipt and support replies can be delivered from this area.

+@endsection diff --git a/resources/views/admin/sections/payments.blade.php b/resources/views/admin/sections/payments.blade.php new file mode 100644 index 0000000..4badbef --- /dev/null +++ b/resources/views/admin/sections/payments.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Payments') @section('page-title','Payments') @section('content') +
Finance

Payments

Payment state and booking value overview.

+
@forelse($bookings as $item)@empty@endforelse
BookingClientDJTotalDepositPayment
{{ Str::limit($item->id,10,'…') }}{{ $item->client?->name }}{{ $item->djProfile?->stage_name }}£{{ number_format((float)$item->total,2) }}£{{ number_format((float)$item->deposit,2) }}{{ $item->paid_at ? 'Paid' : 'Outstanding' }}
No payment records yet.
{{ $bookings->links() }} +@endsection diff --git a/resources/views/admin/sections/privacy.blade.php b/resources/views/admin/sections/privacy.blade.php new file mode 100644 index 0000000..c0a8d2b --- /dev/null +++ b/resources/views/admin/sections/privacy.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Privacy') @section('page-title','Privacy') @section('content') +
Compliance

Privacy

Quick access to the public legal policies and privacy controls.

+ +@endsection diff --git a/resources/views/admin/sections/reports.blade.php b/resources/views/admin/sections/reports.blade.php new file mode 100644 index 0000000..b9b7e48 --- /dev/null +++ b/resources/views/admin/sections/reports.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Reports') @section('page-title','Reports') @section('content') +
Performance

Reports

Marketplace totals calculated from live BeatBook data.

+
Booking value£{{ number_format((float)$report['booking_value'],2) }}
Deposits£{{ number_format((float)$report['deposits'],2) }}
Published DJs{{ $report['published_djs'] }}
Pending reviews{{ $report['pending_reviews'] }}
+@endsection diff --git a/resources/views/admin/sections/reviews.blade.php b/resources/views/admin/sections/reviews.blade.php new file mode 100644 index 0000000..5dbc132 --- /dev/null +++ b/resources/views/admin/sections/reviews.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Reviews') @section('page-title','Reviews') @section('content') +
Trust & safety

Reviews

Moderate feedback before it appears publicly.

{{ number_format($counts['reviews']) }} reviews
+
@forelse($reviews as $review)@empty@endforelse
ReviewerDJRatingReviewStatusModerate
{{ $review->user?->name }}{{ $review->djProfile?->stage_name }}★ {{ $review->rating }}/5{{ $review->title ?: 'Review' }}{{ Str::limit($review->body,80) }}{{ ucfirst($review->status) }}
@csrf @method('PATCH')
No reviews yet.
{{ $reviews->links() }} +@endsection diff --git a/resources/views/admin/sections/roles.blade.php b/resources/views/admin/sections/roles.blade.php new file mode 100644 index 0000000..b285cc1 --- /dev/null +++ b/resources/views/admin/sections/roles.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Roles & permissions') @section('page-title','Roles & permissions') @section('content') +
Access control

Roles & permissions

Roles currently available to BeatBook accounts.

+
@foreach($roles as $role)
{{ $role->name }}{{ $role->users_count }}

{{ Str::plural('user',$role->users_count) }}

@endforeach
+@endsection diff --git a/resources/views/admin/sections/settings.blade.php b/resources/views/admin/sections/settings.blade.php new file mode 100644 index 0000000..f6c7104 --- /dev/null +++ b/resources/views/admin/sections/settings.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Settings') @section('page-title','Settings') @section('content') +
Application

Settings

Operational controls for the BeatBook installation.

+

Environment

Application{{ config('app.name') }}
Environment{{ app()->environment() }}
URL{{ config('app.url') }}

Maintenance

Clear application cache after configuration or content changes.

@csrf
+@endsection diff --git a/resources/views/admin/sections/support.blade.php b/resources/views/admin/sections/support.blade.php new file mode 100644 index 0000000..b9dc74e --- /dev/null +++ b/resources/views/admin/sections/support.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Support') @section('page-title','Support') @section('content') +
Customer care

Support

Central area for customer and DJ support cases.

+
?

No open support cases

The support queue is ready for a ticket model and inbound support form when you enable that workflow.

+@endsection diff --git a/resources/views/admin/sections/users.blade.php b/resources/views/admin/sections/users.blade.php new file mode 100644 index 0000000..e5fc220 --- /dev/null +++ b/resources/views/admin/sections/users.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.admin') @section('title','Users') @section('page-title','Users') @section('content') +
People

Users

Manage accounts and assign marketplace roles.

{{ number_format($counts['users']) }} users
+
@foreach($users as $user)@endforeach
UserRoleJoinedChange role
{{ $user->name }}{{ $user->email }}{{ $user->getRoleNames()->join(', ') ?: 'No role' }}{{ $user->created_at?->format('j M Y') }}
@csrf @method('PATCH')
{{ $users->links() }} +@endsection diff --git a/resources/views/djs/_card.blade.php b/resources/views/djs/_card.blade.php index 1d3cc7f..3cb34ee 100644 --- a/resources/views/djs/_card.blade.php +++ b/resources/views/djs/_card.blade.php @@ -1 +1 @@ -

{{ $dj->stage_name }} @if($dj->verified_at) ✓ @endif

★★★★★ {{ number_format($dj->average_rating,1) }} ({{ $dj->review_count }})

{{ $dj->city }} · {{ $dj->headline }}

From £{{ number_format($dj->price_from,0) }}
View profile
\ No newline at end of file +

{{ $dj->stage_name }}

@if($dj->verified_at)✓@endif
★★★★★ {{ number_format($dj->average_rating,1) }} ({{ $dj->review_count }})

{{ $dj->city }}@if($dj->headline) · {{ Str::limit($dj->headline,48) }}@endif

{{ $dj->price_from ? 'From £'.number_format($dj->price_from,0) : 'Ask for a quote' }}View profile →
diff --git a/resources/views/djs/index.blade.php b/resources/views/djs/index.blade.php index 447fe69..a9af608 100644 --- a/resources/views/djs/index.blade.php +++ b/resources/views/djs/index.blade.php @@ -1 +1,7 @@ -@extends('layouts.app') @section('title','Find DJs — BeatBook') @section('content')
Discover

Find your DJ

@foreach($djs as $dj) @include('djs._card') @endforeach
{{ $djs->links() }}
@endsection \ No newline at end of file +@extends('layouts.app') +@section('title','Find DJs — BeatBook') +@section('content') +
Discover

Find your DJ

Search trusted DJs by location and budget.

{{ $djs->total() }} {{ Str::plural('DJ',$djs->total()) }}
+
+
@forelse($djs as $dj) @include('djs._card') @empty

No DJs matched your search

Try removing a filter or searching a nearby town.

Clear filters
@endforelse
{{ $djs->withQueryString()->links() }}
+@endsection diff --git a/resources/views/djs/show.blade.php b/resources/views/djs/show.blade.php index b52948a..c777470 100644 --- a/resources/views/djs/show.blade.php +++ b/resources/views/djs/show.blade.php @@ -1 +1,8 @@ -@extends('layouts.app') @section('title',$dj->stage_name.' — BeatBook') @section('content')
{{ $dj->stage_name }}

{{ $dj->stage_name }} @if($dj->verified_at)✓@endif

★★★★★ {{ $dj->average_rating }} · {{ $dj->review_count }} reviews

{{ $dj->headline }}

@foreach($dj->genres as $genre){{ $genre->name }}@endforeach

About {{ $dj->stage_name }}

{{ $dj->bio }}

Reviews

@foreach($dj->reviews as $review)
{{ str_repeat('★',$review->rating) }}

{{ $review->title }}

{{ $review->body }}

@endforeach
@endsection \ No newline at end of file +@extends('layouts.app') +@section('title',$dj->stage_name.' — BeatBook') +@section('content') +
+
{{ $dj->stage_name }}

{{ $dj->stage_name }}

@if($dj->verified_at)✓@endif
★★★★★ {{ $dj->average_rating }} · {{ $dj->review_count }} reviews

{{ $dj->headline }}

@foreach($dj->genres as $genre){{ $genre->name }}@endforeach
+

About {{ $dj->stage_name }}

{{ $dj->bio }}

Reviews

{{ $dj->review_count }} total
@forelse($dj->reviews->where('status','published') as $review)
{{ str_repeat('★',$review->rating) }}

{{ $review->title }}

{{ $review->body }}

@empty
No published reviews yet.
@endforelse
+
+@endsection diff --git a/resources/views/home/index.blade.php b/resources/views/home/index.blade.php index 7182c85..dde6faf 100644 --- a/resources/views/home/index.blade.php +++ b/resources/views/home/index.blade.php @@ -1 +1,8 @@ -@extends('layouts.app') @section('content')
Music creates memories

Find your perfect DJ

Discover trusted DJs for weddings, parties, corporate events and clubs. Compare profiles, reviews and prices, then enquire with confidence.

Top talent

Featured DJs

View all DJs
@forelse($featured as $dj) @include('djs._card',['dj'=>$dj]) @empty @foreach([['DJ Luna','London',350,'photo-1516280440614-37939bbacd81'],['DJ Maverick','Manchester',400,'photo-1571266028243-d220c9c3b2d2'],['DJ Rhythm','Birmingham',300,'photo-1524368535928-5b5e00ddc76b'],['DJ Serenity','Leeds',320,'photo-1506157786151-b8491531f063']] as $d)

{{ $d[0] }}

★★★★★ 4.9

{{ $d[1] }} · Weddings · Parties

From £{{ $d[2] }}
View profile
@endforeach @endforelse
Simple & secure

From search to dance floor

@foreach(['Search'=>'Find DJs by location, date, event and budget.','Compare'=>'Review portfolios, pricing and verified feedback.','Enquire'=>'Send your event details without exposing private contact data.','Book & review'=>'Confirm securely and review after the event.'] as $a=>$b)

{{ $a }}

{{ $b }}

@endforeach
For professionals

Grow your DJ business

Professional profile

Show your sound, experience, service area and pricing in one trusted profile.

Qualified enquiries

Receive structured event details so you can quote quickly and accurately.

Verified reviews

Build reputation from completed BeatBook bookings.

Business tools

Manage bookings, payments and customer communication from your dashboard.

Straightforward pricing

Built for clients and DJs

Browsing and creating a client account is free. DJ subscription and payment options can be configured from the BeatBook billing area as the marketplace launches.

@endsection \ No newline at end of file +@extends('layouts.app') +@section('content') +
Music creates memories

Find the DJ that fits your night.

Discover trusted professionals for weddings, parties, corporate events and clubs. Compare profiles, reviews and prices, then enquire directly.

✓ Verified profiles✓ Genuine reviews✓ Secure enquiries
+
Top talent

Featured DJs

Standout professionals ready for your next event.

Browse all DJs
@forelse($featured as $dj) @include('djs._card',['dj'=>$dj]) @empty @foreach([['DJ Luna','London',350,'photo-1516280440614-37939bbacd81'],['DJ Maverick','Manchester',400,'photo-1571266028243-d220c9c3b2d2'],['DJ Rhythm','Birmingham',300,'photo-1524368535928-5b5e00ddc76b'],['DJ Serenity','Leeds',320,'photo-1506157786151-b8491531f063']] as $d)

{{ $d[0] }}

✓
★★★★★ 4.9

{{ $d[1] }} · Weddings · Parties

From £{{ $d[2] }}View profile →
@endforeach @endforelse
+
Simple & secure

From search to dance floor

BeatBook keeps finding and booking entertainment straightforward.

@foreach([['01','Search','Find DJs by location, event and budget.'],['02','Compare','See experience, pricing and verified feedback.'],['03','Enquire','Share your event details securely.'],['04','Book','Confirm your event and review afterwards.']] as $step)
{{ $step[0] }}

{{ $step[1] }}

{{ $step[2] }}

@endforeach
+
For professionals

Turn more enquiries into bookings.

Build a trusted profile, receive structured leads and manage your work from one place.

Join as a DJ
Professional presenceShow your music, experience, service area and pricing.
Better enquiriesGet the event details you need before you quote.
ReputationBuild trust with reviews from completed bookings.
One dashboardKeep enquiries, bookings and account details together.
+
Straightforward pricing

Free for clients. Built to grow with DJs.

Clients can browse and enquire without a subscription. DJ plans and payment services can be introduced as the marketplace grows.

Create an account
+@endsection diff --git a/resources/views/layouts/account.blade.php b/resources/views/layouts/account.blade.php new file mode 100644 index 0000000..e335530 --- /dev/null +++ b/resources/views/layouts/account.blade.php @@ -0,0 +1,23 @@ +@extends('layouts.app') +@section('content') +
+ +
+@endsection diff --git a/resources/views/layouts/admin.blade.php b/resources/views/layouts/admin.blade.php new file mode 100644 index 0000000..87c06d4 --- /dev/null +++ b/resources/views/layouts/admin.blade.php @@ -0,0 +1,47 @@ + + + + + + + @yield('title', 'Administration') — BeatBook + @vite(['resources/css/app.css', 'resources/js/app.js']) + + +
+ +
+
+
+ +
@yield('page-title', 'Administration'){{ auth()->user()->name }}
+ Public site +
+ @if(session('success'))
{{ session('success') }}
@endif +
@yield('content')
+
+
+ + diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 800327e..bee0ee5 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -2,69 +2,45 @@ - + @yield('title', 'BeatBook — Find Your Perfect DJ') @vite(['resources/css/app.css', 'resources/js/app.js']) -
+ - -@if(session('success')) -
{{ session('success') }}
-@endif -@if(session('status')) -
{{ session('status') }}
-@endif - +@if(session('success'))
{{ session('success') }}
@endif +@if(session('status'))
{{ session('status') }}
@endif @yield('content') - -