diff --git a/ADMIN_THEME_NOTES.md b/ADMIN_THEME_NOTES.md new file mode 100644 index 0000000..8eaa111 --- /dev/null +++ b/ADMIN_THEME_NOTES.md @@ -0,0 +1,11 @@ +# Admin appearance modes + +The BeatBook administration backend now supports three appearance modes: + +- Light +- System (follows the operating system appearance and updates live) +- Dark + +The switcher is in the administration top bar. The preference is stored in browser localStorage under `beatbook-admin-theme` and is applied in the document head before Vite assets load to prevent a light/dark flash during navigation. + +The theme affects the admin shell, sidebar, header, cards, CRUD tables, form controls, search fields, badges, flash/error messages, buttons and date/time inputs. It does not alter the public BeatBook site. diff --git a/CRUD_NOTES.md b/CRUD_NOTES.md new file mode 100644 index 0000000..cd16f3a --- /dev/null +++ b/CRUD_NOTES.md @@ -0,0 +1,32 @@ +# BeatBook Admin CRUD + +This revision replaces the read-only/placeholder administration sections with persistent CRUD management. + +## CRUD resources + +- Users +- Clients +- DJs +- Businesses +- Bookings +- Payments +- Reviews +- Messages +- Notifications +- Support tickets +- Saved reports +- Content pages +- Roles +- Permissions +- Privacy/legal documents +- Application settings + +## New persistence + +Migration `2026_09_12_000004_create_admin_management_tables.php` adds tables for payments, messages, admin notifications, support tickets, saved reports, content pages, legal documents and application settings. + +Run `php artisan migrate` on an existing installation. Do not use `migrate:fresh` unless you intentionally want to erase existing data. + +Published Privacy, Cookie and Terms records are used by the corresponding public legal pages. Published Content records are available at `/pages/{slug}`. + +Notification records are currently managed content; creating a record does not yet dispatch email/push notifications. Saved reports are definitions; a later reporting engine can execute/export them. 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/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..e6e2c8e --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,12 @@ +# Security baseline +- Enforce HTTPS/HSTS in production. +- Keep private/verification uploads outside public storage; authorize every download. +- Validate MIME and image decoding; strip metadata where appropriate. +- Use policies for every tenant-owned resource. +- Enable 2FA for admin/DJ accounts. +- Verify Stripe webhook signatures and make handlers idempotent. +- Rate-limit auth, enquiry, review and messaging endpoints. +- Audit privileged actions; hash IP addresses if retained. +- Never store card details. +- Run queues under Supervisor/systemd and keep dependencies patched. +- Replace placeholder legal policies before launch. diff --git a/public/build/assets/app-DbTvU8vz.css b/public/build/assets/app-ByTEIgcV.css similarity index 58% rename from public/build/assets/app-DbTvU8vz.css rename to public/build/assets/app-ByTEIgcV.css index c7b52a0..853a0a5 100644 --- a/public/build/assets/app-DbTvU8vz.css +++ b/public/build/assets/app-ByTEIgcV.css @@ -1 +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}}.crud-heading{gap:18px}.crud-heading .admin-button{flex:none}.crud-toolbar{justify-content:space-between;align-items:center;gap:16px;margin-bottom:16px;padding:14px 16px;display:flex}.crud-search{flex:1;align-items:center;gap:8px;display:flex}.crud-search input{color:#172033;width:min(420px,100%);height:38px;font:inherit;background:#fff;border:1px solid #d8deea;border-radius:9px;padding:0 12px;font-size:13px}.record-count{color:var(--admin-muted);white-space:nowrap;font-size:12px;font-weight:800}.admin-button.primary{background:#6d28d9}.danger-button{color:#b91c1c;min-height:33px;font:inherit;cursor:pointer;background:#fee2e2;border:0;border-radius:8px;justify-content:center;align-items:center;padding:0 11px;font-size:11px;font-weight:900;display:inline-flex}.row-actions{justify-content:flex-end;align-items:center;gap:7px;display:flex}.row-actions form{margin:0}.actions-col{text-align:right!important}.crud-table td:last-child{text-align:right}.crud-pagination{margin-top:16px}.crud-form-card{max-width:980px}.crud-form-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:17px;display:grid}.crud-field{gap:7px;display:grid}.crud-field>span,.crud-check strong{color:#263248;font-size:12px;font-weight:900}.crud-field input,.crud-field select,.crud-field textarea{color:#172033;width:100%;font:inherit;background:#fff;border:1px solid #d5dce7;border-radius:9px;outline:none;padding:10px 11px;font-size:13px}.crud-field input:focus,.crud-field select:focus,.crud-field textarea:focus{border-color:#8b5cf6;box-shadow:0 0 0 3px #8b5cf61a}.crud-field textarea{resize:vertical;line-height:1.55}.crud-field small{color:var(--admin-muted);font-size:11px}.crud-field .field-error{color:#b91c1c}.full-field{grid-column:1/-1}.crud-check{background:#fafbfe;border:1px solid #e0e5ee;border-radius:9px;align-items:center;gap:9px;padding:11px 12px;display:flex}.crud-check input[type=checkbox]{width:18px;height:18px}.crud-form-actions{border-top:1px solid var(--admin-line);align-items:center;gap:9px;margin-top:20px;padding-top:20px;display:flex}.admin-error{color:#991b1b;background:#fff1f2;border:1px solid #fecaca;border-radius:10px;max-width:980px;margin-bottom:16px;padding:14px 16px;font-size:13px}.admin-error ul{margin:8px 0 0 18px}.admin-flash.error{color:#991b1b;background:#fff1f2;border-color:#fecaca}@media(max-width:760px){.crud-toolbar,.crud-search{flex-direction:column;align-items:stretch}.crud-toolbar .record-count{align-self:flex-start}.crud-search input{width:100%}.crud-form-grid{grid-template-columns:1fr}.full-field{grid-column:auto}.crud-heading .admin-button,.crud-heading .toggle-button{width:100%}.crud-form-actions{flex-direction:column;align-items:stretch}.crud-form-actions>*{width:100%}.crud-table{min-width:760px!important}}.crud-heading-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}@media(max-width:640px){.crud-heading-actions{flex-direction:column;align-items:stretch;width:100%}}.legal-shell{max-width:850px}.legal-shell h1{margin:10px 0 8px;font-size:clamp(38px,6vw,64px)}.legal-meta{color:var(--muted);margin-bottom:30px;font-size:12px}.legal-copy{color:#cbd5e1;white-space:normal;font-size:17px;line-height:1.85}@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} +@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)}.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 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}}.crud-heading{gap:18px}.crud-heading .admin-button{flex:none}.crud-toolbar{justify-content:space-between;align-items:center;gap:16px;margin-bottom:16px;padding:14px 16px;display:flex}.crud-search{flex:1;align-items:center;gap:8px;display:flex}.crud-search input{color:#172033;width:min(420px,100%);height:38px;font:inherit;background:#fff;border:1px solid #d8deea;border-radius:9px;padding:0 12px;font-size:13px}.record-count{color:var(--admin-muted);white-space:nowrap;font-size:12px;font-weight:800}.admin-button.primary{background:#6d28d9}.danger-button{color:#b91c1c;min-height:33px;font:inherit;cursor:pointer;background:#fee2e2;border:0;border-radius:8px;justify-content:center;align-items:center;padding:0 11px;font-size:11px;font-weight:900;display:inline-flex}.row-actions{justify-content:flex-end;align-items:center;gap:7px;display:flex}.row-actions form{margin:0}.actions-col{text-align:right!important}.crud-table td:last-child{text-align:right}.crud-pagination{margin-top:16px}.crud-form-card{max-width:980px}.crud-form-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:17px;display:grid}.crud-field{gap:7px;display:grid}.crud-field>span,.crud-check strong{color:#263248;font-size:12px;font-weight:900}.crud-field input,.crud-field select,.crud-field textarea{color:#172033;width:100%;font:inherit;background:#fff;border:1px solid #d5dce7;border-radius:9px;outline:none;padding:10px 11px;font-size:13px}.crud-field input:focus,.crud-field select:focus,.crud-field textarea:focus{border-color:#8b5cf6;box-shadow:0 0 0 3px #8b5cf61a}.crud-field textarea{resize:vertical;line-height:1.55}.crud-field small{color:var(--admin-muted);font-size:11px}.crud-field .field-error{color:#b91c1c}.full-field{grid-column:1/-1}.crud-check{background:#fafbfe;border:1px solid #e0e5ee;border-radius:9px;align-items:center;gap:9px;padding:11px 12px;display:flex}.crud-check input[type=checkbox]{width:18px;height:18px}.crud-form-actions{border-top:1px solid var(--admin-line);align-items:center;gap:9px;margin-top:20px;padding-top:20px;display:flex}.admin-error{color:#991b1b;background:#fff1f2;border:1px solid #fecaca;border-radius:10px;max-width:980px;margin-bottom:16px;padding:14px 16px;font-size:13px}.admin-error ul{margin:8px 0 0 18px}.admin-flash.error{color:#991b1b;background:#fff1f2;border-color:#fecaca}@media(max-width:760px){.crud-toolbar,.crud-search{flex-direction:column;align-items:stretch}.crud-toolbar .record-count{align-self:flex-start}.crud-search input{width:100%}.crud-form-grid{grid-template-columns:1fr}.full-field{grid-column:auto}.crud-heading .admin-button,.crud-heading .toggle-button{width:100%}.crud-form-actions{flex-direction:column;align-items:stretch}.crud-form-actions>*{width:100%}.crud-table{min-width:760px!important}}.crud-heading-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}@media(max-width:640px){.crud-heading-actions{flex-direction:column;align-items:stretch;width:100%}}.legal-shell{max-width:850px}.legal-shell h1{margin:10px 0 8px;font-size:clamp(38px,6vw,64px)}.legal-meta{color:var(--muted);margin-bottom:30px;font-size:12px}.legal-copy{color:#cbd5e1;white-space:normal;font-size:17px;line-height:1.85}.admin-body{--admin-surface:#fff;--admin-surface-2:#fafbfe;--admin-surface-3:#f0f3f8;--admin-input:#fff;--admin-input-border:#d5dce7;--admin-sidebar:#0b1020;--admin-sidebar-hover:#17203a;--admin-sidebar-line:#202a42;--admin-sidebar-text:#aab7ca;--admin-accent:#6d28d9;--admin-accent-soft:#ede9fe;--admin-accent-text:#6d28d9;--admin-success-bg:#dcfce7;--admin-success-text:#166534;--admin-success-line:#bbf7d0;--admin-danger-bg:#fff1f2;--admin-danger-text:#991b1b;--admin-danger-line:#fecaca;--admin-shadow:0 4px 18px #1f2d4b0a;background:var(--admin-bg);color:var(--admin-ink);color-scheme:light}html[data-admin-theme=dark] .admin-body{--admin-bg:#0b1020;--admin-ink:#e8edf6;--admin-muted:#98a6ba;--admin-line:#263149;--admin-surface:#111827;--admin-surface-2:#151e2f;--admin-surface-3:#1b2639;--admin-input:#0f1726;--admin-input-border:#344159;--admin-sidebar:#070b15;--admin-sidebar-hover:#17213a;--admin-sidebar-line:#202b43;--admin-sidebar-text:#aebbd0;--admin-accent:#8b5cf6;--admin-accent-soft:#2b2145;--admin-accent-text:#c4b5fd;--admin-success-bg:#10291d;--admin-success-text:#86efac;--admin-success-line:#1f5138;--admin-danger-bg:#35151d;--admin-danger-text:#fda4af;--admin-danger-line:#642334;--admin-shadow:0 7px 24px #00000038;color-scheme:dark}.admin-sidebar{background:var(--admin-sidebar)}.admin-nav a,.admin-sidebar-foot a,.admin-sidebar-foot button{color:var(--admin-sidebar-text)}.admin-nav a:hover,.admin-nav a.active,.admin-sidebar-foot a:hover,.admin-sidebar-foot button:hover{background:var(--admin-sidebar-hover)}.admin-sidebar-foot{border-color:var(--admin-sidebar-line)}.admin-topbar,.admin-stat,.admin-card{background:var(--admin-surface);box-shadow:var(--admin-shadow)}.admin-topbar{border-color:var(--admin-line)}.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:var(--admin-muted)}.toggle-button{background:var(--admin-surface-3);color:var(--admin-ink)}.toggle-button.on{background:var(--admin-success-bg);color:var(--admin-success-text)}.inline-controls select,.crud-search input,.crud-field input,.crud-field select,.crud-field textarea{background:var(--admin-input);border-color:var(--admin-input-border);color:var(--admin-ink)}.crud-field>span,.crud-check strong{color:var(--admin-ink)}.crud-check{background:var(--admin-surface-2);border-color:var(--admin-line)}.admin-flash{background:var(--admin-success-bg);color:var(--admin-success-text);border-color:var(--admin-success-line)}.admin-flash.error,.admin-error{background:var(--admin-danger-bg);color:var(--admin-danger-text);border-color:var(--admin-danger-line)}.danger-button{background:var(--admin-danger-bg);color:var(--admin-danger-text)}.role-badge,.feature-icon{background:var(--admin-accent-soft);color:var(--admin-accent-text)}.action-card:hover{border-color:var(--admin-accent)}.action-card>span{color:var(--admin-accent-text)}.admin-theme-switcher{border:1px solid var(--admin-line);background:var(--admin-surface-2);border-radius:10px;align-items:center;padding:3px;display:inline-flex}.admin-theme-switcher button{width:32px;height:32px;color:var(--admin-muted);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:7px;place-items:center;padding:0;font-size:15px;transition:background .15s,color .15s,box-shadow .15s;display:grid}.admin-theme-switcher button:hover{color:var(--admin-ink)}.admin-theme-switcher button.active{background:var(--admin-surface);color:var(--admin-accent-text);box-shadow:0 1px 4px #0000001f}.admin-topbar-actions{align-items:center;gap:10px;display:flex}html[data-admin-theme=dark] .admin-button{color:#f8fafc;background:#29354a}html[data-admin-theme=dark] .admin-button.primary{background:#7c3aed}html[data-admin-theme=dark] .admin-stat small{color:#c4b5fd}html[data-admin-theme=dark] .crud-field input:focus,html[data-admin-theme=dark] .crud-field select:focus,html[data-admin-theme=dark] .crud-field textarea:focus{border-color:#8b5cf6;box-shadow:0 0 0 3px #8b5cf62e}html[data-admin-theme=dark] input[type=date],html[data-admin-theme=dark] input[type=datetime-local],html[data-admin-theme=dark] input[type=time]{color-scheme:dark}@media(max-width:640px){.admin-topbar-actions{margin-left:auto}.admin-theme-switcher button{width:29px;height:29px}.admin-topbar-actions .button{display:none}}.admin-topbar>.admin-topbar-actions{flex-flow:row;justify-content:flex-end;align-items:center;gap:10px;min-width:max-content;margin-left:auto;display:flex}.admin-topbar-actions .admin-theme-switcher,.admin-topbar-actions .button{white-space:nowrap;flex:none}@media(max-width:640px){.admin-topbar{gap:8px;padding:0 12px}.admin-topbar>div:not(.admin-topbar-actions){min-width:0;overflow:hidden}.admin-topbar>div:not(.admin-topbar-actions) strong,.admin-topbar>div:not(.admin-topbar-actions) span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.admin-topbar>.admin-topbar-actions{gap:6px;margin-left:auto;display:flex}.admin-theme-switcher{padding:2px}.admin-theme-switcher button{width:28px;height:28px}.admin-topbar-actions .button{min-height:32px;padding:0 10px;font-size:11px;display:inline-flex}}@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-fQMWg8Nx.js b/public/build/assets/app-Cl06EWgF.js similarity index 56% rename from public/build/assets/app-fQMWg8Nx.js rename to public/build/assets/app-Cl06EWgF.js index 8686178..584ca0b 100644 --- a/public/build/assets/app-fQMWg8Nx.js +++ b/public/build/assets/app-Cl06EWgF.js @@ -1,9 +1,9 @@ -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(` +function Tt(e,t){return function(){return e.apply(t,arguments)}}const{toString:fn}=Object.prototype,{getPrototypeOf:J}=Object,{iterator:me,toStringTag:Pt}=Symbol,pe=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),xt=e=>typeof e=="string"&&(e==="__proto__"||e==="constructor"||e==="prototype"),Ct=(e,t,n)=>e===Object.prototype||!n&&t===null,dn=e=>{if(!Object.isExtensible(e))return!1;const t=Object.getOwnPropertyNames(e);return Object.getOwnPropertySymbols&&t.push(...Object.getOwnPropertySymbols(e)),t.every(n=>{if(xt(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(Ct(n,s,n===e))return!1;if(pe(n,t))return!0;n=s}return!1},pn=(e,t)=>e!=null&&he(e,t)?e[t]:void 0,hn=e=>{if(e==null||typeof e!="object"&&typeof e!="function")return e;const t=J(e);if(t===null&&dn(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(Ct(o,i,o===e))break;const c=Object.getOwnPropertyNames(o);Object.getOwnPropertySymbols&&c.push(...Object.getOwnPropertySymbols(o));for(const l of c)xt(l)||pe(r,l)||(n[l]=e[l],r[l]=!0);o=i}return n},Je=(e=>t=>{const n=fn.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),j=e=>(e=e.toLowerCase(),t=>Je(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 Nt=j("ArrayBuffer");function mn(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Nt(e.buffer),t}const yn=Ce("string"),F=Ce("function"),Lt=Ce("number"),ie=e=>e!==null&&typeof e=="object",bn=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,Pt)&&!he(e,me)},wn=e=>{if(!ie(e)||oe(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},gn=j("Date"),En=j("File"),Rn=e=>!!(e&&typeof e.uri<"u"),On=e=>e&&typeof e.getParts<"u",Sn=j("Blob"),An=j("FileList"),_n=j("Set"),Tn=e=>ie(e)&&F(e.pipe);function Pn(){return typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}}const it=Pn(),at=typeof it.FormData<"u"?it.FormData:void 0,xn=e=>{if(!e)return!1;if(at&&e instanceof at)return!0;const t=J(e);if(!t||t===Object.prototype||!F(e.append))return!1;const n=Je(e);return n==="formdata"||n==="object"&&F(e.toString)&&e.toString()==="[object FormData]"},Cn=j("URLSearchParams"),[Nn,Ln,Dn,Un]=["ReadableStream","Request","Response","Headers"].map(j),Fn=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,Ut=e=>!ee(e)&&e!==Q;function ze(...e){const{caseless:t,skipUndefined:n}=Ut(this)&&this||{},r={},s=(o,i)=>{if(i==="__proto__"||i==="constructor"||i==="prototype")return;const c=t&&typeof i=="string"&&Dt(r,i)||i,l=pe(r,c)?r[c]:void 0;Se(l)&&Se(o)?r[c]=ze(l,o):Se(o)?r[c]=ze({},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:Tt(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),jn=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),kn=(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)},In=(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},qn=(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},Hn=e=>{if(!e)return null;if(Y(e))return e;let t=e.length;if(!Lt(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Mn=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&J(Uint8Array)),$n=(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])}},zn=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},vn=j("HTMLFormElement"),Wn=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,s){return r.toUpperCase()+s}),{propertyIsEnumerable:Vn}=Object.prototype,Jn=j("RegExp"),Ft=(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)},Kn=e=>{Ft(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+"'")})}})},Xn=(e,t)=>{const n={},r=s=>{s.forEach(o=>{n[o]=!0})};return Y(e)?r(e):r(String(e).split(t)),n},Gn=()=>{},Qn=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Zn(e){return!!(e&&F(e.append)&&e[Pt]==="FormData"&&e[me])}const Yn=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(_n(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)},er=j("AsyncFunction"),tr=e=>e&&(ie(e)||F(e))&&F(e.then)&&F(e.catch),Bt=((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)),nr=typeof queueMicrotask<"u"?queueMicrotask.bind(Q):typeof process<"u"&&process.nextTick||Bt,jt=e=>e!=null&&F(e[me]),rr=e=>e!=null&&he(e,me)&&jt(e),a={isArray:Y,isArrayBuffer:Nt,isBuffer:oe,isFormData:xn,isArrayBufferView:mn,isString:yn,isNumber:Lt,isBoolean:bn,isObject:ie,isPlainObject:Se,isEmptyObject:wn,isReadableStream:Nn,isRequest:Ln,isResponse:Dn,isHeaders:Un,isUndefined:ee,isDate:gn,isFile:En,isReactNativeBlob:Rn,isReactNative:On,isBlob:Sn,isRegExp:Jn,isFunction:F,isStream:Tn,isURLSearchParams:Cn,isTypedArray:Mn,isFileList:An,forEach:ye,merge:ze,extend:Bn,trim:Fn,stripBOM:jn,inherits:kn,toFlatObject:In,kindOf:Je,kindOfTest:j,endsWith:qn,toArray:Hn,forEachEntry:$n,matchAll:zn,isHTMLForm:vn,hasOwnProperty:pe,hasOwnProp:pe,hasOwnInPrototypeChain:he,getSafeProp:pn,toSafeFlatObject:hn,reduceDescriptors:Ft,freezeMethods:Kn,toObjectSet:Xn,toCamelCase:Wn,noop:Gn,toFiniteNumber:Qn,findKey:Dt,global:Q,isContextDefined:Ut,isSpecCompliantForm:Zn,toJSONObject:Yn,isAsyncFn:er,isThenable:tr,setImmediate:Bt,asap:nr,isIterable:jt,isSafeIterable:rr},sr=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"]),or=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(sr,n)||(n==="set-cookie"?c?t[n].push(r):t[n]=[r]:t[n]=c?t[n]+", "+r:r)}),t};function ir(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 ar=new RegExp("[\\u0000-\\u0008\\u000a-\\u001f\\u007f]+","g"),cr=new RegExp("[^\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+","g");function Ke(e,t){return a.isArray(e)?e.map(n=>Ke(n,t)):ir(String(e).replace(t,""))}const lr=e=>Ke(e,ar),ur=e=>Ke(e,cr);function kt(e){const t=Object.create(null);return a.forEach(e.toJSON(),(n,r)=>{t[r]=ur(n)}),t}const ct=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):lr(String(e))}function fr(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 dr=/^[!#$%&'*+\-.^_`|~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 pr(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 hr(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(!dr.test(f))return;const p=f.toLowerCase();if(p==="__proto__"||p==="constructor"||p==="prototype")return;const y=Be(l.slice(d+1));t[p]=pr(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 yr(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function br(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())&&!mr(t))i(or(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 fr(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?yr(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 hr(t)}static concat(t,...n){const r=new this(t);return n.forEach(s=>r.set(s)),r}static accessor(t){const r=(this[ct]=this[ct]={accessors:{}}).accessors,s=this.prototype;function o(i){const c=ue(i);r[c]||(br(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 wr(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 gr(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)&&wr(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 lt(e){try{return String(e)}catch{return""}}function Er(e){return e.errors.map(n=>{try{return n&&n.message?lt(n.message):lt(n)}catch{return""}}).filter(Boolean).join("; ")||e.name||"AggregateError"}let h=class It extends Error{static from(t,n,r,s,o,i){let c=t.message;!c&&a.isArray(t.errors)&&t.errors.length&&(c=Er(t));const l=new It(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?gr(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 Rr=null,qt=100;function ve(e){return a.isPlainObject(e)||a.isArray(e)}function Ht(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=Ht(s),!n&&o?"["+s+"]":s}).join(n?".":""):t}function Or(e){return a.isArray(e)&&!e.some(ve)}const Sr=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",qt),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 P=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)&&Or(m)||(a.isFileList(m)||a.endsWith(g,"[]"))&&(P=a.toArray(m)))return g=Ht(g),P.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 ve(m)?!0:(t.append(ke(b,g,i),y(m)),!1)}const T=Object.assign(Sr,{defaultVisitor:S,convertValue:y,isVisitable:ve});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,T))===!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 ut(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"};return encodeURIComponent(e).replace(/[!'()~]|%20/g,function(r){return t[r]})}function Xe(e,t){this._pairs=[],e&&Ne(e,this,t)}const Mt=Xe.prototype;Mt.append=function(t,n){this._pairs.push([t,n])};Mt.toString=function(t){const n=t?r=>t.call(this,r,ut):ut;return this._pairs.map(function(s){return n(s[0])+"="+n(s[1])},"").join("&")};function Ar(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function $t(e,t,n){if(!t)return e;e=e||"";const r=a.isFunction(n)?{serialize:n}:n,s=a.getSafeProp(r,"encode")||Ar,o=a.getSafeProp(r,"serialize");let i;if(o?i=o(t,r):i=a.isURLSearchParams(t)?t.toString():new Xe(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 zt(e){return e?e.length:0}function ft(e){if(e)for(;e.length&&e[e.length-1]===null;)e.pop()}function de(e,t){const n=e.handlers,r=zt(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 dt{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||(ft(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),ft(this.handlers),n.handlersLength=zt(this.handlers))}}}const Ge={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0,advertiseZstdAcceptEncoding:!1,validateStatusUndefinedResolves:!0},_r=typeof URLSearchParams<"u"?URLSearchParams:Xe,Tr=typeof FormData<"u"?FormData:null,Pr=typeof Blob<"u"?Blob:null,xr={isBrowser:!0,classes:{URLSearchParams:_r,FormData:Tr,Blob:Pr},protocols:["http","https","file","blob","url","data"]},Qe=typeof window<"u"&&typeof document<"u",We=typeof navigator=="object"&&navigator||void 0,Cr=Qe&&(!We||["ReactNative","NativeScript","NS"].indexOf(We.product)<0),Nr=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",Lr=Qe&&window.location.href||"http://localhost",Dr=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Qe,hasStandardBrowserEnv:Cr,hasStandardBrowserWebWorkerEnv:Nr,navigator:We,origin:Lr},Symbol.toStringTag,{value:"Module"})),x={...Dr,...xr};function Ur(e,t){return Ne(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 pt=qt;function vt(e){if(e>pt)throw new h("FormData field is too deeply nested ("+e+" levels). Max depth: "+pt,h.ERR_FORM_DATA_DEPTH_EXCEEDED)}function Fr(e){const t=[],n=/[^.[\]]+|\[([^.[\]]*)]/g;let r;for(;(r=n.exec(e))!==null;)vt(t.length),t.push(r[0]==="[]"?"":r[1]||r[0]);return t}function Br(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]=Br(s[i])),!c)}if(a.isFormData(e)&&a.isFunction(e.entries)){const n={};return a.forEachEntry(e,(r,s)=>{t(Fr(r),s,n,0)}),n}return null}const Vt=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 jr(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:Ge,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(Wt(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 Ur(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),jr(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: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(Vt,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 Jt(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 Kt(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 kr=/[\t\n\r]/g;function Xt(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 xe=(e,t,n=3)=>{let r=0;const s=Ir(50,250);return qr(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)},ht=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},mt=(e,t=a.asap)=>(...n)=>t(()=>e(...n)),Hr=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,Mr=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 vr=/^https?:(?!\/\/)/i;function Wr(e){return e&&e.replace(/(^|&)([^=&]*=)?[^&]+/g,(t,n,r="")=>`${n}${r}${Pe}`)}function Vr(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}#${Wr(t.slice(n+1))}`}function yt(e,t){if(typeof e=="string"){const n=Xt(e);if(vr.test(n))throw new h(`Invalid URL ${JSON.stringify(Vr(n))}: missing "//" after protocol`,h.ERR_INVALID_URL,t)}}function Gt(e,t,n,r){yt(t,r);let s=!$r(t);return e&&(s||n===!1)?(yt(e,r),zr(e,t)):t}const bt=e=>e instanceof U?{...e}:e,Jr=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(bt(f),bt(p),y,!0)};return a.forEach(Jr({...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 Kr=["content-type","content-length"];function Xr(e,t,n){if(n!=="content-only"){e.set(t);return}Object.entries(t||{}).forEach(([r,s])=>{Kr.includes(r.toLowerCase())&&e.set(r,s)})}const Gr=e=>encodeURIComponent(e).replace(/%([0-9A-F]{2})/gi,(t,n)=>String.fromCharCode(parseInt(n,16)));function Qt(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=$t(Gt(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?Gr(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)&&Xr(c,y.call(r),n("formDataHeaderPolicy"))}if(x.hasStandardBrowserEnv&&(a.isFunction(s)&&(s=s(t)),s===!0||s==null&&Hr(t.url))){const E=o&&i&&Mr.read(i);E&&c.set(o,E)}return t}const Qr=typeof XMLHttpRequest<"u",Zr=Qr&&function(e){return new Promise(function(n,r){const s=Qt(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 T(){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(Xt(s.url))||qe(x.origin))!=="file"&&!(u.responseURL&&u.responseURL.startsWith("file:"))){r(new h("Request aborted",h.ECONNABORTED,e,u)),T(),u=null;return}try{b?S&&S(b):R&&R()}catch(I){setTimeout(()=>{throw I})}if(!u)return;const P=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:P,config:e,request:u};Kt(function(K){n(K),T()},function(K){r(K),T()},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)),T(),u=null)},u.onerror=function(P){const N=P&&P.message?P.message:"Network Error",A=new h(N,h.ERR_NETWORK,e,u);A.event=P||null,r(A),T(),u=null},u.ontimeout=function(){let P=s.timeout?"timeout of "+s.timeout+"ms exceeded":"timeout exceeded";const N=s.transitional||Ge;s.timeoutErrorMessage&&(P=s.timeoutErrorMessage),r(new h(P,N.clarifyTimeoutError?h.ETIMEDOUT:h.ECONNABORTED,e,u)),T(),u=null},o===void 0&&i.setContentType(null),"setRequestHeader"in u&&a.forEach(kt(i),function(P,N){u.setRequestHeader(N,P)}),a.isUndefined(s.withCredentials)||(u.withCredentials=!!s.withCredentials),c&&c!=="json"&&(u.responseType=s.responseType),d&&([y,R,S]=xe(d,!0),u.addEventListener("progress",y)),l&&u.upload&&([p,E]=xe(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(),T(),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&&!x.protocols.includes(g)){r(new h("Unsupported protocol "+g+":",h.ERR_BAD_REQUEST,e)),T();return}u.send(o||null)})},Yr=(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},es=function*(e,t){let n=e.byteLength;if(n{const s=ts(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})},gt=e=>e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102,Zt=(e,t,n)=>t+2e<=57?e-48:(e&223)-55,rs=e=>e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||e===43||e===47||e===45||e===95,ss=e=>e===9||e===10||e===12||e===13||e===32,os=e=>{const t=Math.floor(e/4),n=e%4;return t*3+(n===2?1:n===3?2:0)},is=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)},as=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?is(e):os(n)},cs=(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 ls(e){const t=typeof e=="string"?e.indexOf("#"):-1;return cs(t===-1?e:e.slice(0,t),as)}const Ze="1.20.0",Rt=64*1024,us={cache:"default",redirect:"follow",referrer:"about:client",referrerPolicy:"",mode:"cors",integrity:"",keepalive:!1,priority:"auto",window:null},{isFunction:Oe}=a,fs=e=>encodeURIComponent(e).replace(/%([0-9A-F]{2})/gi,(t,n)=>String.fromCharCode(parseInt(n,16))),Ot=e=>{if(!a.isString(e))return e;try{return decodeURIComponent(e)}catch{return e}},St=(e,...t)=>{try{return!!e(...t)}catch{return!1}},ds=e=>{const t=e.indexOf("://");let n=e;return t!==-1&&(n=n.slice(t+3)),n.includes("@")||n.includes(":")},ps=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&&St(()=>{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&&St(()=>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},T=async(u,m)=>{const g=a.toFiniteNumber(u.getContentLength());return g??S(m)};return async u=>{let{url:m,method:g,data:b,signal:P,cancelToken:N,timeout:A,onDownloadProgress:I,onUploadProgress:K,responseType:z,headers:v,withCredentials:ge="same-origin",fetchOptions:De,maxContentLength:q,maxBodyLength:Ee,maxRedirects:an}=Qt(u);const ae=a.isNumber(q)&&q>-1,Ue=a.isNumber(Ee)&&Ee>-1,cn=O=>a.hasOwnProp(u,O)?u[O]:void 0;let tt=s||fetch;z=z?(z+"").toLowerCase():"text";let W=Yr([P,N&&N.toAbortSignal()],A),C=null;const X=W&&W.unsubscribe&&(()=>{W.unsubscribe()});let ne,ce=null;const nt=()=>new h("Request body larger than maxBodyLength limit",h.ERR_BAD_REQUEST,u,C);try{let O;const B=cn("auth");if(B){const w=a.getSafeProp(B,"username")||"",L=a.getSafeProp(B,"password")||"";O={username:w,password:L}}if(ds(m)){const w=new URL(m,x.origin);if(!O&&(w.username||w.password)){const L=Ot(w.username),V=Ot(w.password);O={username:L,password:V}}(w.username||w.password)&&(w.username="",w.password="",m=w.href)}if(O&&(v.delete("authorization"),v.set("Authorization","Basic "+btoa(fs((O.username||"")+":"+(O.password||""))))),ae&&typeof m=="string"&&m.startsWith("data:")&&ls(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 nt()}const Re=Ue&&(a.isReadableStream(b)||a.isStream(b)),rt=(w,L,V)=>wt(w,Rt,G=>{if(Ue&&G>Ee)throw ce=nt();L&&L(G)},V);if(y&&g!=="get"&&g!=="head"&&(K||Re)){if(ne=ne??await T(v,b),ne!==0||Re){let w=new o(m,{method:"POST",body:b,duplex:"half"}),L;if(a.isFormData(b)&&(L=w.headers.get("content-type"))&&v.setContentType(L),w.body){const[V,G]=K&&ht(ne,xe(mt(K)))||[];b=rt(w.body,V,G)}}}else if(Re&&!l&&f&&g!=="get"&&g!=="head")b=rt(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 ln=l&&"credentials"in o.prototype;if(a.isFormData(b)){const w=v.getContentType();w&&/^multipart\/form-data/i.test(w)&&!/boundary=/i.test(w)&&v.delete("content-type")}v.set("User-Agent","axios/"+Ze,!1);const k=De==null?De:Object.assign(Object.create(null),De);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:W,method:g.toUpperCase(),headers:kt(v.normalize()),body:b,duplex:"half",credentials:ln?ge:void 0});l&&(a.forEach(us,(w,L)=>{H[L]===void 0&&(H[L]=w)}),H.signal===void 0&&(H.signal=null),H.body===void 0&&(H.body=null)),an===0&&(H.redirect="manual",k&&(k.redirect="manual")),C=l&&new o(m,H);let M=await(l?tt(C,k):tt(m,H));const st=U.from(M.headers);if(ae){const w=a.toFiniteNumber(st.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 L=a.toFiniteNumber(st.getContentLength()),[V,G]=I&&ht(L,xe(mt(I),!0))||[];let ot=0;const un=le=>{if(ae&&(ot=le,ot>q))throw new h("maxContentLength size of "+q+" exceeded",h.ERR_BAD_RESPONSE,u,C);V&&V(le)};M=new i(wt(M.body,Rt,un,()=>{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,L)=>{Kt(w,L,{data:$,headers:U.from(M.headers),status:M.status,statusText:M.statusText,config:u,request:C})})}catch(O){if(X&&X(),W&&W.aborted&&W.reason instanceof h){const B=W.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)}}},hs=new Map,Yt=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=hs;for(;c--;)l=o[c],d=f.get(l),d===void 0&&f.set(l,d=c?new Map:ps(t)),f=d;return d};Yt();const Ye={http:Rr,xhr:Zr,fetch:{get:Yt}};a.forEach(Ye,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{__proto__:null,value:t})}catch{}Object.defineProperty(e,"adapterName",{__proto__:null,value:t})}});const At=e=>`- ${e}`,ms=e=>a.isFunction(e)||e===null||e===!1;function ys(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(At).join(` +`):" "+At(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 en={getAdapter:ys,adapters:Ye};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),en.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(!Jt(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 Le={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Le[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const _t={};Le.transitional=function(t,n,r){function s(o,i){return"[Axios v"+Ze+"] 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&&!_t[i]&&(_t[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}};Le.spelling=function(t){return(n,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function bs(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:bs,validators:Le},D=_e.validators;let Z=class{constructor(t){this.defaults=t||{},this.interceptors={request:new dt,response:new dt}}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(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)); +`+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:D.transitional(D.boolean),forcedJSONParsing:D.transitional(D.boolean),clarifyTimeoutError:D.transitional(D.boolean),legacyInterceptorReqResOrdering:D.transitional(D.boolean),advertiseZstdAcceptEncoding:D.transitional(D.boolean),validateStatusUndefinedResolves:D.transitional(D.boolean)},!1),s!=null&&(a.isFunction(s)?n.paramsSerializer={serialize:s}:_e.assertOptions(s,{encode:D.function,serialize:D.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),_e.assertOptions(n,{baseUrl:D.spelling("baseURL"),withXsrfToken:D.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(Vt.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 T=n.transitional||Ge;T&&T.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 tn(function(s){t=s}),cancel:t}}};function gs(e){return function(n){return e.apply(null,n)}}function Es(e){return a.isObject(e)&&e.isAxiosError===!0}const Te={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(Te).forEach(([e,t])=>{Te[t]===void 0&&(Te[t]=e)});function nn(e){const t=new Z(e),n=Tt(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 nn(te(e,s))},n}const _=nn(be);_.Axios=Z;_.CanceledError=we;_.CancelToken=ws;_.isCancel=Jt;_.VERSION=Ze;_.toFormData=Ne;_.AxiosError=h;_.Cancel=_.CanceledError;_.all=function(t){return Promise.all(t)};_.spread=gs;_.isAxiosError=Es;_.mergeConfig=te;_.AxiosHeaders=U;_.formToJSON=e=>Wt(a.isHTMLForm(e)?new FormData(e):e);_.getAdapter=en.getAdapter;_.HttpStatusCode=Te;_.default=_;const{Axios:_s,AxiosError:Ts,CanceledError:Ps,isCancel:xs,CancelToken:Cs,VERSION:Ns,all:Ls,Cancel:Ds,isAxiosError:Us,spread:Fs,toFormData:Bs,AxiosHeaders:js,HttpStatusCode:ks,formToJSON:Is,getAdapter:qs,mergeConfig:Hs,create:Ms}=_;window.axios=_;window.axios.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";const se=document.querySelector("[data-menu-toggle]"),rn=document.querySelector("[data-menu-panel]");se?.addEventListener("click",()=>{const e=rn?.classList.toggle("open")??!1;se.setAttribute("aria-expanded",String(e)),se.textContent=e?"×":"☰"});document.querySelectorAll("[data-menu-panel] a").forEach(e=>{e.addEventListener("click",()=>{rn?.classList.remove("open"),se?.setAttribute("aria-expanded","false"),se&&(se.textContent="☰")})});const Rs=document.querySelector("#adminSidebar"),sn=document.querySelector("[data-admin-overlay]"),et=e=>{Rs?.classList.toggle("open",e),sn?.classList.toggle("open",e),document.body.classList.toggle("admin-menu-open",e)};document.querySelector("[data-admin-open]")?.addEventListener("click",()=>et(!0));document.querySelector("[data-admin-close]")?.addEventListener("click",()=>et(!1));sn?.addEventListener("click",()=>et(!1));const Ve=document.querySelectorAll("[data-admin-theme]"),on=window.matchMedia("(prefers-color-scheme: dark)"),$e=(e,t=!0)=>{["light","dark","system"].includes(e)||(e="system");const n=e==="system"?on.matches?"dark":"light":e;document.documentElement.dataset.adminTheme=n,document.documentElement.dataset.adminThemePreference=e,t&&localStorage.setItem("beatbook-admin-theme",e),Ve.forEach(r=>{const s=r.dataset.adminTheme===e;r.classList.toggle("active",s),r.setAttribute("aria-pressed",String(s))})};Ve.length&&($e(localStorage.getItem("beatbook-admin-theme")||"system",!1),Ve.forEach(e=>e.addEventListener("click",()=>$e(e.dataset.adminTheme))),on.addEventListener?.("change",()=>{(localStorage.getItem("beatbook-admin-theme")||"system")==="system"&&$e("system",!1)})); diff --git a/public/build/manifest.json b/public/build/manifest.json index 62ab917..4c9e969 100644 --- a/public/build/manifest.json +++ b/public/build/manifest.json @@ -1,6 +1,6 @@ { "resources/css/app.css": { - "file": "assets/app-DbTvU8vz.css", + "file": "assets/app-ByTEIgcV.css", "src": "resources/css/app.css", "isEntry": true, "name": "app", @@ -9,7 +9,7 @@ ] }, "resources/js/app.js": { - "file": "assets/app-fQMWg8Nx.js", + "file": "assets/app-Cl06EWgF.js", "name": "app", "src": "resources/js/app.js", "isEntry": true diff --git a/resources/css/app.css b/resources/css/app.css index 4122485..66507b8 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -21,3 +21,112 @@ .crud-heading-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}@media(max-width:640px){.crud-heading-actions{width:100%;align-items:stretch;flex-direction:column}} .legal-shell{max-width:850px}.legal-shell h1{font-size:clamp(38px,6vw,64px);margin:10px 0 8px}.legal-meta{color:var(--muted);font-size:12px;margin-bottom:30px}.legal-copy{color:#cbd5e1;font-size:17px;line-height:1.85;white-space:normal} + +/* Admin appearance */ +.admin-body{ + --admin-surface:#fff; + --admin-surface-2:#fafbfe; + --admin-surface-3:#f0f3f8; + --admin-input:#fff; + --admin-input-border:#d5dce7; + --admin-sidebar:#0b1020; + --admin-sidebar-hover:#17203a; + --admin-sidebar-line:#202a42; + --admin-sidebar-text:#aab7ca; + --admin-accent:#6d28d9; + --admin-accent-soft:#ede9fe; + --admin-accent-text:#6d28d9; + --admin-success-bg:#dcfce7; + --admin-success-text:#166534; + --admin-success-line:#bbf7d0; + --admin-danger-bg:#fff1f2; + --admin-danger-text:#991b1b; + --admin-danger-line:#fecaca; + --admin-shadow:0 4px 18px rgba(31,45,75,.04); + background:var(--admin-bg); + color:var(--admin-ink); + color-scheme:light; +} +html[data-admin-theme="dark"] .admin-body{ + --admin-bg:#0b1020; + --admin-ink:#e8edf6; + --admin-muted:#98a6ba; + --admin-line:#263149; + --admin-surface:#111827; + --admin-surface-2:#151e2f; + --admin-surface-3:#1b2639; + --admin-input:#0f1726; + --admin-input-border:#344159; + --admin-sidebar:#070b15; + --admin-sidebar-hover:#17213a; + --admin-sidebar-line:#202b43; + --admin-sidebar-text:#aebbd0; + --admin-accent:#8b5cf6; + --admin-accent-soft:#2b2145; + --admin-accent-text:#c4b5fd; + --admin-success-bg:#10291d; + --admin-success-text:#86efac; + --admin-success-line:#1f5138; + --admin-danger-bg:#35151d; + --admin-danger-text:#fda4af; + --admin-danger-line:#642334; + --admin-shadow:0 7px 24px rgba(0,0,0,.22); + color-scheme:dark; +} +.admin-sidebar{background:var(--admin-sidebar)} +.admin-nav a,.admin-sidebar-foot a,.admin-sidebar-foot button{color:var(--admin-sidebar-text)} +.admin-nav a:hover,.admin-nav a.active,.admin-sidebar-foot a:hover,.admin-sidebar-foot button:hover{background:var(--admin-sidebar-hover)} +.admin-sidebar-foot{border-color:var(--admin-sidebar-line)} +.admin-topbar,.admin-stat,.admin-card{background:var(--admin-surface);box-shadow:var(--admin-shadow)} +.admin-topbar{border-color:var(--admin-line)} +.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:var(--admin-muted)} +.toggle-button{background:var(--admin-surface-3);color:var(--admin-ink)} +.toggle-button.on{background:var(--admin-success-bg);color:var(--admin-success-text)} +.inline-controls select,.crud-search input,.crud-field input,.crud-field select,.crud-field textarea{background:var(--admin-input);border-color:var(--admin-input-border);color:var(--admin-ink)} +.crud-field>span,.crud-check strong{color:var(--admin-ink)} +.crud-check{background:var(--admin-surface-2);border-color:var(--admin-line)} +.admin-flash{background:var(--admin-success-bg);color:var(--admin-success-text);border-color:var(--admin-success-line)} +.admin-flash.error,.admin-error{background:var(--admin-danger-bg);color:var(--admin-danger-text);border-color:var(--admin-danger-line)} +.danger-button{background:var(--admin-danger-bg);color:var(--admin-danger-text)} +.role-badge,.feature-icon{background:var(--admin-accent-soft);color:var(--admin-accent-text)} +.action-card:hover{border-color:var(--admin-accent)} +.action-card>span{color:var(--admin-accent-text)} +.admin-theme-switcher{display:inline-flex;align-items:center;padding:3px;border:1px solid var(--admin-line);border-radius:10px;background:var(--admin-surface-2)} +.admin-theme-switcher button{display:grid;place-items:center;width:32px;height:32px;padding:0;border:0;border-radius:7px;background:transparent;color:var(--admin-muted);font:inherit;font-size:15px;cursor:pointer;transition:background .15s ease,color .15s ease,box-shadow .15s ease} +.admin-theme-switcher button:hover{color:var(--admin-ink)} +.admin-theme-switcher button.active{background:var(--admin-surface);color:var(--admin-accent-text);box-shadow:0 1px 4px rgba(0,0,0,.12)} +.admin-topbar-actions{display:flex;align-items:center;gap:10px} +html[data-admin-theme="dark"] .admin-button{background:#29354a;color:#f8fafc} +html[data-admin-theme="dark"] .admin-button.primary{background:#7c3aed} +html[data-admin-theme="dark"] .admin-stat small{color:#c4b5fd} +html[data-admin-theme="dark"] .crud-field input:focus,html[data-admin-theme="dark"] .crud-field select:focus,html[data-admin-theme="dark"] .crud-field textarea:focus{border-color:#8b5cf6;box-shadow:0 0 0 3px rgba(139,92,246,.18)} +html[data-admin-theme="dark"] input[type="date"],html[data-admin-theme="dark"] input[type="datetime-local"],html[data-admin-theme="dark"] input[type="time"]{color-scheme:dark} +@media(max-width:640px){.admin-topbar-actions{margin-left:auto}.admin-theme-switcher button{width:29px;height:29px}.admin-topbar-actions .button{display:none}} + +/* Keep admin appearance controls and Public Site action on one row. */ +.admin-topbar > .admin-topbar-actions{ + display:flex; + flex-direction:row; + flex-wrap:nowrap; + align-items:center; + justify-content:flex-end; + gap:10px; + min-width:max-content; + margin-left:auto; +} +.admin-topbar-actions .admin-theme-switcher, +.admin-topbar-actions .button{ + flex:0 0 auto; + white-space:nowrap; +} +@media(max-width:640px){ + .admin-topbar{padding:0 12px;gap:8px} + .admin-topbar > div:not(.admin-topbar-actions){min-width:0;overflow:hidden} + .admin-topbar > div:not(.admin-topbar-actions) strong, + .admin-topbar > div:not(.admin-topbar-actions) span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap} + .admin-topbar > .admin-topbar-actions{display:flex;gap:6px;margin-left:auto} + .admin-theme-switcher{padding:2px} + .admin-theme-switcher button{width:28px;height:28px} + .admin-topbar-actions .button{display:inline-flex;min-height:32px;padding:0 10px;font-size:11px} +} diff --git a/resources/js/app.js b/resources/js/app.js index 6234683..0d61883 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -28,3 +28,29 @@ const setAdminMenu = (open) => { document.querySelector('[data-admin-open]')?.addEventListener('click', () => setAdminMenu(true)); document.querySelector('[data-admin-close]')?.addEventListener('click', () => setAdminMenu(false)); adminOverlay?.addEventListener('click', () => setAdminMenu(false)); + + +const adminThemeButtons = document.querySelectorAll('[data-admin-theme]'); +const adminThemeMedia = window.matchMedia('(prefers-color-scheme: dark)'); + +const applyAdminTheme = (preference, persist = true) => { + if (!['light', 'dark', 'system'].includes(preference)) preference = 'system'; + const resolved = preference === 'system' ? (adminThemeMedia.matches ? 'dark' : 'light') : preference; + document.documentElement.dataset.adminTheme = resolved; + document.documentElement.dataset.adminThemePreference = preference; + if (persist) localStorage.setItem('beatbook-admin-theme', preference); + + adminThemeButtons.forEach((button) => { + const active = button.dataset.adminTheme === preference; + button.classList.toggle('active', active); + button.setAttribute('aria-pressed', String(active)); + }); +}; + +if (adminThemeButtons.length) { + applyAdminTheme(localStorage.getItem('beatbook-admin-theme') || 'system', false); + adminThemeButtons.forEach((button) => button.addEventListener('click', () => applyAdminTheme(button.dataset.adminTheme))); + adminThemeMedia.addEventListener?.('change', () => { + if ((localStorage.getItem('beatbook-admin-theme') || 'system') === 'system') applyAdminTheme('system', false); + }); +} diff --git a/resources/views/layouts/admin.blade.php b/resources/views/layouts/admin.blade.php index 9dbf08c..478c3cd 100644 --- a/resources/views/layouts/admin.blade.php +++ b/resources/views/layouts/admin.blade.php @@ -5,6 +5,14 @@ @yield('title', 'Administration') — BeatBook + @vite(['resources/css/app.css', 'resources/js/app.js']) @@ -37,7 +45,14 @@
@yield('page-title', 'Administration'){{ auth()->user()->name }}
- Public site +
+
+ + + +
+ Public site +
@if(session('success'))
{{ session('success') }}
@endif @if(session('error'))
{{ session('error') }}
@endif