From 8c21b55bed1509272d7f4dc6a976e5702cd7c5c4 Mon Sep 17 00:00:00 2001
From: alealien666
Date: Wed, 29 Jan 2025 15:36:19 +0700
Subject: [PATCH 01/25] update patch global
---
.../Auth/AuthenticatedSessionController.php | 53 +
.../Auth/ConfirmablePasswordController.php | 42 +
...mailVerificationNotificationController.php | 25 +
.../EmailVerificationPromptController.php | 23 +
.../Auth/NewPasswordController.php | 69 +
.../Controllers/Auth/PasswordController.php | 29 +
.../Auth/PasswordResetLinkController.php | 51 +
.../Auth/RegisteredUserController.php | 52 +
.../Auth/VerifyEmailController.php | 28 +
app/Http/Controllers/ProfileController.php | 63 +
app/Http/Controllers/SantriController.php | 10 +-
app/Http/Kernel.php | 2 +
app/Http/Middleware/HandleInertiaRequests.php | 39 +
app/Http/Requests/Auth/LoginRequest.php | 85 +
app/Http/Requests/ProfileUpdateRequest.php | 23 +
app/Providers/RouteServiceProvider.php | 2 +-
composer.json | 5 +-
composer.lock | 206 +-
jsconfig.json | 10 +
package-lock.json | 2981 +++++++++++++++++
package.json | 9 +
postcss.config.js | 6 +
resources/css/app.css | 3 +
resources/js/Components/ApplicationLogo.jsx | 7 +
resources/js/Components/Checkbox.jsx | 12 +
resources/js/Components/DangerButton.jsx | 15 +
resources/js/Components/Dropdown.jsx | 91 +
resources/js/Components/InputError.jsx | 7 +
resources/js/Components/InputLabel.jsx | 7 +
resources/js/Components/Modal.jsx | 57 +
resources/js/Components/NavLink.jsx | 18 +
resources/js/Components/PrimaryButton.jsx | 15 +
resources/js/Components/ResponsiveNavLink.jsx | 16 +
resources/js/Components/SecondaryButton.jsx | 16 +
resources/js/Components/TextInput.jsx | 23 +
resources/js/Layouts/AuthenticatedLayout.jsx | 125 +
resources/js/Layouts/GuestLayout.jsx | 18 +
resources/js/Pages/Auth/ConfirmPassword.jsx | 59 +
resources/js/Pages/Auth/ForgotPassword.jsx | 50 +
resources/js/Pages/Auth/Login.jsx | 97 +
resources/js/Pages/Auth/Register.jsx | 117 +
resources/js/Pages/Auth/ResetPassword.jsx | 90 +
resources/js/Pages/Auth/VerifyEmail.jsx | 45 +
resources/js/Pages/Dashboard.jsx | 21 +
resources/js/Pages/Profile/Edit.jsx | 36 +
.../Pages/Profile/Partials/DeleteUserForm.jsx | 99 +
.../Profile/Partials/UpdatePasswordForm.jsx | 113 +
.../Partials/UpdateProfileInformationForm.jsx | 103 +
resources/js/Pages/Welcome.jsx | 315 ++
resources/js/app.js | 1 -
resources/js/app.jsx | 21 +
resources/views/app.blade.php | 22 +
resources/views/auth/login.blade.php | 0
resources/views/layouts/app.blade.php | 0
.../list-admin/santri/viewSantri.blade.php | 0
routes/auth.php | 59 +
routes/web.php | 26 +-
tailwind.config.js | 22 +
tests/Feature/Auth/AuthenticationTest.php | 55 +
tests/Feature/Auth/EmailVerificationTest.php | 65 +
.../Feature/Auth/PasswordConfirmationTest.php | 44 +
tests/Feature/Auth/PasswordResetTest.php | 73 +
tests/Feature/Auth/PasswordUpdateTest.php | 51 +
tests/Feature/Auth/RegistrationTest.php | 32 +
tests/Feature/ProfileTest.php | 99 +
vite.config.js | 4 +-
66 files changed, 5950 insertions(+), 12 deletions(-)
create mode 100644 app/Http/Controllers/Auth/AuthenticatedSessionController.php
create mode 100644 app/Http/Controllers/Auth/ConfirmablePasswordController.php
create mode 100644 app/Http/Controllers/Auth/EmailVerificationNotificationController.php
create mode 100644 app/Http/Controllers/Auth/EmailVerificationPromptController.php
create mode 100644 app/Http/Controllers/Auth/NewPasswordController.php
create mode 100644 app/Http/Controllers/Auth/PasswordController.php
create mode 100644 app/Http/Controllers/Auth/PasswordResetLinkController.php
create mode 100644 app/Http/Controllers/Auth/RegisteredUserController.php
create mode 100644 app/Http/Controllers/Auth/VerifyEmailController.php
create mode 100644 app/Http/Controllers/ProfileController.php
create mode 100644 app/Http/Middleware/HandleInertiaRequests.php
create mode 100644 app/Http/Requests/Auth/LoginRequest.php
create mode 100644 app/Http/Requests/ProfileUpdateRequest.php
create mode 100644 jsconfig.json
create mode 100644 package-lock.json
create mode 100644 postcss.config.js
create mode 100644 resources/js/Components/ApplicationLogo.jsx
create mode 100644 resources/js/Components/Checkbox.jsx
create mode 100644 resources/js/Components/DangerButton.jsx
create mode 100644 resources/js/Components/Dropdown.jsx
create mode 100644 resources/js/Components/InputError.jsx
create mode 100644 resources/js/Components/InputLabel.jsx
create mode 100644 resources/js/Components/Modal.jsx
create mode 100644 resources/js/Components/NavLink.jsx
create mode 100644 resources/js/Components/PrimaryButton.jsx
create mode 100644 resources/js/Components/ResponsiveNavLink.jsx
create mode 100644 resources/js/Components/SecondaryButton.jsx
create mode 100644 resources/js/Components/TextInput.jsx
create mode 100644 resources/js/Layouts/AuthenticatedLayout.jsx
create mode 100644 resources/js/Layouts/GuestLayout.jsx
create mode 100644 resources/js/Pages/Auth/ConfirmPassword.jsx
create mode 100644 resources/js/Pages/Auth/ForgotPassword.jsx
create mode 100644 resources/js/Pages/Auth/Login.jsx
create mode 100644 resources/js/Pages/Auth/Register.jsx
create mode 100644 resources/js/Pages/Auth/ResetPassword.jsx
create mode 100644 resources/js/Pages/Auth/VerifyEmail.jsx
create mode 100644 resources/js/Pages/Dashboard.jsx
create mode 100644 resources/js/Pages/Profile/Edit.jsx
create mode 100644 resources/js/Pages/Profile/Partials/DeleteUserForm.jsx
create mode 100644 resources/js/Pages/Profile/Partials/UpdatePasswordForm.jsx
create mode 100644 resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.jsx
create mode 100644 resources/js/Pages/Welcome.jsx
delete mode 100644 resources/js/app.js
create mode 100644 resources/js/app.jsx
create mode 100644 resources/views/app.blade.php
create mode 100644 resources/views/auth/login.blade.php
create mode 100644 resources/views/layouts/app.blade.php
create mode 100644 resources/views/list-admin/santri/viewSantri.blade.php
create mode 100644 routes/auth.php
create mode 100644 tailwind.config.js
create mode 100644 tests/Feature/Auth/AuthenticationTest.php
create mode 100644 tests/Feature/Auth/EmailVerificationTest.php
create mode 100644 tests/Feature/Auth/PasswordConfirmationTest.php
create mode 100644 tests/Feature/Auth/PasswordResetTest.php
create mode 100644 tests/Feature/Auth/PasswordUpdateTest.php
create mode 100644 tests/Feature/Auth/RegistrationTest.php
create mode 100644 tests/Feature/ProfileTest.php
diff --git a/app/Http/Controllers/Auth/AuthenticatedSessionController.php b/app/Http/Controllers/Auth/AuthenticatedSessionController.php
new file mode 100644
index 0000000..2fddead
--- /dev/null
+++ b/app/Http/Controllers/Auth/AuthenticatedSessionController.php
@@ -0,0 +1,53 @@
+ Route::has('password.request'),
+ 'status' => session('status'),
+ ]);
+ }
+
+ /**
+ * Handle an incoming authentication request.
+ */
+ public function store(LoginRequest $request): RedirectResponse
+ {
+ $request->authenticate();
+
+ $request->session()->regenerate();
+
+ return redirect()->intended(RouteServiceProvider::HOME);
+ }
+
+ /**
+ * Destroy an authenticated session.
+ */
+ public function destroy(Request $request): RedirectResponse
+ {
+ Auth::guard('web')->logout();
+
+ $request->session()->invalidate();
+
+ $request->session()->regenerateToken();
+
+ return redirect('/');
+ }
+}
diff --git a/app/Http/Controllers/Auth/ConfirmablePasswordController.php b/app/Http/Controllers/Auth/ConfirmablePasswordController.php
new file mode 100644
index 0000000..1031482
--- /dev/null
+++ b/app/Http/Controllers/Auth/ConfirmablePasswordController.php
@@ -0,0 +1,42 @@
+validate([
+ 'email' => $request->user()->email,
+ 'password' => $request->password,
+ ])) {
+ throw ValidationException::withMessages([
+ 'password' => __('auth.password'),
+ ]);
+ }
+
+ $request->session()->put('auth.password_confirmed_at', time());
+
+ return redirect()->intended(RouteServiceProvider::HOME);
+ }
+}
diff --git a/app/Http/Controllers/Auth/EmailVerificationNotificationController.php b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php
new file mode 100644
index 0000000..96ba772
--- /dev/null
+++ b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php
@@ -0,0 +1,25 @@
+user()->hasVerifiedEmail()) {
+ return redirect()->intended(RouteServiceProvider::HOME);
+ }
+
+ $request->user()->sendEmailVerificationNotification();
+
+ return back()->with('status', 'verification-link-sent');
+ }
+}
diff --git a/app/Http/Controllers/Auth/EmailVerificationPromptController.php b/app/Http/Controllers/Auth/EmailVerificationPromptController.php
new file mode 100644
index 0000000..813b6ed
--- /dev/null
+++ b/app/Http/Controllers/Auth/EmailVerificationPromptController.php
@@ -0,0 +1,23 @@
+user()->hasVerifiedEmail()
+ ? redirect()->intended(RouteServiceProvider::HOME)
+ : Inertia::render('Auth/VerifyEmail', ['status' => session('status')]);
+ }
+}
diff --git a/app/Http/Controllers/Auth/NewPasswordController.php b/app/Http/Controllers/Auth/NewPasswordController.php
new file mode 100644
index 0000000..394cc4a
--- /dev/null
+++ b/app/Http/Controllers/Auth/NewPasswordController.php
@@ -0,0 +1,69 @@
+ $request->email,
+ 'token' => $request->route('token'),
+ ]);
+ }
+
+ /**
+ * Handle an incoming new password request.
+ *
+ * @throws \Illuminate\Validation\ValidationException
+ */
+ public function store(Request $request): RedirectResponse
+ {
+ $request->validate([
+ 'token' => 'required',
+ 'email' => 'required|email',
+ 'password' => ['required', 'confirmed', Rules\Password::defaults()],
+ ]);
+
+ // Here we will attempt to reset the user's password. If it is successful we
+ // will update the password on an actual user model and persist it to the
+ // database. Otherwise we will parse the error and return the response.
+ $status = Password::reset(
+ $request->only('email', 'password', 'password_confirmation', 'token'),
+ function ($user) use ($request) {
+ $user->forceFill([
+ 'password' => Hash::make($request->password),
+ 'remember_token' => Str::random(60),
+ ])->save();
+
+ event(new PasswordReset($user));
+ }
+ );
+
+ // If the password was successfully reset, we will redirect the user back to
+ // the application's home authenticated view. If there is an error we can
+ // redirect them back to where they came from with their error message.
+ if ($status == Password::PASSWORD_RESET) {
+ return redirect()->route('login')->with('status', __($status));
+ }
+
+ throw ValidationException::withMessages([
+ 'email' => [trans($status)],
+ ]);
+ }
+}
diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php
new file mode 100644
index 0000000..57a82b5
--- /dev/null
+++ b/app/Http/Controllers/Auth/PasswordController.php
@@ -0,0 +1,29 @@
+validate([
+ 'current_password' => ['required', 'current_password'],
+ 'password' => ['required', Password::defaults(), 'confirmed'],
+ ]);
+
+ $request->user()->update([
+ 'password' => Hash::make($validated['password']),
+ ]);
+
+ return back();
+ }
+}
diff --git a/app/Http/Controllers/Auth/PasswordResetLinkController.php b/app/Http/Controllers/Auth/PasswordResetLinkController.php
new file mode 100644
index 0000000..b22c544
--- /dev/null
+++ b/app/Http/Controllers/Auth/PasswordResetLinkController.php
@@ -0,0 +1,51 @@
+ session('status'),
+ ]);
+ }
+
+ /**
+ * Handle an incoming password reset link request.
+ *
+ * @throws \Illuminate\Validation\ValidationException
+ */
+ public function store(Request $request): RedirectResponse
+ {
+ $request->validate([
+ 'email' => 'required|email',
+ ]);
+
+ // We will send the password reset link to this user. Once we have attempted
+ // to send the link, we will examine the response then see the message we
+ // need to show to the user. Finally, we'll send out a proper response.
+ $status = Password::sendResetLink(
+ $request->only('email')
+ );
+
+ if ($status == Password::RESET_LINK_SENT) {
+ return back()->with('status', __($status));
+ }
+
+ throw ValidationException::withMessages([
+ 'email' => [trans($status)],
+ ]);
+ }
+}
diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php
new file mode 100644
index 0000000..92094cb
--- /dev/null
+++ b/app/Http/Controllers/Auth/RegisteredUserController.php
@@ -0,0 +1,52 @@
+validate([
+ 'name' => 'required|string|max:255',
+ 'email' => 'required|string|lowercase|email|max:255|unique:'.User::class,
+ 'password' => ['required', 'confirmed', Rules\Password::defaults()],
+ ]);
+
+ $user = User::create([
+ 'name' => $request->name,
+ 'email' => $request->email,
+ 'password' => Hash::make($request->password),
+ ]);
+
+ event(new Registered($user));
+
+ Auth::login($user);
+
+ return redirect(RouteServiceProvider::HOME);
+ }
+}
diff --git a/app/Http/Controllers/Auth/VerifyEmailController.php b/app/Http/Controllers/Auth/VerifyEmailController.php
new file mode 100644
index 0000000..ea87940
--- /dev/null
+++ b/app/Http/Controllers/Auth/VerifyEmailController.php
@@ -0,0 +1,28 @@
+user()->hasVerifiedEmail()) {
+ return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
+ }
+
+ if ($request->user()->markEmailAsVerified()) {
+ event(new Verified($request->user()));
+ }
+
+ return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
+ }
+}
diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php
new file mode 100644
index 0000000..873b4f7
--- /dev/null
+++ b/app/Http/Controllers/ProfileController.php
@@ -0,0 +1,63 @@
+ $request->user() instanceof MustVerifyEmail,
+ 'status' => session('status'),
+ ]);
+ }
+
+ /**
+ * Update the user's profile information.
+ */
+ public function update(ProfileUpdateRequest $request): RedirectResponse
+ {
+ $request->user()->fill($request->validated());
+
+ if ($request->user()->isDirty('email')) {
+ $request->user()->email_verified_at = null;
+ }
+
+ $request->user()->save();
+
+ return Redirect::route('profile.edit');
+ }
+
+ /**
+ * Delete the user's account.
+ */
+ public function destroy(Request $request): RedirectResponse
+ {
+ $request->validate([
+ 'password' => ['required', 'current_password'],
+ ]);
+
+ $user = $request->user();
+
+ Auth::logout();
+
+ $user->delete();
+
+ $request->session()->invalidate();
+ $request->session()->regenerateToken();
+
+ return Redirect::to('/');
+ }
+}
diff --git a/app/Http/Controllers/SantriController.php b/app/Http/Controllers/SantriController.php
index cbcd983..2253fa3 100644
--- a/app/Http/Controllers/SantriController.php
+++ b/app/Http/Controllers/SantriController.php
@@ -10,11 +10,13 @@ class SantriController extends Controller
/**
* Display a listing of the resource.
*/
- public function index() {}
+ public function index()
+ {
+ $santri = Santri::all();
+
+ return view('list-admin.santri.viewSantri', compact('santri'));
+ }
- /**
- * Show the form for creating a new resource.
- */
public function create()
{
//
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index c34cdcf..7558faa 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -36,6 +36,8 @@ class Kernel extends HttpKernel
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
+ \App\Http\Middleware\HandleInertiaRequests::class,
+ \Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets::class,
],
'api' => [
diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php
new file mode 100644
index 0000000..c736065
--- /dev/null
+++ b/app/Http/Middleware/HandleInertiaRequests.php
@@ -0,0 +1,39 @@
+
+ */
+ public function share(Request $request): array
+ {
+ return [
+ ...parent::share($request),
+ 'auth' => [
+ 'user' => $request->user(),
+ ],
+ ];
+ }
+}
diff --git a/app/Http/Requests/Auth/LoginRequest.php b/app/Http/Requests/Auth/LoginRequest.php
new file mode 100644
index 0000000..2b92f65
--- /dev/null
+++ b/app/Http/Requests/Auth/LoginRequest.php
@@ -0,0 +1,85 @@
+
+ */
+ public function rules(): array
+ {
+ return [
+ 'email' => ['required', 'string', 'email'],
+ 'password' => ['required', 'string'],
+ ];
+ }
+
+ /**
+ * Attempt to authenticate the request's credentials.
+ *
+ * @throws \Illuminate\Validation\ValidationException
+ */
+ public function authenticate(): void
+ {
+ $this->ensureIsNotRateLimited();
+
+ if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
+ RateLimiter::hit($this->throttleKey());
+
+ throw ValidationException::withMessages([
+ 'email' => trans('auth.failed'),
+ ]);
+ }
+
+ RateLimiter::clear($this->throttleKey());
+ }
+
+ /**
+ * Ensure the login request is not rate limited.
+ *
+ * @throws \Illuminate\Validation\ValidationException
+ */
+ public function ensureIsNotRateLimited(): void
+ {
+ if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
+ return;
+ }
+
+ event(new Lockout($this));
+
+ $seconds = RateLimiter::availableIn($this->throttleKey());
+
+ throw ValidationException::withMessages([
+ 'email' => trans('auth.throttle', [
+ 'seconds' => $seconds,
+ 'minutes' => ceil($seconds / 60),
+ ]),
+ ]);
+ }
+
+ /**
+ * Get the rate limiting throttle key for the request.
+ */
+ public function throttleKey(): string
+ {
+ return Str::transliterate(Str::lower($this->string('email')).'|'.$this->ip());
+ }
+}
diff --git a/app/Http/Requests/ProfileUpdateRequest.php b/app/Http/Requests/ProfileUpdateRequest.php
new file mode 100644
index 0000000..93b0022
--- /dev/null
+++ b/app/Http/Requests/ProfileUpdateRequest.php
@@ -0,0 +1,23 @@
+
+ */
+ public function rules(): array
+ {
+ return [
+ 'name' => ['required', 'string', 'max:255'],
+ 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', Rule::unique(User::class)->ignore($this->user()->id)],
+ ];
+ }
+}
diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php
index bc49109..f859850 100644
--- a/app/Providers/RouteServiceProvider.php
+++ b/app/Providers/RouteServiceProvider.php
@@ -17,7 +17,7 @@ class RouteServiceProvider extends ServiceProvider
*
* @var string
*/
- public const HOME = '/home';
+ public const HOME = '/dashboard';
/**
* Define your route model bindings, pattern filters, and other route configuration.
diff --git a/composer.json b/composer.json
index 5b40f87..be9fc71 100644
--- a/composer.json
+++ b/composer.json
@@ -7,12 +7,15 @@
"require": {
"php": "^8.1",
"guzzlehttp/guzzle": "^7.2",
+ "inertiajs/inertia-laravel": "^0.6.3",
"laravel/framework": "^10.0",
"laravel/sanctum": "^3.2",
- "laravel/tinker": "^2.8"
+ "laravel/tinker": "^2.8",
+ "tightenco/ziggy": "^2.0"
},
"require-dev": {
"fakerphp/faker": "^1.9.1",
+ "laravel/breeze": "^1.29",
"laravel/pint": "^1.0",
"laravel/sail": "^1.18",
"mockery/mockery": "^1.4.4",
diff --git a/composer.lock b/composer.lock
index 930aa4d..60498b7 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "bfe12996eeecb6fdc8713a9fd9d431f8",
+ "content-hash": "44d8185187ad62ec42dc2fe932715ec5",
"packages": [
{
"name": "brick/math",
@@ -1054,6 +1054,78 @@
],
"time": "2023-12-03T19:50:20+00:00"
},
+ {
+ "name": "inertiajs/inertia-laravel",
+ "version": "v0.6.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/inertiajs/inertia-laravel.git",
+ "reference": "2a1e19048f95c0e4adb2b2733f9119e49c4fc09f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/2a1e19048f95c0e4adb2b2733f9119e49c4fc09f",
+ "reference": "2a1e19048f95c0e4adb2b2733f9119e49c4fc09f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "laravel/framework": "^6.0|^7.0|^8.74|^9.0|^10.0",
+ "php": "^7.2|~8.0.0|~8.1.0|~8.2.0|~8.3.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.3.3",
+ "orchestra/testbench": "^4.0|^5.0|^6.4|^7.0|^8.0",
+ "phpunit/phpunit": "^8.0|^9.5.8",
+ "roave/security-advisories": "dev-master"
+ },
+ "suggest": {
+ "ext-pcntl": "Recommended when running the Inertia SSR server via the `inertia:start-ssr` artisan command."
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Inertia\\ServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "files": [
+ "./helpers.php"
+ ],
+ "psr-4": {
+ "Inertia\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jonathan Reinink",
+ "email": "jonathan@reinink.ca",
+ "homepage": "https://reinink.ca"
+ }
+ ],
+ "description": "The Laravel adapter for Inertia.js.",
+ "keywords": [
+ "inertia",
+ "laravel"
+ ],
+ "support": {
+ "issues": "https://github.com/inertiajs/inertia-laravel/issues",
+ "source": "https://github.com/inertiajs/inertia-laravel/tree/v0.6.11"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/reinink",
+ "type": "github"
+ }
+ ],
+ "time": "2023-10-27T10:59:02+00:00"
+ },
{
"name": "laravel/framework",
"version": "v10.48.25",
@@ -5340,6 +5412,76 @@
],
"time": "2024-11-08T15:28:48+00:00"
},
+ {
+ "name": "tightenco/ziggy",
+ "version": "v2.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/tighten/ziggy.git",
+ "reference": "2b574ba281546884b7bdde6eefa451ba7e0b52f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/tighten/ziggy/zipball/2b574ba281546884b7bdde6eefa451ba7e0b52f7",
+ "reference": "2b574ba281546884b7bdde6eefa451ba7e0b52f7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "laravel/framework": ">=9.0",
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "laravel/folio": "^1.1",
+ "orchestra/testbench": "^7.0 || ^8.0 || ^9.0",
+ "pestphp/pest": "^2.26",
+ "pestphp/pest-plugin-laravel": "^2.4"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Tighten\\Ziggy\\ZiggyServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Tighten\\Ziggy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Daniel Coulbourne",
+ "email": "daniel@tighten.co"
+ },
+ {
+ "name": "Jake Bathman",
+ "email": "jake@tighten.co"
+ },
+ {
+ "name": "Jacob Baker-Kretzmar",
+ "email": "jacob@tighten.co"
+ }
+ ],
+ "description": "Use your Laravel named routes in JavaScript.",
+ "homepage": "https://github.com/tighten/ziggy",
+ "keywords": [
+ "Ziggy",
+ "javascript",
+ "laravel",
+ "routes"
+ ],
+ "support": {
+ "issues": "https://github.com/tighten/ziggy/issues",
+ "source": "https://github.com/tighten/ziggy/tree/v2.5.0"
+ },
+ "time": "2025-01-23T00:32:18+00:00"
+ },
{
"name": "tijsverkoyen/css-to-inline-styles",
"version": "v2.3.0",
@@ -5798,6 +5940,68 @@
},
"time": "2020-07-09T08:09:16+00:00"
},
+ {
+ "name": "laravel/breeze",
+ "version": "v1.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/breeze.git",
+ "reference": "22c53b84b7fff91b01a318d71a10dfc251e92849"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/breeze/zipball/22c53b84b7fff91b01a318d71a10dfc251e92849",
+ "reference": "22c53b84b7fff91b01a318d71a10dfc251e92849",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/console": "^10.17",
+ "illuminate/filesystem": "^10.17",
+ "illuminate/support": "^10.17",
+ "illuminate/validation": "^10.17",
+ "php": "^8.1.0"
+ },
+ "require-dev": {
+ "orchestra/testbench": "^8.0",
+ "phpstan/phpstan": "^1.10"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Laravel\\Breeze\\BreezeServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Breeze\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Minimal Laravel authentication scaffolding with Blade and Tailwind.",
+ "keywords": [
+ "auth",
+ "laravel"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/breeze/issues",
+ "source": "https://github.com/laravel/breeze"
+ },
+ "time": "2024-03-04T14:35:21+00:00"
+ },
{
"name": "laravel/pint",
"version": "v1.20.0",
diff --git a/jsconfig.json b/jsconfig.json
new file mode 100644
index 0000000..6269354
--- /dev/null
+++ b/jsconfig.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["resources/js/*"],
+ "ziggy-js": ["./vendor/tightenco/ziggy"]
+ }
+ },
+ "exclude": ["node_modules", "public"]
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..523a5eb
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2981 @@
+{
+ "name": "projectTa",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "devDependencies": {
+ "@headlessui/react": "^1.4.2",
+ "@inertiajs/react": "^1.0.0",
+ "@tailwindcss/forms": "^0.5.3",
+ "@vitejs/plugin-react": "^4.2.0",
+ "autoprefixer": "^10.4.12",
+ "axios": "^1.1.2",
+ "laravel-vite-plugin": "^0.7.2",
+ "postcss": "^8.4.31",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "tailwindcss": "^3.2.1",
+ "vite": "^4.0.0"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz",
+ "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz",
+ "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.5",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.7",
+ "@babel/parser": "^7.26.7",
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.26.7",
+ "@babel/types": "^7.26.7",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz",
+ "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.26.5",
+ "@babel/types": "^7.26.5",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
+ "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+ "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
+ "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz",
+ "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.26.7"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
+ "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
+ "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz",
+ "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.5",
+ "@babel/parser": "^7.26.7",
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.7",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz",
+ "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
+ "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
+ "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
+ "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
+ "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
+ "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
+ "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
+ "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
+ "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
+ "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
+ "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
+ "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
+ "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
+ "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
+ "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
+ "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
+ "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
+ "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
+ "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
+ "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
+ "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@headlessui/react": {
+ "version": "1.7.19",
+ "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.19.tgz",
+ "integrity": "sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==",
+ "dev": true,
+ "dependencies": {
+ "@tanstack/react-virtual": "^3.0.0-beta.60",
+ "client-only": "^0.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": "^16 || ^17 || ^18",
+ "react-dom": "^16 || ^17 || ^18"
+ }
+ },
+ "node_modules/@inertiajs/core": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.3.0.tgz",
+ "integrity": "sha512-TJ8R1eUYY473m9DaKlCPRdHTdznFWTDuy5VvEzXg3t/hohbDQedLj46yn/uAqziJPEUZJrSftZzPI2NMzL9tQA==",
+ "dev": true,
+ "dependencies": {
+ "axios": "^1.6.0",
+ "deepmerge": "^4.0.0",
+ "nprogress": "^0.2.0",
+ "qs": "^6.9.0"
+ }
+ },
+ "node_modules/@inertiajs/react": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@inertiajs/react/-/react-1.3.0.tgz",
+ "integrity": "sha512-K+PF23xP6jjMkubs8PbxT1MroSDdH1z3VTEGbO3685Xyf0QNwoNIF95hnyqJxlWaeG4fB0GAag40gh04fefRUA==",
+ "dev": true,
+ "dependencies": {
+ "@inertiajs/core": "1.3.0",
+ "lodash.isequal": "^4.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@tailwindcss/forms": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz",
+ "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==",
+ "dev": true,
+ "dependencies": {
+ "mini-svg-data-uri": "^1.2.3"
+ },
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1"
+ }
+ },
+ "node_modules/@tanstack/react-virtual": {
+ "version": "3.11.3",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.11.3.tgz",
+ "integrity": "sha512-vCU+OTylXN3hdC8RKg68tPlBPjjxtzon7Ys46MgrSLE+JhSjSTPvoQifV6DQJeJmA8Q3KT6CphJbejupx85vFw==",
+ "dev": true,
+ "dependencies": {
+ "@tanstack/virtual-core": "3.11.3"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@tanstack/virtual-core": {
+ "version": "3.11.3",
+ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.11.3.tgz",
+ "integrity": "sha512-v2mrNSnMwnPJtcVqNvV0c5roGCBqeogN8jDtgtuHCphdwBasOZ17x8UV8qpHUh+u0MLfX43c0uUHKje0s+Zb0w==",
+ "dev": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz",
+ "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.26.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-source": "^7.25.9",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.14.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.20",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
+ "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.23.3",
+ "caniuse-lite": "^1.0.30001646",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+ "dev": true,
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
+ "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
+ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001696",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz",
+ "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "dev": true
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.88",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz",
+ "integrity": "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
+ "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.18.20",
+ "@esbuild/android-arm64": "0.18.20",
+ "@esbuild/android-x64": "0.18.20",
+ "@esbuild/darwin-arm64": "0.18.20",
+ "@esbuild/darwin-x64": "0.18.20",
+ "@esbuild/freebsd-arm64": "0.18.20",
+ "@esbuild/freebsd-x64": "0.18.20",
+ "@esbuild/linux-arm": "0.18.20",
+ "@esbuild/linux-arm64": "0.18.20",
+ "@esbuild/linux-ia32": "0.18.20",
+ "@esbuild/linux-loong64": "0.18.20",
+ "@esbuild/linux-mips64el": "0.18.20",
+ "@esbuild/linux-ppc64": "0.18.20",
+ "@esbuild/linux-riscv64": "0.18.20",
+ "@esbuild/linux-s390x": "0.18.20",
+ "@esbuild/linux-x64": "0.18.20",
+ "@esbuild/netbsd-x64": "0.18.20",
+ "@esbuild/openbsd-x64": "0.18.20",
+ "@esbuild/sunos-x64": "0.18.20",
+ "@esbuild/win32-arm64": "0.18.20",
+ "@esbuild/win32-ia32": "0.18.20",
+ "@esbuild/win32-x64": "0.18.20"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
+ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
+ "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.0",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/laravel-vite-plugin": {
+ "version": "0.7.8",
+ "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.7.8.tgz",
+ "integrity": "sha512-HWYqpQYHR3kEQ1LsHX7gHJoNNf0bz5z5mDaHBLzS+PGLCTmYqlU5/SZyeEgObV7z7bC/cnStYcY9H1DI1D5Udg==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "vite-plugin-full-reload": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "vite": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+ "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.",
+ "dev": true
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mini-svg-data-uri": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
+ "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
+ "dev": true,
+ "bin": {
+ "mini-svg-data-uri": "cli.js"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nprogress": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
+ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==",
+ "dev": true
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
+ "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
+ "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "dev": true
+ },
+ "node_modules/qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+ "dev": true,
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "dev": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "dev": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
+ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "3.29.5",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz",
+ "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "dev": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.17",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
+ "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
+ "dev": true,
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.6.0",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.2",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.6",
+ "lilconfig": "^3.1.3",
+ "micromatch": "^4.0.8",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.47",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.2",
+ "postcss-nested": "^6.2.0",
+ "postcss-selector-parser": "^6.1.2",
+ "resolve": "^1.22.8",
+ "sucrase": "^3.35.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
+ "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/vite": {
+ "version": "4.5.9",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.9.tgz",
+ "integrity": "sha512-qK9W4xjgD3gXbC0NmdNFFnVFLMWSNiR3swj957yutwzzN16xF/E7nmtAyp1rT9hviDroQANjE4HK3H4WqWdFtw==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.18.10",
+ "postcss": "^8.4.27",
+ "rollup": "^3.27.1"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "@types/node": ">= 14",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-full-reload": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz",
+ "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
+ "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
+ "dev": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index 3a76ed0..96d6b61 100644
--- a/package.json
+++ b/package.json
@@ -5,8 +5,17 @@
"build": "vite build"
},
"devDependencies": {
+ "@headlessui/react": "^1.4.2",
+ "@inertiajs/react": "^1.0.0",
+ "@tailwindcss/forms": "^0.5.3",
+ "@vitejs/plugin-react": "^4.2.0",
+ "autoprefixer": "^10.4.12",
"axios": "^1.1.2",
"laravel-vite-plugin": "^0.7.2",
+ "postcss": "^8.4.31",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "tailwindcss": "^3.2.1",
"vite": "^4.0.0"
}
}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..12a703d
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/resources/css/app.css b/resources/css/app.css
index e69de29..b5c61c9 100644
--- a/resources/css/app.css
+++ b/resources/css/app.css
@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/resources/js/Components/ApplicationLogo.jsx b/resources/js/Components/ApplicationLogo.jsx
new file mode 100644
index 0000000..e9f15d7
--- /dev/null
+++ b/resources/js/Components/ApplicationLogo.jsx
@@ -0,0 +1,7 @@
+export default function ApplicationLogo(props) {
+ return (
+
+
+
+ );
+}
diff --git a/resources/js/Components/Checkbox.jsx b/resources/js/Components/Checkbox.jsx
new file mode 100644
index 0000000..34a31fe
--- /dev/null
+++ b/resources/js/Components/Checkbox.jsx
@@ -0,0 +1,12 @@
+export default function Checkbox({ className = '', ...props }) {
+ return (
+
+ );
+}
diff --git a/resources/js/Components/DangerButton.jsx b/resources/js/Components/DangerButton.jsx
new file mode 100644
index 0000000..45cf59b
--- /dev/null
+++ b/resources/js/Components/DangerButton.jsx
@@ -0,0 +1,15 @@
+export default function DangerButton({ className = '', disabled, children, ...props }) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/resources/js/Components/Dropdown.jsx b/resources/js/Components/Dropdown.jsx
new file mode 100644
index 0000000..b4491a4
--- /dev/null
+++ b/resources/js/Components/Dropdown.jsx
@@ -0,0 +1,91 @@
+import { useState, createContext, useContext, Fragment } from 'react';
+import { Link } from '@inertiajs/react';
+import { Transition } from '@headlessui/react';
+
+const DropDownContext = createContext();
+
+const Dropdown = ({ children }) => {
+ const [open, setOpen] = useState(false);
+
+ const toggleOpen = () => {
+ setOpen((previousState) => !previousState);
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+const Trigger = ({ children }) => {
+ const { open, setOpen, toggleOpen } = useContext(DropDownContext);
+
+ return (
+ <>
+ {children}
+
+ {open && setOpen(false)}>
}
+ >
+ );
+};
+
+const Content = ({ align = 'right', width = '48', contentClasses = 'py-1 bg-white', children }) => {
+ const { open, setOpen } = useContext(DropDownContext);
+
+ let alignmentClasses = 'origin-top';
+
+ if (align === 'left') {
+ alignmentClasses = 'ltr:origin-top-left rtl:origin-top-right start-0';
+ } else if (align === 'right') {
+ alignmentClasses = 'ltr:origin-top-right rtl:origin-top-left end-0';
+ }
+
+ let widthClasses = '';
+
+ if (width === '48') {
+ widthClasses = 'w-48';
+ }
+
+ return (
+ <>
+
+ setOpen(false)}
+ >
+
{children}
+
+
+ >
+ );
+};
+
+const DropdownLink = ({ className = '', children, ...props }) => {
+ return (
+
+ {children}
+
+ );
+};
+
+Dropdown.Trigger = Trigger;
+Dropdown.Content = Content;
+Dropdown.Link = DropdownLink;
+
+export default Dropdown;
diff --git a/resources/js/Components/InputError.jsx b/resources/js/Components/InputError.jsx
new file mode 100644
index 0000000..ec57b3e
--- /dev/null
+++ b/resources/js/Components/InputError.jsx
@@ -0,0 +1,7 @@
+export default function InputError({ message, className = '', ...props }) {
+ return message ? (
+
+ {message}
+
+ ) : null;
+}
diff --git a/resources/js/Components/InputLabel.jsx b/resources/js/Components/InputLabel.jsx
new file mode 100644
index 0000000..20fcf7e
--- /dev/null
+++ b/resources/js/Components/InputLabel.jsx
@@ -0,0 +1,7 @@
+export default function InputLabel({ value, className = '', children, ...props }) {
+ return (
+
+ {value ? value : children}
+
+ );
+}
diff --git a/resources/js/Components/Modal.jsx b/resources/js/Components/Modal.jsx
new file mode 100644
index 0000000..cf6d39f
--- /dev/null
+++ b/resources/js/Components/Modal.jsx
@@ -0,0 +1,57 @@
+import { Fragment } from 'react';
+import { Dialog, Transition } from '@headlessui/react';
+
+export default function Modal({ children, show = false, maxWidth = '2xl', closeable = true, onClose = () => {} }) {
+ const close = () => {
+ if (closeable) {
+ onClose();
+ }
+ };
+
+ const maxWidthClass = {
+ sm: 'sm:max-w-sm',
+ md: 'sm:max-w-md',
+ lg: 'sm:max-w-lg',
+ xl: 'sm:max-w-xl',
+ '2xl': 'sm:max-w-2xl',
+ }[maxWidth];
+
+ return (
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+
+ );
+}
diff --git a/resources/js/Components/NavLink.jsx b/resources/js/Components/NavLink.jsx
new file mode 100644
index 0000000..71a983c
--- /dev/null
+++ b/resources/js/Components/NavLink.jsx
@@ -0,0 +1,18 @@
+import { Link } from '@inertiajs/react';
+
+export default function NavLink({ active = false, className = '', children, ...props }) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/resources/js/Components/PrimaryButton.jsx b/resources/js/Components/PrimaryButton.jsx
new file mode 100644
index 0000000..4f422cd
--- /dev/null
+++ b/resources/js/Components/PrimaryButton.jsx
@@ -0,0 +1,15 @@
+export default function PrimaryButton({ className = '', disabled, children, ...props }) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/resources/js/Components/ResponsiveNavLink.jsx b/resources/js/Components/ResponsiveNavLink.jsx
new file mode 100644
index 0000000..4a64ddb
--- /dev/null
+++ b/resources/js/Components/ResponsiveNavLink.jsx
@@ -0,0 +1,16 @@
+import { Link } from '@inertiajs/react';
+
+export default function ResponsiveNavLink({ active = false, className = '', children, ...props }) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/resources/js/Components/SecondaryButton.jsx b/resources/js/Components/SecondaryButton.jsx
new file mode 100644
index 0000000..730beac
--- /dev/null
+++ b/resources/js/Components/SecondaryButton.jsx
@@ -0,0 +1,16 @@
+export default function SecondaryButton({ type = 'button', className = '', disabled, children, ...props }) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/resources/js/Components/TextInput.jsx b/resources/js/Components/TextInput.jsx
new file mode 100644
index 0000000..f1094dc
--- /dev/null
+++ b/resources/js/Components/TextInput.jsx
@@ -0,0 +1,23 @@
+import { forwardRef, useEffect, useRef } from 'react';
+
+export default forwardRef(function TextInput({ type = 'text', className = '', isFocused = false, ...props }, ref) {
+ const input = ref ? ref : useRef();
+
+ useEffect(() => {
+ if (isFocused) {
+ input.current.focus();
+ }
+ }, []);
+
+ return (
+
+ );
+});
diff --git a/resources/js/Layouts/AuthenticatedLayout.jsx b/resources/js/Layouts/AuthenticatedLayout.jsx
new file mode 100644
index 0000000..079a0b3
--- /dev/null
+++ b/resources/js/Layouts/AuthenticatedLayout.jsx
@@ -0,0 +1,125 @@
+import { useState } from 'react';
+import ApplicationLogo from '@/Components/ApplicationLogo';
+import Dropdown from '@/Components/Dropdown';
+import NavLink from '@/Components/NavLink';
+import ResponsiveNavLink from '@/Components/ResponsiveNavLink';
+import { Link } from '@inertiajs/react';
+
+export default function Authenticated({ user, header, children }) {
+ const [showingNavigationDropdown, setShowingNavigationDropdown] = useState(false);
+
+ return (
+
+
+
+
+
+
+
+
+
+ Dashboard
+
+
+
+
+
+
+
+
+
+
+ {user.name}
+
+
+
+
+
+
+
+
+
+ Profile
+
+ Log Out
+
+
+
+
+
+
+
+
setShowingNavigationDropdown((previousState) => !previousState)}
+ className="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+ Dashboard
+
+
+
+
+
+
{user.name}
+
{user.email}
+
+
+
+ Profile
+
+ Log Out
+
+
+
+
+
+
+ {header && (
+
+ )}
+
+
{children}
+
+ );
+}
diff --git a/resources/js/Layouts/GuestLayout.jsx b/resources/js/Layouts/GuestLayout.jsx
new file mode 100644
index 0000000..090d571
--- /dev/null
+++ b/resources/js/Layouts/GuestLayout.jsx
@@ -0,0 +1,18 @@
+import ApplicationLogo from '@/Components/ApplicationLogo';
+import { Link } from '@inertiajs/react';
+
+export default function Guest({ children }) {
+ return (
+
+ );
+}
diff --git a/resources/js/Pages/Auth/ConfirmPassword.jsx b/resources/js/Pages/Auth/ConfirmPassword.jsx
new file mode 100644
index 0000000..fe97fd2
--- /dev/null
+++ b/resources/js/Pages/Auth/ConfirmPassword.jsx
@@ -0,0 +1,59 @@
+import { useEffect } from 'react';
+import GuestLayout from '@/Layouts/GuestLayout';
+import InputError from '@/Components/InputError';
+import InputLabel from '@/Components/InputLabel';
+import PrimaryButton from '@/Components/PrimaryButton';
+import TextInput from '@/Components/TextInput';
+import { Head, useForm } from '@inertiajs/react';
+
+export default function ConfirmPassword() {
+ const { data, setData, post, processing, errors, reset } = useForm({
+ password: '',
+ });
+
+ useEffect(() => {
+ return () => {
+ reset('password');
+ };
+ }, []);
+
+ const submit = (e) => {
+ e.preventDefault();
+
+ post(route('password.confirm'));
+ };
+
+ return (
+
+
+
+
+ This is a secure area of the application. Please confirm your password before continuing.
+
+
+
+
+ );
+}
diff --git a/resources/js/Pages/Auth/ForgotPassword.jsx b/resources/js/Pages/Auth/ForgotPassword.jsx
new file mode 100644
index 0000000..46bcd76
--- /dev/null
+++ b/resources/js/Pages/Auth/ForgotPassword.jsx
@@ -0,0 +1,50 @@
+import GuestLayout from '@/Layouts/GuestLayout';
+import InputError from '@/Components/InputError';
+import PrimaryButton from '@/Components/PrimaryButton';
+import TextInput from '@/Components/TextInput';
+import { Head, useForm } from '@inertiajs/react';
+
+export default function ForgotPassword({ status }) {
+ const { data, setData, post, processing, errors } = useForm({
+ email: '',
+ });
+
+ const submit = (e) => {
+ e.preventDefault();
+
+ post(route('password.email'));
+ };
+
+ return (
+
+
+
+
+ Forgot your password? No problem. Just let us know your email address and we will email you a password
+ reset link that will allow you to choose a new one.
+
+
+ {status && {status}
}
+
+
+
+ );
+}
diff --git a/resources/js/Pages/Auth/Login.jsx b/resources/js/Pages/Auth/Login.jsx
new file mode 100644
index 0000000..11bee02
--- /dev/null
+++ b/resources/js/Pages/Auth/Login.jsx
@@ -0,0 +1,97 @@
+import { useEffect } from 'react';
+import Checkbox from '@/Components/Checkbox';
+import GuestLayout from '@/Layouts/GuestLayout';
+import InputError from '@/Components/InputError';
+import InputLabel from '@/Components/InputLabel';
+import PrimaryButton from '@/Components/PrimaryButton';
+import TextInput from '@/Components/TextInput';
+import { Head, Link, useForm } from '@inertiajs/react';
+
+export default function Login({ status, canResetPassword }) {
+ const { data, setData, post, processing, errors, reset } = useForm({
+ email: '',
+ password: '',
+ remember: false,
+ });
+
+ useEffect(() => {
+ return () => {
+ reset('password');
+ };
+ }, []);
+
+ const submit = (e) => {
+ e.preventDefault();
+
+ post(route('login'));
+ };
+
+ return (
+
+
+
+ {status && {status}
}
+
+
+
+ );
+}
diff --git a/resources/js/Pages/Auth/Register.jsx b/resources/js/Pages/Auth/Register.jsx
new file mode 100644
index 0000000..d4e9acb
--- /dev/null
+++ b/resources/js/Pages/Auth/Register.jsx
@@ -0,0 +1,117 @@
+import { useEffect } from 'react';
+import GuestLayout from '@/Layouts/GuestLayout';
+import InputError from '@/Components/InputError';
+import InputLabel from '@/Components/InputLabel';
+import PrimaryButton from '@/Components/PrimaryButton';
+import TextInput from '@/Components/TextInput';
+import { Head, Link, useForm } from '@inertiajs/react';
+
+export default function Register() {
+ const { data, setData, post, processing, errors, reset } = useForm({
+ name: '',
+ email: '',
+ password: '',
+ password_confirmation: '',
+ });
+
+ useEffect(() => {
+ return () => {
+ reset('password', 'password_confirmation');
+ };
+ }, []);
+
+ const submit = (e) => {
+ e.preventDefault();
+
+ post(route('register'));
+ };
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/resources/js/Pages/Auth/ResetPassword.jsx b/resources/js/Pages/Auth/ResetPassword.jsx
new file mode 100644
index 0000000..0e4d329
--- /dev/null
+++ b/resources/js/Pages/Auth/ResetPassword.jsx
@@ -0,0 +1,90 @@
+import { useEffect } from 'react';
+import GuestLayout from '@/Layouts/GuestLayout';
+import InputError from '@/Components/InputError';
+import InputLabel from '@/Components/InputLabel';
+import PrimaryButton from '@/Components/PrimaryButton';
+import TextInput from '@/Components/TextInput';
+import { Head, useForm } from '@inertiajs/react';
+
+export default function ResetPassword({ token, email }) {
+ const { data, setData, post, processing, errors, reset } = useForm({
+ token: token,
+ email: email,
+ password: '',
+ password_confirmation: '',
+ });
+
+ useEffect(() => {
+ return () => {
+ reset('password', 'password_confirmation');
+ };
+ }, []);
+
+ const submit = (e) => {
+ e.preventDefault();
+
+ post(route('password.store'));
+ };
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/resources/js/Pages/Auth/VerifyEmail.jsx b/resources/js/Pages/Auth/VerifyEmail.jsx
new file mode 100644
index 0000000..c9362b8
--- /dev/null
+++ b/resources/js/Pages/Auth/VerifyEmail.jsx
@@ -0,0 +1,45 @@
+import GuestLayout from '@/Layouts/GuestLayout';
+import PrimaryButton from '@/Components/PrimaryButton';
+import { Head, Link, useForm } from '@inertiajs/react';
+
+export default function VerifyEmail({ status }) {
+ const { post, processing } = useForm({});
+
+ const submit = (e) => {
+ e.preventDefault();
+
+ post(route('verification.send'));
+ };
+
+ return (
+
+
+
+
+ Thanks for signing up! Before getting started, could you verify your email address by clicking on the
+ link we just emailed to you? If you didn't receive the email, we will gladly send you another.
+
+
+ {status === 'verification-link-sent' && (
+
+ A new verification link has been sent to the email address you provided during registration.
+
+ )}
+
+
+
+ );
+}
diff --git a/resources/js/Pages/Dashboard.jsx b/resources/js/Pages/Dashboard.jsx
new file mode 100644
index 0000000..8948bad
--- /dev/null
+++ b/resources/js/Pages/Dashboard.jsx
@@ -0,0 +1,21 @@
+import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
+import { Head } from '@inertiajs/react';
+
+export default function Dashboard({ auth }) {
+ return (
+ Dashboard}
+ >
+
+
+
+
+ );
+}
diff --git a/resources/js/Pages/Profile/Edit.jsx b/resources/js/Pages/Profile/Edit.jsx
new file mode 100644
index 0000000..aa2fa0a
--- /dev/null
+++ b/resources/js/Pages/Profile/Edit.jsx
@@ -0,0 +1,36 @@
+import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
+import DeleteUserForm from './Partials/DeleteUserForm';
+import UpdatePasswordForm from './Partials/UpdatePasswordForm';
+import UpdateProfileInformationForm from './Partials/UpdateProfileInformationForm';
+import { Head } from '@inertiajs/react';
+
+export default function Edit({ auth, mustVerifyEmail, status }) {
+ return (
+ Profile}
+ >
+
+
+
+
+ );
+}
diff --git a/resources/js/Pages/Profile/Partials/DeleteUserForm.jsx b/resources/js/Pages/Profile/Partials/DeleteUserForm.jsx
new file mode 100644
index 0000000..9bb0d13
--- /dev/null
+++ b/resources/js/Pages/Profile/Partials/DeleteUserForm.jsx
@@ -0,0 +1,99 @@
+import { useRef, useState } from 'react';
+import DangerButton from '@/Components/DangerButton';
+import InputError from '@/Components/InputError';
+import InputLabel from '@/Components/InputLabel';
+import Modal from '@/Components/Modal';
+import SecondaryButton from '@/Components/SecondaryButton';
+import TextInput from '@/Components/TextInput';
+import { useForm } from '@inertiajs/react';
+
+export default function DeleteUserForm({ className = '' }) {
+ const [confirmingUserDeletion, setConfirmingUserDeletion] = useState(false);
+ const passwordInput = useRef();
+
+ const {
+ data,
+ setData,
+ delete: destroy,
+ processing,
+ reset,
+ errors,
+ } = useForm({
+ password: '',
+ });
+
+ const confirmUserDeletion = () => {
+ setConfirmingUserDeletion(true);
+ };
+
+ const deleteUser = (e) => {
+ e.preventDefault();
+
+ destroy(route('profile.destroy'), {
+ preserveScroll: true,
+ onSuccess: () => closeModal(),
+ onError: () => passwordInput.current.focus(),
+ onFinish: () => reset(),
+ });
+ };
+
+ const closeModal = () => {
+ setConfirmingUserDeletion(false);
+
+ reset();
+ };
+
+ return (
+
+
+ Delete Account
+
+
+ Once your account is deleted, all of its resources and data will be permanently deleted. Before
+ deleting your account, please download any data or information that you wish to retain.
+
+
+
+ Delete Account
+
+
+
+
+
+ );
+}
diff --git a/resources/js/Pages/Profile/Partials/UpdatePasswordForm.jsx b/resources/js/Pages/Profile/Partials/UpdatePasswordForm.jsx
new file mode 100644
index 0000000..ba6a5e9
--- /dev/null
+++ b/resources/js/Pages/Profile/Partials/UpdatePasswordForm.jsx
@@ -0,0 +1,113 @@
+import { useRef } from 'react';
+import InputError from '@/Components/InputError';
+import InputLabel from '@/Components/InputLabel';
+import PrimaryButton from '@/Components/PrimaryButton';
+import TextInput from '@/Components/TextInput';
+import { useForm } from '@inertiajs/react';
+import { Transition } from '@headlessui/react';
+
+export default function UpdatePasswordForm({ className = '' }) {
+ const passwordInput = useRef();
+ const currentPasswordInput = useRef();
+
+ const { data, setData, errors, put, reset, processing, recentlySuccessful } = useForm({
+ current_password: '',
+ password: '',
+ password_confirmation: '',
+ });
+
+ const updatePassword = (e) => {
+ e.preventDefault();
+
+ put(route('password.update'), {
+ preserveScroll: true,
+ onSuccess: () => reset(),
+ onError: (errors) => {
+ if (errors.password) {
+ reset('password', 'password_confirmation');
+ passwordInput.current.focus();
+ }
+
+ if (errors.current_password) {
+ reset('current_password');
+ currentPasswordInput.current.focus();
+ }
+ },
+ });
+ };
+
+ return (
+
+ );
+}
diff --git a/resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.jsx b/resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.jsx
new file mode 100644
index 0000000..322d397
--- /dev/null
+++ b/resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.jsx
@@ -0,0 +1,103 @@
+import InputError from '@/Components/InputError';
+import InputLabel from '@/Components/InputLabel';
+import PrimaryButton from '@/Components/PrimaryButton';
+import TextInput from '@/Components/TextInput';
+import { Link, useForm, usePage } from '@inertiajs/react';
+import { Transition } from '@headlessui/react';
+
+export default function UpdateProfileInformation({ mustVerifyEmail, status, className = '' }) {
+ const user = usePage().props.auth.user;
+
+ const { data, setData, patch, errors, processing, recentlySuccessful } = useForm({
+ name: user.name,
+ email: user.email,
+ });
+
+ const submit = (e) => {
+ e.preventDefault();
+
+ patch(route('profile.update'));
+ };
+
+ return (
+
+ );
+}
diff --git a/resources/js/Pages/Welcome.jsx b/resources/js/Pages/Welcome.jsx
new file mode 100644
index 0000000..af33c98
--- /dev/null
+++ b/resources/js/Pages/Welcome.jsx
@@ -0,0 +1,315 @@
+import { Link, Head } from '@inertiajs/react';
+
+export default function Welcome({ auth, laravelVersion, phpVersion }) {
+ return (
+ <>
+
+
+
+ {auth.user ? (
+
+ Dashboard
+
+ ) : (
+ <>
+
+ Log in
+
+
+
+ Register
+
+ >
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+ Documentation
+
+
+
+ Laravel has wonderful documentation covering every aspect of the framework.
+ Whether you are a newcomer or have prior experience with Laravel, we recommend
+ reading our documentation from beginning to end.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Laracasts
+
+
+
+ Laracasts offers thousands of video tutorials on Laravel, PHP, and JavaScript
+ development. Check them out, see for yourself, and massively level up your
+ development skills in the process.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Laravel News
+
+
+
+ Laravel News is a community driven portal and newsletter aggregating all of the
+ latest and most important news in the Laravel ecosystem, including new package
+ releases and tutorials.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Vibrant Ecosystem
+
+
+
+ Laravel's robust library of first-party tools and libraries, such as{' '}
+
+ Forge
+
+ ,{' '}
+
+ Vapor
+
+ ,{' '}
+
+ Nova
+
+ , and{' '}
+
+ Envoyer
+ {' '}
+ help you take your projects to the next level. Pair them with powerful open
+ source libraries like{' '}
+
+ Cashier
+
+ ,{' '}
+
+ Dusk
+
+ ,{' '}
+
+ Echo
+
+ ,{' '}
+
+ Horizon
+
+ ,{' '}
+
+ Sanctum
+
+ ,{' '}
+
+ Telescope
+
+ , and more.
+
+
+
+
+
+
+
+
+
+
+ Laravel v{laravelVersion} (PHP v{phpVersion})
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/resources/js/app.js b/resources/js/app.js
deleted file mode 100644
index e59d6a0..0000000
--- a/resources/js/app.js
+++ /dev/null
@@ -1 +0,0 @@
-import './bootstrap';
diff --git a/resources/js/app.jsx b/resources/js/app.jsx
new file mode 100644
index 0000000..c150780
--- /dev/null
+++ b/resources/js/app.jsx
@@ -0,0 +1,21 @@
+import './bootstrap';
+import '../css/app.css';
+
+import { createRoot } from 'react-dom/client';
+import { createInertiaApp } from '@inertiajs/react';
+import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers';
+
+const appName = import.meta.env.VITE_APP_NAME || 'Laravel';
+
+createInertiaApp({
+ title: (title) => `${title} - ${appName}`,
+ resolve: (name) => resolvePageComponent(`./Pages/${name}.jsx`, import.meta.glob('./Pages/**/*.jsx')),
+ setup({ el, App, props }) {
+ const root = createRoot(el);
+
+ root.render( );
+ },
+ progress: {
+ color: '#4B5563',
+ },
+});
diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php
new file mode 100644
index 0000000..856bcf2
--- /dev/null
+++ b/resources/views/app.blade.php
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+ {{ config('app.name', 'Laravel') }}
+
+
+
+
+
+
+ @routes
+ @viteReactRefresh
+ @vite(['resources/js/app.jsx', "resources/js/Pages/{$page['component']}.jsx"])
+ @inertiaHead
+
+
+ @inertia
+
+
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php
new file mode 100644
index 0000000..e69de29
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php
new file mode 100644
index 0000000..e69de29
diff --git a/resources/views/list-admin/santri/viewSantri.blade.php b/resources/views/list-admin/santri/viewSantri.blade.php
new file mode 100644
index 0000000..e69de29
diff --git a/routes/auth.php b/routes/auth.php
new file mode 100644
index 0000000..1040b51
--- /dev/null
+++ b/routes/auth.php
@@ -0,0 +1,59 @@
+group(function () {
+ Route::get('register', [RegisteredUserController::class, 'create'])
+ ->name('register');
+
+ Route::post('register', [RegisteredUserController::class, 'store']);
+
+ Route::get('login', [AuthenticatedSessionController::class, 'create'])
+ ->name('login');
+
+ Route::post('login', [AuthenticatedSessionController::class, 'store']);
+
+ Route::get('forgot-password', [PasswordResetLinkController::class, 'create'])
+ ->name('password.request');
+
+ Route::post('forgot-password', [PasswordResetLinkController::class, 'store'])
+ ->name('password.email');
+
+ Route::get('reset-password/{token}', [NewPasswordController::class, 'create'])
+ ->name('password.reset');
+
+ Route::post('reset-password', [NewPasswordController::class, 'store'])
+ ->name('password.store');
+});
+
+Route::middleware('auth')->group(function () {
+ Route::get('verify-email', EmailVerificationPromptController::class)
+ ->name('verification.notice');
+
+ Route::get('verify-email/{id}/{hash}', VerifyEmailController::class)
+ ->middleware(['signed', 'throttle:6,1'])
+ ->name('verification.verify');
+
+ Route::post('email/verification-notification', [EmailVerificationNotificationController::class, 'store'])
+ ->middleware('throttle:6,1')
+ ->name('verification.send');
+
+ Route::get('confirm-password', [ConfirmablePasswordController::class, 'show'])
+ ->name('password.confirm');
+
+ Route::post('confirm-password', [ConfirmablePasswordController::class, 'store']);
+
+ Route::put('password', [PasswordController::class, 'update'])->name('password.update');
+
+ Route::post('logout', [AuthenticatedSessionController::class, 'destroy'])
+ ->name('logout');
+});
diff --git a/routes/web.php b/routes/web.php
index d259f33..9f834ee 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -1,6 +1,9 @@
Route::has('login'),
+ 'canRegister' => Route::has('register'),
+ 'laravelVersion' => Application::VERSION,
+ 'phpVersion' => PHP_VERSION,
+ ]);
});
+
+Route::get('/dashboard', function () {
+ return Inertia::render('Dashboard');
+})->middleware(['auth', 'verified'])->name('dashboard');
+
+Route::middleware('auth')->group(function () {
+ Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
+ Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
+ Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
+});
+
+require __DIR__.'/auth.php';
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..19ae3e3
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,22 @@
+import defaultTheme from 'tailwindcss/defaultTheme';
+import forms from '@tailwindcss/forms';
+
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: [
+ './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
+ './storage/framework/views/*.php',
+ './resources/views/**/*.blade.php',
+ './resources/js/**/*.jsx',
+ ],
+
+ theme: {
+ extend: {
+ fontFamily: {
+ sans: ['Figtree', ...defaultTheme.fontFamily.sans],
+ },
+ },
+ },
+
+ plugins: [forms],
+};
diff --git a/tests/Feature/Auth/AuthenticationTest.php b/tests/Feature/Auth/AuthenticationTest.php
new file mode 100644
index 0000000..0303b29
--- /dev/null
+++ b/tests/Feature/Auth/AuthenticationTest.php
@@ -0,0 +1,55 @@
+get('/login');
+
+ $response->assertStatus(200);
+ }
+
+ public function test_users_can_authenticate_using_the_login_screen(): void
+ {
+ $user = User::factory()->create();
+
+ $response = $this->post('/login', [
+ 'email' => $user->email,
+ 'password' => 'password',
+ ]);
+
+ $this->assertAuthenticated();
+ $response->assertRedirect(RouteServiceProvider::HOME);
+ }
+
+ public function test_users_can_not_authenticate_with_invalid_password(): void
+ {
+ $user = User::factory()->create();
+
+ $this->post('/login', [
+ 'email' => $user->email,
+ 'password' => 'wrong-password',
+ ]);
+
+ $this->assertGuest();
+ }
+
+ public function test_users_can_logout(): void
+ {
+ $user = User::factory()->create();
+
+ $response = $this->actingAs($user)->post('/logout');
+
+ $this->assertGuest();
+ $response->assertRedirect('/');
+ }
+}
diff --git a/tests/Feature/Auth/EmailVerificationTest.php b/tests/Feature/Auth/EmailVerificationTest.php
new file mode 100644
index 0000000..ba19d9c
--- /dev/null
+++ b/tests/Feature/Auth/EmailVerificationTest.php
@@ -0,0 +1,65 @@
+create([
+ 'email_verified_at' => null,
+ ]);
+
+ $response = $this->actingAs($user)->get('/verify-email');
+
+ $response->assertStatus(200);
+ }
+
+ public function test_email_can_be_verified(): void
+ {
+ $user = User::factory()->create([
+ 'email_verified_at' => null,
+ ]);
+
+ Event::fake();
+
+ $verificationUrl = URL::temporarySignedRoute(
+ 'verification.verify',
+ now()->addMinutes(60),
+ ['id' => $user->id, 'hash' => sha1($user->email)]
+ );
+
+ $response = $this->actingAs($user)->get($verificationUrl);
+
+ Event::assertDispatched(Verified::class);
+ $this->assertTrue($user->fresh()->hasVerifiedEmail());
+ $response->assertRedirect(RouteServiceProvider::HOME.'?verified=1');
+ }
+
+ public function test_email_is_not_verified_with_invalid_hash(): void
+ {
+ $user = User::factory()->create([
+ 'email_verified_at' => null,
+ ]);
+
+ $verificationUrl = URL::temporarySignedRoute(
+ 'verification.verify',
+ now()->addMinutes(60),
+ ['id' => $user->id, 'hash' => sha1('wrong-email')]
+ );
+
+ $this->actingAs($user)->get($verificationUrl);
+
+ $this->assertFalse($user->fresh()->hasVerifiedEmail());
+ }
+}
diff --git a/tests/Feature/Auth/PasswordConfirmationTest.php b/tests/Feature/Auth/PasswordConfirmationTest.php
new file mode 100644
index 0000000..ff85721
--- /dev/null
+++ b/tests/Feature/Auth/PasswordConfirmationTest.php
@@ -0,0 +1,44 @@
+create();
+
+ $response = $this->actingAs($user)->get('/confirm-password');
+
+ $response->assertStatus(200);
+ }
+
+ public function test_password_can_be_confirmed(): void
+ {
+ $user = User::factory()->create();
+
+ $response = $this->actingAs($user)->post('/confirm-password', [
+ 'password' => 'password',
+ ]);
+
+ $response->assertRedirect();
+ $response->assertSessionHasNoErrors();
+ }
+
+ public function test_password_is_not_confirmed_with_invalid_password(): void
+ {
+ $user = User::factory()->create();
+
+ $response = $this->actingAs($user)->post('/confirm-password', [
+ 'password' => 'wrong-password',
+ ]);
+
+ $response->assertSessionHasErrors();
+ }
+}
diff --git a/tests/Feature/Auth/PasswordResetTest.php b/tests/Feature/Auth/PasswordResetTest.php
new file mode 100644
index 0000000..aa50350
--- /dev/null
+++ b/tests/Feature/Auth/PasswordResetTest.php
@@ -0,0 +1,73 @@
+get('/forgot-password');
+
+ $response->assertStatus(200);
+ }
+
+ public function test_reset_password_link_can_be_requested(): void
+ {
+ Notification::fake();
+
+ $user = User::factory()->create();
+
+ $this->post('/forgot-password', ['email' => $user->email]);
+
+ Notification::assertSentTo($user, ResetPassword::class);
+ }
+
+ public function test_reset_password_screen_can_be_rendered(): void
+ {
+ Notification::fake();
+
+ $user = User::factory()->create();
+
+ $this->post('/forgot-password', ['email' => $user->email]);
+
+ Notification::assertSentTo($user, ResetPassword::class, function ($notification) {
+ $response = $this->get('/reset-password/'.$notification->token);
+
+ $response->assertStatus(200);
+
+ return true;
+ });
+ }
+
+ public function test_password_can_be_reset_with_valid_token(): void
+ {
+ Notification::fake();
+
+ $user = User::factory()->create();
+
+ $this->post('/forgot-password', ['email' => $user->email]);
+
+ Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) {
+ $response = $this->post('/reset-password', [
+ 'token' => $notification->token,
+ 'email' => $user->email,
+ 'password' => 'password',
+ 'password_confirmation' => 'password',
+ ]);
+
+ $response
+ ->assertSessionHasNoErrors()
+ ->assertRedirect(route('login'));
+
+ return true;
+ });
+ }
+}
diff --git a/tests/Feature/Auth/PasswordUpdateTest.php b/tests/Feature/Auth/PasswordUpdateTest.php
new file mode 100644
index 0000000..bbf079d
--- /dev/null
+++ b/tests/Feature/Auth/PasswordUpdateTest.php
@@ -0,0 +1,51 @@
+create();
+
+ $response = $this
+ ->actingAs($user)
+ ->from('/profile')
+ ->put('/password', [
+ 'current_password' => 'password',
+ 'password' => 'new-password',
+ 'password_confirmation' => 'new-password',
+ ]);
+
+ $response
+ ->assertSessionHasNoErrors()
+ ->assertRedirect('/profile');
+
+ $this->assertTrue(Hash::check('new-password', $user->refresh()->password));
+ }
+
+ public function test_correct_password_must_be_provided_to_update_password(): void
+ {
+ $user = User::factory()->create();
+
+ $response = $this
+ ->actingAs($user)
+ ->from('/profile')
+ ->put('/password', [
+ 'current_password' => 'wrong-password',
+ 'password' => 'new-password',
+ 'password_confirmation' => 'new-password',
+ ]);
+
+ $response
+ ->assertSessionHasErrors('current_password')
+ ->assertRedirect('/profile');
+ }
+}
diff --git a/tests/Feature/Auth/RegistrationTest.php b/tests/Feature/Auth/RegistrationTest.php
new file mode 100644
index 0000000..30829b1
--- /dev/null
+++ b/tests/Feature/Auth/RegistrationTest.php
@@ -0,0 +1,32 @@
+get('/register');
+
+ $response->assertStatus(200);
+ }
+
+ public function test_new_users_can_register(): void
+ {
+ $response = $this->post('/register', [
+ 'name' => 'Test User',
+ 'email' => 'test@example.com',
+ 'password' => 'password',
+ 'password_confirmation' => 'password',
+ ]);
+
+ $this->assertAuthenticated();
+ $response->assertRedirect(RouteServiceProvider::HOME);
+ }
+}
diff --git a/tests/Feature/ProfileTest.php b/tests/Feature/ProfileTest.php
new file mode 100644
index 0000000..49886c3
--- /dev/null
+++ b/tests/Feature/ProfileTest.php
@@ -0,0 +1,99 @@
+create();
+
+ $response = $this
+ ->actingAs($user)
+ ->get('/profile');
+
+ $response->assertOk();
+ }
+
+ public function test_profile_information_can_be_updated(): void
+ {
+ $user = User::factory()->create();
+
+ $response = $this
+ ->actingAs($user)
+ ->patch('/profile', [
+ 'name' => 'Test User',
+ 'email' => 'test@example.com',
+ ]);
+
+ $response
+ ->assertSessionHasNoErrors()
+ ->assertRedirect('/profile');
+
+ $user->refresh();
+
+ $this->assertSame('Test User', $user->name);
+ $this->assertSame('test@example.com', $user->email);
+ $this->assertNull($user->email_verified_at);
+ }
+
+ public function test_email_verification_status_is_unchanged_when_the_email_address_is_unchanged(): void
+ {
+ $user = User::factory()->create();
+
+ $response = $this
+ ->actingAs($user)
+ ->patch('/profile', [
+ 'name' => 'Test User',
+ 'email' => $user->email,
+ ]);
+
+ $response
+ ->assertSessionHasNoErrors()
+ ->assertRedirect('/profile');
+
+ $this->assertNotNull($user->refresh()->email_verified_at);
+ }
+
+ public function test_user_can_delete_their_account(): void
+ {
+ $user = User::factory()->create();
+
+ $response = $this
+ ->actingAs($user)
+ ->delete('/profile', [
+ 'password' => 'password',
+ ]);
+
+ $response
+ ->assertSessionHasNoErrors()
+ ->assertRedirect('/');
+
+ $this->assertGuest();
+ $this->assertNull($user->fresh());
+ }
+
+ public function test_correct_password_must_be_provided_to_delete_account(): void
+ {
+ $user = User::factory()->create();
+
+ $response = $this
+ ->actingAs($user)
+ ->from('/profile')
+ ->delete('/profile', [
+ 'password' => 'wrong-password',
+ ]);
+
+ $response
+ ->assertSessionHasErrors('password')
+ ->assertRedirect('/profile');
+
+ $this->assertNotNull($user->fresh());
+ }
+}
diff --git a/vite.config.js b/vite.config.js
index 421b569..19f2908 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -1,11 +1,13 @@
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
+import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [
laravel({
- input: ['resources/css/app.css', 'resources/js/app.js'],
+ input: 'resources/js/app.jsx',
refresh: true,
}),
+ react(),
],
});
From 277557acae96f0162d7dcb1d4a9da4baf419e71b Mon Sep 17 00:00:00 2001
From: alealien666
Date: Mon, 3 Feb 2025 20:03:49 +0700
Subject: [PATCH 02/25] anu
---
app/Http/Controllers/SantriController.php | 7 +++---
resources/js/Components/table.jsx | 0
.../Pages/list-admin/santri/IndexSantri.jsx | 24 +++++++++++++++++++
routes/web.php | 5 +++-
4 files changed, 31 insertions(+), 5 deletions(-)
create mode 100644 resources/js/Components/table.jsx
create mode 100644 resources/js/Pages/list-admin/santri/IndexSantri.jsx
diff --git a/app/Http/Controllers/SantriController.php b/app/Http/Controllers/SantriController.php
index 2253fa3..0044f80 100644
--- a/app/Http/Controllers/SantriController.php
+++ b/app/Http/Controllers/SantriController.php
@@ -4,6 +4,7 @@
use App\Models\Santri;
use Illuminate\Http\Request;
+use Inertia\Inertia;
class SantriController extends Controller
{
@@ -12,11 +13,9 @@ class SantriController extends Controller
*/
public function index()
{
- $santri = Santri::all();
-
- return view('list-admin.santri.viewSantri', compact('santri'));
+ $santri = Santri::all(); // Ambil semua data santri
+ return Inertia::render('list-admin/santri/IndexSantri', compact('santri')); // Sesuaikan path
}
-
public function create()
{
//
diff --git a/resources/js/Components/table.jsx b/resources/js/Components/table.jsx
new file mode 100644
index 0000000..e69de29
diff --git a/resources/js/Pages/list-admin/santri/IndexSantri.jsx b/resources/js/Pages/list-admin/santri/IndexSantri.jsx
new file mode 100644
index 0000000..6cb4812
--- /dev/null
+++ b/resources/js/Pages/list-admin/santri/IndexSantri.jsx
@@ -0,0 +1,24 @@
+import React from 'react';
+import { Head } from '@inertiajs/react';
+
+export default function IndexSantri({ santri }) {
+ console.log('Data Santri:', santri);
+ return (
+
+
+ Daftar Santri
+ {santri.map((item) => (
+
+
Nama: {item.nama}
+
Alamat: {item.alamat}
+
Status: {item.status_santri}
+
Role: {item.role_santri}
+
Jenis Kelamin: {item.jk}
+
Tanggal Lahir: {item.tanggal_lahir}
+
Foto: {item.foto}
+
+
+ ))}
+
+ );
+}
\ No newline at end of file
diff --git a/routes/web.php b/routes/web.php
index 9f834ee..d532479 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -3,6 +3,7 @@
use App\Http\Controllers\ProfileController;
use Illuminate\Foundation\Application;
use Illuminate\Support\Facades\Route;
+use App\Http\Controllers\SantriController;
use Inertia\Inertia;
/*
@@ -25,6 +26,8 @@
]);
});
+Route::get('/data-santri', [SantriController::class, 'index'])->name('indexSantri');
+
Route::get('/dashboard', function () {
return Inertia::render('Dashboard');
})->middleware(['auth', 'verified'])->name('dashboard');
@@ -35,4 +38,4 @@
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});
-require __DIR__.'/auth.php';
+require __DIR__ . '/auth.php';
From 347b5ff28ed5b461b86706c3c652cf31dba7342d Mon Sep 17 00:00:00 2001
From: alealien666
Date: Tue, 4 Feb 2025 00:37:28 +0700
Subject: [PATCH 03/25] update patch
---
app/Http/Controllers/SantriController.php | 9 +--
package-lock.json | 45 ++++++++++++++
package.json | 1 +
resources/js/Components/Modal.jsx | 57 -----------------
resources/js/Components/ModalInput.jsx | 61 +++++++++++++++++++
resources/js/Layouts/main.jsx | 0
.../Pages/Profile/Partials/DeleteUserForm.jsx | 2 +-
.../Pages/list-admin/santri/IndexSantri.jsx | 33 +++++-----
routes/web.php | 1 +
tailwind.config.js | 9 ++-
10 files changed, 138 insertions(+), 80 deletions(-)
delete mode 100644 resources/js/Components/Modal.jsx
create mode 100644 resources/js/Components/ModalInput.jsx
create mode 100644 resources/js/Layouts/main.jsx
diff --git a/app/Http/Controllers/SantriController.php b/app/Http/Controllers/SantriController.php
index 0044f80..087e1b4 100644
--- a/app/Http/Controllers/SantriController.php
+++ b/app/Http/Controllers/SantriController.php
@@ -13,13 +13,10 @@ class SantriController extends Controller
*/
public function index()
{
- $santri = Santri::all(); // Ambil semua data santri
- return Inertia::render('list-admin/santri/IndexSantri', compact('santri')); // Sesuaikan path
- }
- public function create()
- {
- //
+ $santri = Santri::all();
+ return Inertia::render('list-admin/santri/IndexSantri', compact('santri'));
}
+ public function create() {}
/**
* Store a newly created resource in storage.
diff --git a/package-lock.json b/package-lock.json
index 523a5eb..9aaca92 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,6 +11,7 @@
"@vitejs/plugin-react": "^4.2.0",
"autoprefixer": "^10.4.12",
"axios": "^1.1.2",
+ "daisyui": "^4.12.23",
"laravel-vite-plugin": "^0.7.2",
"postcss": "^8.4.31",
"react": "^18.2.0",
@@ -1234,6 +1235,16 @@
"node": ">= 8"
}
},
+ "node_modules/css-selector-tokenizer": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz",
+ "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "fastparse": "^1.1.2"
+ }
+ },
"node_modules/cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -1246,6 +1257,34 @@
"node": ">=4"
}
},
+ "node_modules/culori": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz",
+ "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/daisyui": {
+ "version": "4.12.23",
+ "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.23.tgz",
+ "integrity": "sha512-EM38duvxutJ5PD65lO/AFMpcw+9qEy6XAZrTpzp7WyaPeO/l+F/Qiq0ECHHmFNcFXh5aVoALY4MGrrxtCiaQCQ==",
+ "dev": true,
+ "dependencies": {
+ "css-selector-tokenizer": "^0.8",
+ "culori": "^3",
+ "picocolors": "^1",
+ "postcss-js": "^4"
+ },
+ "engines": {
+ "node": ">=16.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/daisyui"
+ }
+ },
"node_modules/debug": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
@@ -1429,6 +1468,12 @@
"node": ">= 6"
}
},
+ "node_modules/fastparse": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
+ "dev": true
+ },
"node_modules/fastq": {
"version": "1.18.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
diff --git a/package.json b/package.json
index 96d6b61..26961d9 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,7 @@
"@vitejs/plugin-react": "^4.2.0",
"autoprefixer": "^10.4.12",
"axios": "^1.1.2",
+ "daisyui": "^4.12.23",
"laravel-vite-plugin": "^0.7.2",
"postcss": "^8.4.31",
"react": "^18.2.0",
diff --git a/resources/js/Components/Modal.jsx b/resources/js/Components/Modal.jsx
deleted file mode 100644
index cf6d39f..0000000
--- a/resources/js/Components/Modal.jsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import { Fragment } from 'react';
-import { Dialog, Transition } from '@headlessui/react';
-
-export default function Modal({ children, show = false, maxWidth = '2xl', closeable = true, onClose = () => {} }) {
- const close = () => {
- if (closeable) {
- onClose();
- }
- };
-
- const maxWidthClass = {
- sm: 'sm:max-w-sm',
- md: 'sm:max-w-md',
- lg: 'sm:max-w-lg',
- xl: 'sm:max-w-xl',
- '2xl': 'sm:max-w-2xl',
- }[maxWidth];
-
- return (
-
-
-
-
-
-
-
-
- {children}
-
-
-
-
- );
-}
diff --git a/resources/js/Components/ModalInput.jsx b/resources/js/Components/ModalInput.jsx
new file mode 100644
index 0000000..41a2a1c
--- /dev/null
+++ b/resources/js/Components/ModalInput.jsx
@@ -0,0 +1,61 @@
+import React, { useState } from "react"
+import { Inertia } from "@inertiajs/inertia"
+
+const ModalInput = () => {
+ const [status, setStatus] = useState('')
+ const [role, setRole] = useState('')
+ const [gender, setGender] = useState('')
+
+ const handleSubmit = () => {
+ const data = {
+ nama, alamat, status, role, jk, ttl
+ }
+
+ Inertia.post('/addSantri', data)
+ }
+
+ return (
+
+ )
+}
+
+export default ModalInput
\ No newline at end of file
diff --git a/resources/js/Layouts/main.jsx b/resources/js/Layouts/main.jsx
new file mode 100644
index 0000000..e69de29
diff --git a/resources/js/Pages/Profile/Partials/DeleteUserForm.jsx b/resources/js/Pages/Profile/Partials/DeleteUserForm.jsx
index 9bb0d13..0071959 100644
--- a/resources/js/Pages/Profile/Partials/DeleteUserForm.jsx
+++ b/resources/js/Pages/Profile/Partials/DeleteUserForm.jsx
@@ -2,7 +2,7 @@ import { useRef, useState } from 'react';
import DangerButton from '@/Components/DangerButton';
import InputError from '@/Components/InputError';
import InputLabel from '@/Components/InputLabel';
-import Modal from '@/Components/Modal';
+import Modal from '@/Components/ModalInput';
import SecondaryButton from '@/Components/SecondaryButton';
import TextInput from '@/Components/TextInput';
import { useForm } from '@inertiajs/react';
diff --git a/resources/js/Pages/list-admin/santri/IndexSantri.jsx b/resources/js/Pages/list-admin/santri/IndexSantri.jsx
index 6cb4812..32f4748 100644
--- a/resources/js/Pages/list-admin/santri/IndexSantri.jsx
+++ b/resources/js/Pages/list-admin/santri/IndexSantri.jsx
@@ -1,24 +1,27 @@
-import React from 'react';
-import { Head } from '@inertiajs/react';
+import React from 'react'
+import { Head } from '@inertiajs/react'
+import ModalInput from '@/Components/ModalInput'
export default function IndexSantri({ santri }) {
- console.log('Data Santri:', santri);
return (
Daftar Santri
- {santri.map((item) => (
-
-
Nama: {item.nama}
-
Alamat: {item.alamat}
-
Status: {item.status_santri}
-
Role: {item.role_santri}
-
Jenis Kelamin: {item.jk}
-
Tanggal Lahir: {item.tanggal_lahir}
-
Foto: {item.foto}
-
-
- ))}
+
+ {santri ? santri.map((item, i) => {
+ return (
+
+
Nama: {item.nama}
+
Alamat: {item.alamat}
+
Status: {item.status_santri}
+
Role: {item.role_santri}
+
Jenis Kelamin: {item.jk}
+
Tanggal Lahir: {item.tanggal_lahir}
+
Foto: {item.foto}
+
+
+ )
+ }) : ""}
);
}
\ No newline at end of file
diff --git a/routes/web.php b/routes/web.php
index d532479..3aa09bc 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -27,6 +27,7 @@
});
Route::get('/data-santri', [SantriController::class, 'index'])->name('indexSantri');
+Route::post('/addSantri', [SantriController::class, 'store'])->name('storeSantri');
Route::get('/dashboard', function () {
return Inertia::render('Dashboard');
diff --git a/tailwind.config.js b/tailwind.config.js
index 19ae3e3..f68b0e8 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -18,5 +18,12 @@ export default {
},
},
- plugins: [forms],
+ plugins: [
+ forms,
+ require('daisyui'),
+ ],
+
+ daisyui: {
+ themes: ['light']
+ }
};
From cdf4e7abac596f3ec02e6b3a5c5639b3306ba81d Mon Sep 17 00:00:00 2001
From: alealien666
Date: Fri, 7 Feb 2025 22:52:43 +0700
Subject: [PATCH 04/25] crud santri be
---
app/Http/Controllers/SantriController.php | 158 ++++++++++++++----
app/Models/Santri.php | 1 +
package-lock.json | 44 ++---
package.json | 5 +-
public/fotoSantri/1738921410_Revice.jpg | Bin 0 -> 185315 bytes
public/fotoSantri/1738921518_venom.jpg | Bin 0 -> 164251 bytes
public/fotoSantri/1738922006_venom.jpg | Bin 0 -> 164251 bytes
public/fotoSantri/1738933374_wp23.jpg | Bin 0 -> 187921 bytes
resources/js/Components/ModalInput.jsx | 140 ++++++++++------
.../Pages/list-admin/santri/IndexSantri.jsx | 4 +-
routes/web.php | 2 +-
11 files changed, 243 insertions(+), 111 deletions(-)
create mode 100644 public/fotoSantri/1738921410_Revice.jpg
create mode 100644 public/fotoSantri/1738921518_venom.jpg
create mode 100644 public/fotoSantri/1738922006_venom.jpg
create mode 100644 public/fotoSantri/1738933374_wp23.jpg
diff --git a/app/Http/Controllers/SantriController.php b/app/Http/Controllers/SantriController.php
index 087e1b4..3ad6508 100644
--- a/app/Http/Controllers/SantriController.php
+++ b/app/Http/Controllers/SantriController.php
@@ -5,56 +5,148 @@
use App\Models\Santri;
use Illuminate\Http\Request;
use Inertia\Inertia;
+use Illuminate\Support\Facades\Validator;
+use Illuminate\Support\Facades\File;
class SantriController extends Controller
{
- /**
- * Display a listing of the resource.
- */
public function index()
{
$santri = Santri::all();
- return Inertia::render('list-admin/santri/IndexSantri', compact('santri'));
+ return Inertia::render('list-admin/santri/IndexSantri', [
+ 'santri' => $santri,
+ 'fields' => [
+ 'nama' => 'text',
+ 'alamat' => 'text',
+ 'status_santri' => 'select',
+ 'role_santri' => 'select',
+ 'jk' => 'select',
+ 'tanggal_lahir' => 'date',
+ 'foto' => 'file'
+ ],
+ 'options' => [
+ 'status_santri' => ['boyong' => 'Boyong', 'aktif' => 'Aktif'],
+ 'role_santri' => ['santri' => 'Santri', 'pengurus' => 'Pengurus'],
+ 'jk' => ['laki laki' => 'Laki-Laki', 'perempuan' => 'Perempuan'],
+ ],
+ ]);
}
public function create() {}
- /**
- * Store a newly created resource in storage.
- */
public function store(Request $request)
{
- //
+ $request->validate([
+ 'nama' => 'required',
+ 'alamat' => 'required',
+ 'status_santri' => 'required',
+ 'role_santri' => 'required',
+ 'jk' => 'required',
+ 'tanggal_lahir' => 'required|date',
+ 'foto' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048'
+ ], [
+ 'nama.required' => 'wajib mengisi nama santri',
+ 'alamat.required' => 'wajib mengisi alamat santri',
+ 'status_santri.required' => 'wajib mengisi status santri',
+ 'role.required' => 'wajib mengisi role santri',
+ 'gender.required' => 'wajib mengisi gender',
+ 'ttl.required' => 'wajib mengisi tanggal lahir santri',
+ 'ttl.date' => 'tanggal lahir harus dalam format tanggal yang benar',
+ ]);
+
+ $fotoPath = null;
+
+ if ($request->hasFile('foto')) {
+ $foto = $request->file('foto');
+ $fotoName = time() . '_' . $foto->getClientOriginalName();
+ $foto->move(public_path('fotoSantri'), $fotoName);
+
+ $fotoPath = 'fotoSantri/' . $fotoName;
+ }
+
+ try {
+ $santri = Santri::create([
+ 'nama' => $request->nama,
+ 'alamat' => $request->alamat,
+ 'status_santri' => $request->status_santri,
+ 'role_santri' => $request->role_santri,
+ 'jk' => $request->jk,
+ 'tanggal_lahir' => $request->tanggal_lahir,
+ 'foto' => $fotoPath
+ ]);
+ // dd($santri);
+
+ return redirect()->back()->with('success', 'Data berhasil ditambahkan');
+ } catch (\Throwable $th) {
+ // dd($th->getMessage());
+ return redirect()->back()->with('error', 'Data gagal ditambahkan : ' . $th->getMessage());
+ }
}
- /**
- * Display the specified resource.
- */
- public function show(Santri $santri)
+ public function update(Request $request, Santri $santri, $id)
{
- //
+ $request->validate(
+ [
+ 'nama' => 'required',
+ 'alamat' => 'required',
+ 'status_santri' => 'required',
+ 'role_santri' => 'required',
+ 'jk' => 'required',
+ 'tanggal_lahir' => 'required',
+ 'foto' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048'
+ ],
+ [
+ 'nama.required' => 'nama santri wajib di isi',
+ 'alamat.required' => 'alamat santri wajib di isi',
+ 'status_santri.required' => 'wajib memilih status santri',
+ 'role_santri.required' => 'wajib memilih role santri',
+ 'jk.required' => 'wajib memilih jenis kelamin santri',
+ 'tanggal_lahir.required' => 'wajib mengisi tanggal lahir santri'
+ ]
+ );
+
+ $fotoPath = null;
+
+ if ($request->has('foto')) {
+ $foto = $request->file('foto');
+ $fotoName = time() . '_' . $foto->getClientOriginalName();
+
+ $foto->move(public_path('fotoSantri/'), $fotoName);
+ $fotoPath = 'fotoSantri/' . $fotoName;
+ }
+
+ $santri = Santri::findOrFail($id);
+
+ try {
+ if ($request->file('foto') == '') {
+ $santri->nama = $request->nama;
+ $santri->alamat = $request->alamat;
+ $santri->status_santri = $request->status_santri;
+ $santri->role_santri = $request->role_santri;
+ $santri->jk = $request->jk;
+ $santri->tanggal_lahir = $request->tanggal_lahir;
+ } else {
+ File::delete('fotoSantri/' . basename($santri->foto));
+ $santri->foto = $fotoPath;
+ $santri->nama = $request->nama;
+ $santri->alamat = $request->alamat;
+ $santri->status_santri = $request->status_santri;
+ $santri->role_santri = $request->role_santri;
+ $santri->jk = $request->jk;
+ $santri->tanggal_lahir = $request->tanggal_lahir;
+ }
+
+ return redirect()->back()->with('success', 'Data Berhasil Di Ubah');
+ } catch (\Throwable $th) {
+ return redirect()->back()->with('error', 'Gagal' . $th->getMessage());
+ }
}
- /**
- * Show the form for editing the specified resource.
- */
- public function edit(Santri $santri)
+ public function destroy(Santri $santri, $id)
{
- //
- }
+ $santri = Santri::findOrFail($id);
- /**
- * Update the specified resource in storage.
- */
- public function update(Request $request, Santri $santri)
- {
- //
- }
-
- /**
- * Remove the specified resource from storage.
- */
- public function destroy(Santri $santri)
- {
- //
+ $santri->delete();
+ File::delete('fotoSantri/' . basename($santri->foto));
+ return redirect()->back()->with('success', 'data berhasil di hapus');
}
}
diff --git a/app/Models/Santri.php b/app/Models/Santri.php
index 2f5ee58..20282ad 100644
--- a/app/Models/Santri.php
+++ b/app/Models/Santri.php
@@ -10,6 +10,7 @@ class Santri extends Model
use HasFactory;
protected $guarded = ['id'];
+ protected $table = 'santris';
public function user()
{
diff --git a/package-lock.json b/package-lock.json
index 9aaca92..f65c348 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4,9 +4,12 @@
"requires": true,
"packages": {
"": {
+ "dependencies": {
+ "@inertiajs/inertia": "^0.11.1"
+ },
"devDependencies": {
"@headlessui/react": "^1.4.2",
- "@inertiajs/react": "^1.0.0",
+ "@inertiajs/react": "^1.3.0",
"@tailwindcss/forms": "^0.5.3",
"@vitejs/plugin-react": "^4.2.0",
"autoprefixer": "^10.4.12",
@@ -680,6 +683,24 @@
"qs": "^6.9.0"
}
},
+ "node_modules/@inertiajs/inertia": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/@inertiajs/inertia/-/inertia-0.11.1.tgz",
+ "integrity": "sha512-btmV53c54oW4Z9XF0YyTdIUnM7ue0ONy3/KJOz6J1C5CYIwimiKfDMpz8ZbGJuxS+SPdOlNsqj2ZhlHslpJRZg==",
+ "dependencies": {
+ "axios": "^0.21.1",
+ "deepmerge": "^4.0.0",
+ "qs": "^6.9.0"
+ }
+ },
+ "node_modules/@inertiajs/inertia/node_modules/axios": {
+ "version": "0.21.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+ "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+ "dependencies": {
+ "follow-redirects": "^1.14.0"
+ }
+ },
"node_modules/@inertiajs/react": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@inertiajs/react/-/react-1.3.0.tgz",
@@ -1080,7 +1101,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
"integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
- "dev": true,
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
@@ -1093,7 +1113,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
"integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
- "dev": true,
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"get-intrinsic": "^1.2.6"
@@ -1306,7 +1325,6 @@
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -1336,7 +1354,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "dev": true,
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
@@ -1368,7 +1385,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "dev": true,
"engines": {
"node": ">= 0.4"
}
@@ -1377,7 +1393,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
"engines": {
"node": ">= 0.4"
}
@@ -1386,7 +1401,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "dev": true,
"dependencies": {
"es-errors": "^1.3.0"
},
@@ -1499,7 +1513,6 @@
"version": "1.15.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
- "dev": true,
"funding": [
{
"type": "individual",
@@ -1576,7 +1589,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -1594,7 +1606,6 @@
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
"integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
- "dev": true,
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-define-property": "^1.0.1",
@@ -1618,7 +1629,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "dev": true,
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
@@ -1672,7 +1682,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "dev": true,
"engines": {
"node": ">= 0.4"
},
@@ -1684,7 +1693,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
- "dev": true,
"engines": {
"node": ">= 0.4"
},
@@ -1696,7 +1704,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dev": true,
"dependencies": {
"function-bind": "^1.1.2"
},
@@ -1896,7 +1903,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "dev": true,
"engines": {
"node": ">= 0.4"
}
@@ -2064,7 +2070,6 @@
"version": "1.13.3",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
"integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
- "dev": true,
"engines": {
"node": ">= 0.4"
},
@@ -2304,7 +2309,6 @@
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
"integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
- "dev": true,
"dependencies": {
"side-channel": "^1.1.0"
},
@@ -2502,7 +2506,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
"integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
- "dev": true,
"dependencies": {
"es-errors": "^1.3.0",
"object-inspect": "^1.13.3",
@@ -2521,7 +2524,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
"integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
- "dev": true,
"dependencies": {
"es-errors": "^1.3.0",
"object-inspect": "^1.13.3"
@@ -2537,7 +2539,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
"integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
- "dev": true,
"dependencies": {
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
@@ -2555,7 +2556,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
"integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
- "dev": true,
"dependencies": {
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
diff --git a/package.json b/package.json
index 26961d9..ab4f2c7 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
},
"devDependencies": {
"@headlessui/react": "^1.4.2",
- "@inertiajs/react": "^1.0.0",
+ "@inertiajs/react": "^1.3.0",
"@tailwindcss/forms": "^0.5.3",
"@vitejs/plugin-react": "^4.2.0",
"autoprefixer": "^10.4.12",
@@ -18,5 +18,8 @@
"react-dom": "^18.2.0",
"tailwindcss": "^3.2.1",
"vite": "^4.0.0"
+ },
+ "dependencies": {
+ "@inertiajs/inertia": "^0.11.1"
}
}
diff --git a/public/fotoSantri/1738921410_Revice.jpg b/public/fotoSantri/1738921410_Revice.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..3a75c951290e7d769160a7edbada97c03746b842
GIT binary patch
literal 185315
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