From d7c85af8a7d901f4230b078bc05050c975d26a13 Mon Sep 17 00:00:00 2001 From: Lucio314 Date: Tue, 23 Apr 2024 23:45:36 +0100 Subject: [PATCH] morino --- .../Auth/AuthenticatedSessionController.php | 47 + .../Auth/ConfirmablePasswordController.php | 40 + ...mailVerificationNotificationController.php | 24 + .../EmailVerificationPromptController.php | 21 + .../Auth/NewPasswordController.php | 61 + .../Controllers/Auth/PasswordController.php | 29 + .../Auth/PasswordResetLinkController.php | 44 + .../Auth/RegisteredUserController.php | 50 + .../Auth/VerifyEmailController.php | 27 + .../Controllers/EmploiDuTempsController.php | 26 +- app/Http/Controllers/EtudiantController.php | 84 +- app/Http/Controllers/FiliereController.php | 19 +- .../Controllers/InscriptionController.php | 89 +- app/Http/Controllers/ProfileController.php | 60 + app/Http/Requests/Auth/LoginRequest.php | 85 + app/Http/Requests/ProfileUpdateRequest.php | 23 + app/Models/Composition.php | 2 +- ...{Emploi_du_temps.php => EmploiDuTemps.php} | 7 +- app/Models/Epreuve.php | 1 - app/Models/Etudiant.php | 38 +- app/Models/Etudiant_Parent.php | 13 +- app/Models/Filiere.php | 7 +- app/Models/Inscription.php | 1 - app/Models/Matiere.php | 1 - app/Models/Professeur.php | 17 +- app/Models/User.php | 3 +- app/View/Components/AppLayout.php | 17 + app/View/Components/GuestLayout.php | 17 + composer.json | 2 + composer.lock | 137 +- .../0001_01_01_000000_create_users_table.php | 2 +- ...024_03_18_072821_create_filieres_table.php | 3 +- ..._082800_create_etudiant__parents_table.php | 7 +- ...024_03_18_082948_create_epreuves_table.php | 8 +- ...24_03_18_092831_create_etudiants_table.php | 12 +- ...03_18_092835_create_inscriptions_table.php | 12 +- ...03_18_093051_create_compositions_table.php | 18 +- ...25_083416_create_emploi_du_temps_table.php | 6 +- database/seeders/CompositionSeeder.php | 28 + database/seeders/DatabaseSeeder copy.php | 36 + database/seeders/DatabaseSeeder.php | 19 +- database/seeders/EmploiDuTempsSeeder.php | 36 + database/seeders/EpreuveSeeder.php | 36 + database/seeders/EtudiantParentSeeder.php | 29 + database/seeders/EtudiantSeeder.php | 25 + database/seeders/FiliereSeeder.php | 39 + database/seeders/InscriptionSeeder.php | 31 + database/seeders/MatiereSeeder.php | 28 + database/seeders/ProfesseurSeeder.php | 26 + database/seeders/UserSeeder.php | 39 + package-lock.json | 2431 +++++++++++++++++ package.json | 5 + postcss.config.js | 6 + public/images/2.png | Bin 0 -> 37255 bytes public/images/contacter/actif.png | Bin 0 -> 779 bytes .../contacter/ajout-dutilisateur (1).png | Bin 0 -> 1293 bytes .../contacter/ajout-dutilisateur (3).png | Bin 0 -> 1502 bytes .../images/contacter/ajout-dutilisateur.png | Bin 0 -> 643 bytes public/images/cours/actif.png | Bin 0 -> 840 bytes public/images/cours/copie-du-livre (1).png | Bin 0 -> 827 bytes public/images/cours/copie-du-livre (2).png | Bin 0 -> 472 bytes public/images/cours/copie-du-livre (3).png | Bin 0 -> 821 bytes public/images/cours/copie-du-livre.png | Bin 0 -> 475 bytes public/images/cours/livres (1).png | Bin 0 -> 1570 bytes public/images/cours/livres (2).png | Bin 0 -> 795 bytes public/images/emploi_du_temps/actif.png | Bin 0 -> 521 bytes .../emploi_du_temps/badge-didentite (1).png | Bin 0 -> 761 bytes .../emploi_du_temps/badge-didentite (3).png | Bin 0 -> 846 bytes .../emploi_du_temps/badge-didentite.png | Bin 0 -> 458 bytes .../etudiant/utilisateur-diplome (1).png | Bin 0 -> 1449 bytes .../etudiant/utilisateur-diplome (2).png | Bin 0 -> 940 bytes .../etudiant/utilisateur-diplome (3).png | Bin 0 -> 1782 bytes .../images/etudiant/utilisateur-diplome.png | Bin 0 -> 720 bytes public/images/liste_etudiants/actif.png | Bin 0 -> 1019 bytes public/images/liste_etudiants/normal.png | Bin 0 -> 1287 bytes public/images/memos/remarque-medicale (1).png | Bin 0 -> 1019 bytes public/images/memos/remarque-medicale (2).png | Bin 0 -> 626 bytes public/images/memos/remarque-medicale (3).png | Bin 0 -> 1114 bytes public/images/memos/remarque-medicale.png | Bin 0 -> 570 bytes public/images/study.png | Bin 0 -> 9392 bytes public/images/utilisateur/utilisateur (1).png | Bin 0 -> 1115 bytes public/images/utilisateur/utilisateur (2).png | Bin 0 -> 644 bytes public/images/utilisateur/utilisateur (3).png | Bin 0 -> 1281 bytes public/images/utilisateur/utilisateur.png | Bin 0 -> 526 bytes public/index.php | 1 + resources/css/app.css | 3 + resources/css/style.css | 91 + resources/js/app.js | 6 + .../views/auth/confirm-password.blade.php | 27 + .../views/auth/forgot-password.blade.php | 25 + resources/views/auth/login.blade.php | 47 + resources/views/auth/register.blade.php | 52 + resources/views/auth/reset-password.blade.php | 39 + resources/views/auth/verify-email.blade.php | 31 + .../components/application-logo.blade.php | 3 + .../components/auth-session-status.blade.php | 7 + .../views/components/danger-button.blade.php | 3 + .../views/components/dropdown-link.blade.php | 1 + resources/views/components/dropdown.blade.php | 43 + .../views/components/input-error.blade.php | 9 + .../views/components/input-label.blade.php | 5 + resources/views/components/modal.blade.php | 78 + resources/views/components/nav-link.blade.php | 11 + .../views/components/primary-button.blade.php | 3 + .../components/responsive-nav-link.blade.php | 11 + .../components/secondary-button.blade.php | 3 + .../views/components/text-input.blade.php | 3 + resources/views/dashboard.blade.php | 17 + resources/views/etudiants/create.blade.php | 44 + resources/views/etudiants/details.blade.php | 88 + resources/views/etudiants/edit.blade.php | 41 + resources/views/etudiants/index.blade.php | 117 + resources/views/etudiants/show.blade.php | 27 + resources/views/inscriptions/create.blade.php | 38 + resources/views/layouts/app.blade.php | 36 + resources/views/layouts/base.blade.php | 40 + resources/views/layouts/form.blade.php | 57 + resources/views/layouts/guest.blade.php | 30 + resources/views/layouts/navbar.blade.php | 41 + resources/views/layouts/navigation.blade.php | 111 + resources/views/profile/edit.blade.php | 29 + .../partials/delete-user-form.blade.php | 55 + .../partials/update-password-form.blade.php | 48 + .../update-profile-information-form.blade.php | 64 + resources/views/tests/emploicreate.blade.php | 7 +- resources/views/tests/emploidutemps.blade.php | 39 +- resources/views/tests/emploiedit.blade.php | 7 +- resources/views/tests/filierecreate.blade.php | 7 +- resources/views/tests/filieres.blade.php | 9 +- routes/auth.php | 59 + routes/web.php | 24 +- tailwind.config.js | 21 + tests/Feature/Auth/AuthenticationTest.php | 54 + tests/Feature/Auth/EmailVerificationTest.php | 64 + .../Feature/Auth/PasswordConfirmationTest.php | 44 + tests/Feature/Auth/PasswordResetTest.php | 73 + tests/Feature/Auth/PasswordUpdateTest.php | 51 + tests/Feature/Auth/RegistrationTest.php | 31 + tests/Feature/ProfileTest.php | 99 + vite.config.js | 6 +- 140 files changed, 5715 insertions(+), 139 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/Requests/Auth/LoginRequest.php create mode 100644 app/Http/Requests/ProfileUpdateRequest.php rename app/Models/{Emploi_du_temps.php => EmploiDuTemps.php} (86%) create mode 100644 app/View/Components/AppLayout.php create mode 100644 app/View/Components/GuestLayout.php create mode 100644 database/seeders/CompositionSeeder.php create mode 100644 database/seeders/DatabaseSeeder copy.php create mode 100644 database/seeders/EmploiDuTempsSeeder.php create mode 100644 database/seeders/EpreuveSeeder.php create mode 100644 database/seeders/EtudiantParentSeeder.php create mode 100644 database/seeders/EtudiantSeeder.php create mode 100644 database/seeders/FiliereSeeder.php create mode 100644 database/seeders/InscriptionSeeder.php create mode 100644 database/seeders/MatiereSeeder.php create mode 100644 database/seeders/ProfesseurSeeder.php create mode 100644 database/seeders/UserSeeder.php create mode 100644 package-lock.json create mode 100644 postcss.config.js create mode 100644 public/images/2.png create mode 100644 public/images/contacter/actif.png create mode 100644 public/images/contacter/ajout-dutilisateur (1).png create mode 100644 public/images/contacter/ajout-dutilisateur (3).png create mode 100644 public/images/contacter/ajout-dutilisateur.png create mode 100644 public/images/cours/actif.png create mode 100644 public/images/cours/copie-du-livre (1).png create mode 100644 public/images/cours/copie-du-livre (2).png create mode 100644 public/images/cours/copie-du-livre (3).png create mode 100644 public/images/cours/copie-du-livre.png create mode 100644 public/images/cours/livres (1).png create mode 100644 public/images/cours/livres (2).png create mode 100644 public/images/emploi_du_temps/actif.png create mode 100644 public/images/emploi_du_temps/badge-didentite (1).png create mode 100644 public/images/emploi_du_temps/badge-didentite (3).png create mode 100644 public/images/emploi_du_temps/badge-didentite.png create mode 100644 public/images/etudiant/utilisateur-diplome (1).png create mode 100644 public/images/etudiant/utilisateur-diplome (2).png create mode 100644 public/images/etudiant/utilisateur-diplome (3).png create mode 100644 public/images/etudiant/utilisateur-diplome.png create mode 100644 public/images/liste_etudiants/actif.png create mode 100644 public/images/liste_etudiants/normal.png create mode 100644 public/images/memos/remarque-medicale (1).png create mode 100644 public/images/memos/remarque-medicale (2).png create mode 100644 public/images/memos/remarque-medicale (3).png create mode 100644 public/images/memos/remarque-medicale.png create mode 100644 public/images/study.png create mode 100644 public/images/utilisateur/utilisateur (1).png create mode 100644 public/images/utilisateur/utilisateur (2).png create mode 100644 public/images/utilisateur/utilisateur (3).png create mode 100644 public/images/utilisateur/utilisateur.png create mode 100644 resources/css/style.css create mode 100644 resources/views/auth/confirm-password.blade.php create mode 100644 resources/views/auth/forgot-password.blade.php create mode 100644 resources/views/auth/login.blade.php create mode 100644 resources/views/auth/register.blade.php create mode 100644 resources/views/auth/reset-password.blade.php create mode 100644 resources/views/auth/verify-email.blade.php create mode 100644 resources/views/components/application-logo.blade.php create mode 100644 resources/views/components/auth-session-status.blade.php create mode 100644 resources/views/components/danger-button.blade.php create mode 100644 resources/views/components/dropdown-link.blade.php create mode 100644 resources/views/components/dropdown.blade.php create mode 100644 resources/views/components/input-error.blade.php create mode 100644 resources/views/components/input-label.blade.php create mode 100644 resources/views/components/modal.blade.php create mode 100644 resources/views/components/nav-link.blade.php create mode 100644 resources/views/components/primary-button.blade.php create mode 100644 resources/views/components/responsive-nav-link.blade.php create mode 100644 resources/views/components/secondary-button.blade.php create mode 100644 resources/views/components/text-input.blade.php create mode 100644 resources/views/dashboard.blade.php create mode 100644 resources/views/etudiants/create.blade.php create mode 100644 resources/views/etudiants/details.blade.php create mode 100644 resources/views/etudiants/edit.blade.php create mode 100644 resources/views/etudiants/index.blade.php create mode 100644 resources/views/etudiants/show.blade.php create mode 100644 resources/views/inscriptions/create.blade.php create mode 100644 resources/views/layouts/app.blade.php create mode 100644 resources/views/layouts/base.blade.php create mode 100644 resources/views/layouts/form.blade.php create mode 100644 resources/views/layouts/guest.blade.php create mode 100644 resources/views/layouts/navbar.blade.php create mode 100644 resources/views/layouts/navigation.blade.php create mode 100644 resources/views/profile/edit.blade.php create mode 100644 resources/views/profile/partials/delete-user-form.blade.php create mode 100644 resources/views/profile/partials/update-password-form.blade.php create mode 100644 resources/views/profile/partials/update-profile-information-form.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..613bcd9 --- /dev/null +++ b/app/Http/Controllers/Auth/AuthenticatedSessionController.php @@ -0,0 +1,47 @@ +authenticate(); + + $request->session()->regenerate(); + + return redirect()->intended(route('dashboard', absolute: false)); + } + + /** + * 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..712394a --- /dev/null +++ b/app/Http/Controllers/Auth/ConfirmablePasswordController.php @@ -0,0 +1,40 @@ +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(route('dashboard', absolute: false)); + } +} diff --git a/app/Http/Controllers/Auth/EmailVerificationNotificationController.php b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php new file mode 100644 index 0000000..f64fa9b --- /dev/null +++ b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php @@ -0,0 +1,24 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(route('dashboard', absolute: false)); + } + + $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..ee3cb6f --- /dev/null +++ b/app/Http/Controllers/Auth/EmailVerificationPromptController.php @@ -0,0 +1,21 @@ +user()->hasVerifiedEmail() + ? redirect()->intended(route('dashboard', absolute: false)) + : view('auth.verify-email'); + } +} diff --git a/app/Http/Controllers/Auth/NewPasswordController.php b/app/Http/Controllers/Auth/NewPasswordController.php new file mode 100644 index 0000000..f1e2814 --- /dev/null +++ b/app/Http/Controllers/Auth/NewPasswordController.php @@ -0,0 +1,61 @@ + $request]); + } + + /** + * 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. + return $status == Password::PASSWORD_RESET + ? redirect()->route('login')->with('status', __($status)) + : back()->withInput($request->only('email')) + ->withErrors(['email' => __($status)]); + } +} diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php new file mode 100644 index 0000000..6916409 --- /dev/null +++ b/app/Http/Controllers/Auth/PasswordController.php @@ -0,0 +1,29 @@ +validateWithBag('updatePassword', [ + 'current_password' => ['required', 'current_password'], + 'password' => ['required', Password::defaults(), 'confirmed'], + ]); + + $request->user()->update([ + 'password' => Hash::make($validated['password']), + ]); + + return back()->with('status', 'password-updated'); + } +} diff --git a/app/Http/Controllers/Auth/PasswordResetLinkController.php b/app/Http/Controllers/Auth/PasswordResetLinkController.php new file mode 100644 index 0000000..ce813a6 --- /dev/null +++ b/app/Http/Controllers/Auth/PasswordResetLinkController.php @@ -0,0 +1,44 @@ +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') + ); + + return $status == Password::RESET_LINK_SENT + ? back()->with('status', __($status)) + : back()->withInput($request->only('email')) + ->withErrors(['email' => __($status)]); + } +} diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php new file mode 100644 index 0000000..0739e2e --- /dev/null +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -0,0 +1,50 @@ +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(route('dashboard', absolute: false)); + } +} diff --git a/app/Http/Controllers/Auth/VerifyEmailController.php b/app/Http/Controllers/Auth/VerifyEmailController.php new file mode 100644 index 0000000..784765e --- /dev/null +++ b/app/Http/Controllers/Auth/VerifyEmailController.php @@ -0,0 +1,27 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); + } + + if ($request->user()->markEmailAsVerified()) { + event(new Verified($request->user())); + } + + return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); + } +} diff --git a/app/Http/Controllers/EmploiDuTempsController.php b/app/Http/Controllers/EmploiDuTempsController.php index 1cbb964..f6c245d 100644 --- a/app/Http/Controllers/EmploiDuTempsController.php +++ b/app/Http/Controllers/EmploiDuTempsController.php @@ -1,8 +1,9 @@ 'nullable|string|max:255', 'vendredi_soir' => 'nullable|string|max:255', 'samedi_matin' => 'nullable|string|max:255', - 'codFil'=> 'required|string', + 'codFil' => 'required|string', // Ajoutez d'autres règles de validation au besoin ]); - + // Créer un nouvel emploi du temps - Emploi_du_temps::create($request->all()); - + EmploiDuTemps::create($request->all()); + // Rediriger vers la page d'index des emplois du temps avec un message de succès - return redirect()->route('emplois.show',['filiereId' => $filiereId])->with('success', 'Emploi du temps créé avec succès.'); + return redirect()->route('emplois.show', ['filiereId' => $filiereId])->with('success', 'Emploi du temps créé avec succès.'); } - + // Afficher le formulaire d'édition d'un emploi du temps public function edit($emploiId) { - $emploiDuTemps = Emploi_du_temps::findOrFail($emploiId); + $emploiDuTemps = EmploiDuTemps::findOrFail($emploiId); return view('tests/emploiedit', compact('emploiDuTemps',)); } @@ -95,21 +96,20 @@ public function update(Request $request, $emploiId) ]); // Trouver l'emploi du temps à mettre à jour - $emploiDuTemps = Emploi_du_temps::findOrFail($emploiId); - $filiere = $emploiDuTemps->filiere(); + $emploiDuTemps = EmploiDuTemps::findOrFail($emploiId); // Mettre à jour les données de l'emploi du temps $emploiDuTemps->update($request->all()); // Rediriger vers la page d'index des emplois du temps avec un message de succès - return redirect()->route('emplois.show',['filiereId' => $filiere->id])->with('success', 'Emploi du temps mis à jour avec succès.'); + return redirect()->route('emplois.show', ['filiereId' => $emploiDuTemps->codFil])->with('success', 'Emploi du temps mis à jour avec succès.'); } // Supprimer un emploi du temps public function destroy($id) { // Trouver l'emploi du temps à supprimer - $emploiDuTemps = Emploi_du_temps::findOrFail($id); + $emploiDuTemps = EmploiDuTemps::findOrFail($id); // Supprimer l'emploi du temps $emploiDuTemps->delete(); diff --git a/app/Http/Controllers/EtudiantController.php b/app/Http/Controllers/EtudiantController.php index 941dbca..fd248bb 100644 --- a/app/Http/Controllers/EtudiantController.php +++ b/app/Http/Controllers/EtudiantController.php @@ -2,9 +2,91 @@ namespace App\Http\Controllers; +use App\Models\Etudiant; +use App\Models\Inscription; use Illuminate\Http\Request; class EtudiantController extends Controller { - // + + + public function index(Request $request) + { + $query = $request->input('query'); + + $etudiants = Etudiant::where('prenom', 'like', "%$query%") + ->orWhere('nom', 'like', "%$query%") + ->orWhere('matricule', 'like', "%$query%") + ->get(); + return view('etudiants.index', compact('etudiants')); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + $etudiant = new Etudiant(); + return view('etudiants.create', [ + "etudiant" => $etudiant + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + Etudiant::create($request->all()); + return redirect()->route('etudiants.index')->with('success', 'Étudiant ajouté avec succès.'); + } + + /** + * Display the specified resource. + */ + public function show(Etudiant $etudiant) + { + + return view('etudiants.show', compact('etudiant')); + } + public function showDetails($matricule) + { + // Récupérer l'inscription de l'étudiant avec le matricule fourni et charger les relations associées + $inscription = Inscription::where('matricule', $matricule) + ->with(['etudiant', 'compositions', 'filiere']) + ->firstOrFail(); + + // dd($inscription); + // Retourner la vue avec les détails de l'étudiant + $jours = ['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi']; + return view('etudiants.details', ['inscription' => $inscription, 'jours' => $jours]); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(Etudiant $etudiant) + { + + return view('etudiants.edit', compact('etudiant')); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, Etudiant $etudiant) + { + + $etudiant->update($request->all()); + return redirect()->route('etudiants.index')->with('success', 'Étudiant mis à jour avec succès.'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(Etudiant $etudiant) + { + $etudiant->delete(); + return redirect()->route('etudiants.index')->with('success', 'Étudiant supprimé avec succès.'); + } } diff --git a/app/Http/Controllers/FiliereController.php b/app/Http/Controllers/FiliereController.php index b53913f..4bc5219 100644 --- a/app/Http/Controllers/FiliereController.php +++ b/app/Http/Controllers/FiliereController.php @@ -19,7 +19,7 @@ public function show($filiereId) $filiere = Filiere::find($filiereId); $emploiDuTemps = $filiere->emploieDuTemps(); $emploisActif = $emploiDuTemps->latest()->first(); - return view('tests/emploidutemps', compact('emploisActif','filiere')); + return view('tests/emploidutemps', compact('emploisActif', 'filiere')); } // Afficher le formulaire de création d'un nouvel emploi du temps @@ -31,26 +31,28 @@ public function create() // Enregistrer un nouvel emploi du temps public function store(Request $request) { + // Valider les données du formulaire - $request->validate([ + $validated = $request->validate([ 'codFil' => 'string|required', 'libFil' => 'string|required' // Ajoutez d'autres règles de validation au besoin ]); + $filieres = Filiere::all(); foreach ($filieres as $filiere) { - if ($filiere->codFil == $request->all()['codFil']) { + if ($filiere->codFil == $validated['codFil']) { return redirect()->route('filiere.create')->with('info', 'Ce code est deja applique a une filiere.'); } } // Créer un nouvel emploi du temps - Filiere::create($request->all()); - + Filiere::create($validated); + // Rediriger vers la page d'index des emplois du temps avec un message de succès return redirect()->route('filiere')->with('success', 'Filiere créé avec succès.'); } - + // Afficher le formulaire d'édition d'un emploi du temps public function edit($emploiId) @@ -90,7 +92,7 @@ public function update(Request $request, $emploiId) $emploiDuTemps->update($request->all()); // Rediriger vers la page d'index des emplois du temps avec un message de succès - return redirect()->route('emplois.show',['filiereId' => $emploiDuTemps->codFil])->with('success', 'Emploi du temps mis à jour avec succès.'); + return redirect()->route('emplois.show', ['filiereId' => $emploiDuTemps->codFil])->with('success', 'Emploi du temps mis à jour avec succès.'); } // Supprimer un emploi du temps @@ -104,4 +106,5 @@ public function destroy($id) // Rediriger vers la page d'index des emplois du temps avec un message de succès return redirect()->route('home')->with('success', 'Emploi du temps supprimé avec succès.'); - }} + } +} diff --git a/app/Http/Controllers/InscriptionController.php b/app/Http/Controllers/InscriptionController.php index f7f9f9f..f913ae1 100644 --- a/app/Http/Controllers/InscriptionController.php +++ b/app/Http/Controllers/InscriptionController.php @@ -2,9 +2,96 @@ namespace App\Http\Controllers; +use App\Models\Inscription; +use App\Models\Etudiant; +use App\Models\Filiere; use Illuminate\Http\Request; class InscriptionController extends Controller { - // + /** + * Affiche le formulaire d'inscription. + */ + public function create() + { + // Récupérer la liste des filières + $filieres = Filiere::all(); + + // Récupérer les étudiants non inscrits dans une filière et pendant l'année en cours + $etudiantsNonInscrits = $this->getEtudiantsNonInscrits(); + + // Afficher le formulaire d'inscription avec les étudiants non inscrits et les filières + return view('inscriptions.create', [ + 'etudiants' => $etudiantsNonInscrits, + 'filieres' => $filieres, + ]); + } + + /** + * Gère l'inscription d'un ou plusieurs étudiants dans une filière. + */ + public function store(Request $request) + { + // Valider les données du formulaire + $request->validate([ + 'etudiants' => 'required|array', + 'etudiants.*' => 'exists:etudiants,matricule', + 'filiere' => 'required|exists:filieres,codFil', + ]); + + // Récupérer la filière sélectionnée + $codeFil = $request->input('filiere'); + + // Récupérer la liste des étudiants sélectionnés + $etudiantMatricules = $request->input('etudiants'); + + // L'année d'inscription (supposons que l'année actuelle est utilisée pour l'exemple) + $anneeInscription = now()->year; + + // Parcourir chaque étudiant sélectionné et créer une inscription si elle n'existe pas déjà + foreach ($etudiantMatricules as $matricule) { + // Vérifier si l'étudiant est déjà inscrit dans la même filière et année + $existingInscription = Inscription::where('matricule', $matricule) + ->where('codFil', $codeFil) + ->whereYear('dateIns', $anneeInscription) + ->first(); + + // S'il n'existe pas déjà d'inscription pour cet étudiant, filière et année, créer une nouvelle inscription + if (!$existingInscription) { + $inscription = new Inscription(); + $inscription->matricule = $matricule; + $inscription->codFil = $codeFil; + $inscription->dateIns = now(); // Date d'inscription actuelle + $inscription->annee = now()->year; // + $inscription->user_id = auth()->user()->id; // Utilisateur actuellement connecté + $inscription->save(); + } + } + + // Rediriger avec un message de succès + return redirect()->route('inscriptions.create')->with('success', 'Inscriptions réussies!'); + } + + /** + * Récupère les étudiants qui ne sont pas encore inscrits dans une filière pendant l'année en cours. + */ + private function getEtudiantsNonInscrits() + { + $anneeInscription = now()->year; + + // Obtenir tous les étudiants + $etudiants = Etudiant::all(); + + // Filtrer les étudiants qui ne sont pas encore inscrits dans une filière pendant l'année en cours + $etudiantsNonInscrits = $etudiants->filter(function ($etudiant) use ($anneeInscription) { + $inscriptions = Inscription::where('matricule', $etudiant->matricule) + ->whereYear('dateIns', $anneeInscription) + ->count(); + + // Si l'étudiant n'a aucune inscription pour l'année en cours, le conserver + return $inscriptions === 0; + }); + + return $etudiantsNonInscrits; + } } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php new file mode 100644 index 0000000..a48eb8d --- /dev/null +++ b/app/Http/Controllers/ProfileController.php @@ -0,0 +1,60 @@ + $request->user(), + ]); + } + + /** + * 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')->with('status', 'profile-updated'); + } + + /** + * Delete the user's account. + */ + public function destroy(Request $request): RedirectResponse + { + $request->validateWithBag('userDeletion', [ + '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/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/Models/Composition.php b/app/Models/Composition.php index 0c4a610..302f842 100644 --- a/app/Models/Composition.php +++ b/app/Models/Composition.php @@ -43,7 +43,7 @@ public function etudiantsAyantComposer() return $this->belongsTo(Inscription::class, 'numIns', 'numIns'); } - public function epreuves() + public function epreuve() { return $this->belongsTo(Epreuve::class, 'numEp', 'numEp'); } diff --git a/app/Models/Emploi_du_temps.php b/app/Models/EmploiDuTemps.php similarity index 86% rename from app/Models/Emploi_du_temps.php rename to app/Models/EmploiDuTemps.php index d4e0f19..4536878 100644 --- a/app/Models/Emploi_du_temps.php +++ b/app/Models/EmploiDuTemps.php @@ -4,7 +4,7 @@ use Illuminate\Database\Eloquent\Model; -class Emploi_du_temps extends Model +class EmploiDuTemps extends Model { /** * The table associated with the model. @@ -19,8 +19,6 @@ class Emploi_du_temps extends Model * @var string */ protected $primaryKey = 'numEmploi'; - public $timestamps = true; - public $incrementing = true; /** * The attributes that are mass assignable. @@ -34,8 +32,7 @@ class Emploi_du_temps extends Model 'mercredi_matin', 'mercredi_aprem', 'mercredi_soir', 'jeudi_matin', 'jeudi_aprem', 'jeudi_soir', 'vendredi_matin', 'vendredi_aprem', 'vendredi_soir', - 'samedi_matin', - 'codFil' + 'samedi_matin', 'codFil' ]; /** diff --git a/app/Models/Epreuve.php b/app/Models/Epreuve.php index bc11f99..10548ff 100644 --- a/app/Models/Epreuve.php +++ b/app/Models/Epreuve.php @@ -14,7 +14,6 @@ class Epreuve extends Model protected $primaryKey = 'numEp'; // Clé primaire de la table public $incrementing = true; // Indique si la clé primaire est un nombre auto-incrémenté - public $timestamps = true; protected $fillable = [ 'dateEp', diff --git a/app/Models/Etudiant.php b/app/Models/Etudiant.php index 4dfcb67..df08d65 100644 --- a/app/Models/Etudiant.php +++ b/app/Models/Etudiant.php @@ -12,24 +12,42 @@ class Etudiant extends Model protected $table = 'etudiants'; // Nom de la table dans la base de données protected $primaryKey = 'matricule'; // Clé primaire de la table - public $timestamps = true; - public $incrementing = true; // Indique si la clé primaire est un nombre auto-incrémenté + public $incrementing = false; // Indique que la clé primaire n'est pas auto-incrémentée - protected $fillable = [ 'nom', 'prenom', 'sexe', 'parentId']; // Colonnes autorisées à être affectées en masse - - public function __construct(array $attributes = []) - { - parent::__construct($attributes); - } + protected $fillable = ['nom', 'prenom', 'sexe', 'numero', 'parent_id']; // Colonnes autorisées à être affectées en masse public function inscriptions() { return $this->hasMany(Inscription::class, 'matricule', 'matricule'); } - public function parent() { - return $this->belongsTo(Etudiant_Parent::class, 'parentId', 'parentId'); + return $this->belongsTo(Etudiant_Parent::class, 'parent_id', 'parent_id'); + } + + protected static function boot() + { + parent::boot(); + + static::creating(function ($etudiant) { + $latestMatricule = static::latest()->value('matricule'); + + if ($latestMatricule) { + // Extraire le numéro de matricule + $numeroMatricule = (int) substr($latestMatricule, 3); + + // Incrémenter le numéro de matricule + $numeroMatricule++; + + // Formater le numéro avec des zéros à gauche + $matricule = 'ETU' . str_pad($numeroMatricule, 3, '0', STR_PAD_LEFT); + } else { + // Si aucun étudiant n'existe encore, commencer avec ETU001 + $matricule = 'ETU001'; + } + + $etudiant->matricule = $matricule; + }); } } diff --git a/app/Models/Etudiant_Parent.php b/app/Models/Etudiant_Parent.php index 35058b7..6a74553 100644 --- a/app/Models/Etudiant_Parent.php +++ b/app/Models/Etudiant_Parent.php @@ -11,12 +11,11 @@ class Etudiant_Parent extends Model protected $table = 'etudiant_parents'; // Nom de la table dans la base de données - protected $primaryKey = 'parentId'; // Clé primaire de la table + protected $primaryKey = 'parent_id'; // Clé primaire de la table public $incrementing = true; // Indique si la clé primaire est un nombre auto-incrémenté - public $timestamps = true; - protected $fillable = [ 'nom', 'user_id']; // Colonnes autorisées à être affectées en masse + protected $fillable = ['nom', 'user_id']; // Colonnes autorisées à être affectées en masse public function __construct(array $attributes = []) { @@ -25,12 +24,6 @@ public function __construct(array $attributes = []) public function enfants() { - return $this->hasMany(Etudiant::class, 'parentId', 'parentId'); + return $this->hasMany(Etudiant::class, 'parent_id', 'parent_id'); } - - public function user() - { - return $this->belongsTo(User::class); - } - } diff --git a/app/Models/Filiere.php b/app/Models/Filiere.php index efc97f3..6f1bb0e 100644 --- a/app/Models/Filiere.php +++ b/app/Models/Filiere.php @@ -11,10 +11,11 @@ class Filiere extends Model protected $table = 'filieres'; // Nom de la table dans la base de données - public $incrementing = true; // Indique si la clé primaire est un nombre auto-incrémenté + protected $primaryKey = 'codFil'; // Clé primaire de la table + + public $incrementing = false; // Indique si la clé primaire est un nombre auto-incrémenté protected $fillable = ['codFil', 'libFil']; // Colonnes autorisées à être affectées en masse - public $timestamps = true; public function __construct(array $attributes = []) { @@ -33,6 +34,6 @@ public function epreuves() public function emploieDuTemps() { - return $this->hasMany(Emploi_du_temps::class, 'codFil', 'codFil'); + return $this->hasMany(EmploiDuTemps::class, 'codFil', 'codFil'); } } diff --git a/app/Models/Inscription.php b/app/Models/Inscription.php index 33f781b..6c7f5ea 100644 --- a/app/Models/Inscription.php +++ b/app/Models/Inscription.php @@ -14,7 +14,6 @@ class Inscription extends Model protected $primaryKey = 'numIns'; // Clé primaire de la table public $incrementing = true; // Indique si la clé primaire est un nombre auto-incrémenté - public $timestamps = true; protected $fillable = ['dateIns','annee','codFil','matricule', 'user_id']; // Colonnes autorisées à être affectées en masse diff --git a/app/Models/Matiere.php b/app/Models/Matiere.php index 78a0be1..e5db58c 100644 --- a/app/Models/Matiere.php +++ b/app/Models/Matiere.php @@ -14,7 +14,6 @@ class Matiere extends Model protected $primaryKey = 'codMat'; // Clé primaire de la table public $incrementing = true; // Indique si la clé primaire est un nombre auto-incrémenté - public $timestamps = true; protected $fillable = [ 'libMat']; // Colonnes autorisées à être affectées en masse diff --git a/app/Models/Professeur.php b/app/Models/Professeur.php index 9d36e99..f872000 100644 --- a/app/Models/Professeur.php +++ b/app/Models/Professeur.php @@ -14,7 +14,6 @@ class Professeur extends Model protected $primaryKey = 'numProf'; // Clé primaire de la table public $incrementing = true; // Indique si la clé primaire est un nombre auto-incrémenté - public $timestamps = true; protected $fillable = ['numProf', 'nomProf', 'user_id']; // Colonnes autorisées à être affectées en masse @@ -23,11 +22,13 @@ public function __construct(array $attributes = []) parent::__construct($attributes); } - // Relation avec le modèle User (un parent appartient à un utilisateur) - public function user() - { - return $this->belongsTo(User::class); - } - - + // Relation avec le modèle User (un parent appartient à un utilisateur) + public function user() + { + return $this->belongsTo(User::class); + } + public function epreuves() + { + $this->hasMany(Epreuve::class, "numProf", "numProf"); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 1f954a2..db51bf1 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -20,6 +20,7 @@ class User extends Authenticatable 'name', 'email', 'password', + 'role' ]; public $timestamps = true; @@ -54,7 +55,7 @@ public function inscription() // Relation avec les parents public function parent() { - return $this->hasOne(Parent::class); + return $this->hasOne(Etudiant_Parent::class); } // Relation avec les professeurs diff --git a/app/View/Components/AppLayout.php b/app/View/Components/AppLayout.php new file mode 100644 index 0000000..de0d46f --- /dev/null +++ b/app/View/Components/AppLayout.php @@ -0,0 +1,17 @@ +string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); - $table->string('role'); + $table->string('role')->default('admin'); $table->string('password'); $table->rememberToken(); $table->timestamps(); diff --git a/database/migrations/2024_03_18_072821_create_filieres_table.php b/database/migrations/2024_03_18_072821_create_filieres_table.php index 3d4ec98..e1b6e18 100644 --- a/database/migrations/2024_03_18_072821_create_filieres_table.php +++ b/database/migrations/2024_03_18_072821_create_filieres_table.php @@ -12,8 +12,7 @@ public function up(): void { Schema::create('filieres', function (Blueprint $table) { - $table->id(); - $table->string('codFil')->unique(); + $table->string('codFil')->primary(); $table->string('libFil'); $table->timestamps(); }); diff --git a/database/migrations/2024_03_18_082800_create_etudiant__parents_table.php b/database/migrations/2024_03_18_082800_create_etudiant__parents_table.php index 0cfde2f..f2bfd6e 100644 --- a/database/migrations/2024_03_18_082800_create_etudiant__parents_table.php +++ b/database/migrations/2024_03_18_082800_create_etudiant__parents_table.php @@ -11,12 +11,11 @@ */ public function up(): void { - Schema::create('etudiant__parents', function (Blueprint $table) { - $table->id('parentId'); + Schema::create('etudiant_parents', function (Blueprint $table) { + $table->id('parent_id'); $table->string('nom'); $table->unsignedBigInteger('user_id'); $table->timestamps(); - $table->foreign('user_id')->references('id')->on('users'); }); } @@ -26,6 +25,6 @@ public function up(): void */ public function down(): void { - Schema::dropIfExists('etudiant__parents'); + Schema::dropIfExists('etudiant_parents'); } }; diff --git a/database/migrations/2024_03_18_082948_create_epreuves_table.php b/database/migrations/2024_03_18_082948_create_epreuves_table.php index 4259fe1..f428e80 100644 --- a/database/migrations/2024_03_18_082948_create_epreuves_table.php +++ b/database/migrations/2024_03_18_082948_create_epreuves_table.php @@ -17,15 +17,13 @@ public function up(): void $table->time('heurDeb'); $table->time('heurFin'); $table->unsignedBigInteger('numProf'); + $table->foreign('numProf')->references('numProf')->on('professeurs')->onDelete('cascade'); $table->string('codFil'); + $table->foreign('codFil')->references('codFil')->on('filieres')->onDelete('cascade'); $table->unsignedBigInteger('codMat'); + $table->foreign('codMat')->references('codMat')->on('matieres')->onDelete('cascade'); $table->integer('annee'); $table->timestamps(); - - $table->foreign('numProf')->references('numProf')->on('professeurs')->onDelete('cascade'); - $table->foreign('codFil')->references('codFil')->on('filieres')->onDelete('cascade'); - $table->foreign('codMat')->references('codMat')->on('matieres')->onDelete('cascade'); - }); } diff --git a/database/migrations/2024_03_18_092831_create_etudiants_table.php b/database/migrations/2024_03_18_092831_create_etudiants_table.php index ffd75e1..d978da6 100644 --- a/database/migrations/2024_03_18_092831_create_etudiants_table.php +++ b/database/migrations/2024_03_18_092831_create_etudiants_table.php @@ -12,17 +12,15 @@ public function up(): void { Schema::create('etudiants', function (Blueprint $table) { - $table->id('matricule'); - $table->string('prenom'); + $table->string('matricule')->primary()->unique(); $table->string('nom'); + $table->string('prenom'); $table->string('sexe'); - $table->unsignedBigInteger('parentId'); + $table->string('numero'); + $table->unsignedBigInteger('parent_id')->nullable(); + $table->foreign('parent_id')->references('parent_id')->on('etudiant_parents')->onDelete('cascade'); $table->timestamps(); - - $table->foreign('parentId')->references('parentId')->on('etudiant__parents'); - }); - } /** diff --git a/database/migrations/2024_03_18_092835_create_inscriptions_table.php b/database/migrations/2024_03_18_092835_create_inscriptions_table.php index bfe063d..6555763 100644 --- a/database/migrations/2024_03_18_092835_create_inscriptions_table.php +++ b/database/migrations/2024_03_18_092835_create_inscriptions_table.php @@ -14,16 +14,14 @@ public function up(): void Schema::create('inscriptions', function (Blueprint $table) { $table->id('numIns'); $table->date('dateIns'); - $table->integer('annee'); + $table->year('annee'); $table->string('codFil'); - $table->unsignedBigInteger('matricule'); + $table->string('matricule'); $table->unsignedBigInteger('user_id'); - $table->timestamps(); - $table->foreign('user_id')->references('id')->on('users'); - $table->foreign('codFil')->references('codFil')->on('filieres'); - $table->foreign('matricule')->references('matricule')->on('etudiants'); - + $table->foreign('codFil')->references('codFil')->on('filieres')->onDelete('cascade'); + $table->foreign('matricule')->references('matricule')->on('etudiants')->onDelete('cascade'); + $table->timestamps(); }); } diff --git a/database/migrations/2024_03_18_093051_create_compositions_table.php b/database/migrations/2024_03_18_093051_create_compositions_table.php index 029a7f3..25d746e 100644 --- a/database/migrations/2024_03_18_093051_create_compositions_table.php +++ b/database/migrations/2024_03_18_093051_create_compositions_table.php @@ -17,20 +17,20 @@ public function up(): void $table->unsignedBigInteger('numEp'); $table->float('note'); $table->timestamps(); - + // Définition de la clé primaire composée $table->primary(['numIns', 'numEp']); - + // Déclaration des clés étrangères $table->foreign('numIns') - ->references('numIns') - ->on('inscriptions') - ->onDelete('cascade'); - + ->references('numIns') + ->on('inscriptions') + ->onDelete('cascade'); + $table->foreign('numEp') - ->references('numEp') - ->on('epreuves') - ->onDelete('cascade'); + ->references('numEp') + ->on('epreuves') + ->onDelete('cascade'); }); } diff --git a/database/migrations/2024_03_25_083416_create_emploi_du_temps_table.php b/database/migrations/2024_03_25_083416_create_emploi_du_temps_table.php index 6dfd3d1..554ae24 100644 --- a/database/migrations/2024_03_25_083416_create_emploi_du_temps_table.php +++ b/database/migrations/2024_03_25_083416_create_emploi_du_temps_table.php @@ -39,9 +39,9 @@ public function up(): void $table->string('codFil'); $table->foreign('codFil') - ->references('codFil') - ->on('filieres') - ->onDelete('cascade'); + ->references('codFil') + ->on('filieres') + ->onDelete('cascade'); $table->timestamps(); }); diff --git a/database/seeders/CompositionSeeder.php b/database/seeders/CompositionSeeder.php new file mode 100644 index 0000000..05727a7 --- /dev/null +++ b/database/seeders/CompositionSeeder.php @@ -0,0 +1,28 @@ + 1, + 'numEp' => 1, + 'note' => 15.5, + ]); + + Composition::create([ + 'numIns' => 1, + 'numEp' => 2, + 'note' => 13.0, + ]); + } +} diff --git a/database/seeders/DatabaseSeeder copy.php b/database/seeders/DatabaseSeeder copy.php new file mode 100644 index 0000000..51169d3 --- /dev/null +++ b/database/seeders/DatabaseSeeder copy.php @@ -0,0 +1,36 @@ +create(); + + // \App\Models\User::factory()->create([ + // 'name' => 'Test User', + // 'email' => 'test@example.com', + // ]); + $this->call([ + UserSeeder::class, + FiliereSeeder::class, + ProfesseurSeeder::class, + EtudiantParentSeeder::class, + MatiereSeeder::class, + EpreuveSeeder::class, + EtudiantSeeder::class, + InscriptionSeeder::class, + CompositionSeeder::class, + EmploiDuTempsSeeder::class + ]); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index d01a0ef..52bddf6 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -15,9 +15,22 @@ public function run(): void { // User::factory(10)->create(); - User::factory()->create([ - 'name' => 'Test User', - 'email' => 'test@example.com', + // User::factory()->create([ + // 'name' => 'Test User', + // 'email' => 'test@example.com', + // 'role'=> 'admin' + // ]); + $this->call([ + UserSeeder::class, + FiliereSeeder::class, + ProfesseurSeeder::class, + EtudiantParentSeeder::class, + MatiereSeeder::class, + EpreuveSeeder::class, + EtudiantSeeder::class, + InscriptionSeeder::class, + CompositionSeeder::class, + EmploiDuTempsSeeder::class ]); } } diff --git a/database/seeders/EmploiDuTempsSeeder.php b/database/seeders/EmploiDuTempsSeeder.php new file mode 100644 index 0000000..36b10de --- /dev/null +++ b/database/seeders/EmploiDuTempsSeeder.php @@ -0,0 +1,36 @@ + 'Inf', // Assurez-vous que cet ID existe dans la table filieres + 'lundi_matin' => 'Mathématiques', + 'lundi_aprem' => 'Physique', + 'lundi_soir' => 'Chimie', + 'mardi_matin' => 'Biologie', + 'mardi_aprem' => 'Histoire', + 'mardi_soir' => 'Géographie', + 'mercredi_matin' => 'Mathématiques', + 'mercredi_aprem' => 'Chimie', + 'mercredi_soir' => 'Physique', + 'jeudi_matin' => 'Biologie', + 'jeudi_aprem' => 'Mathématiques', + 'jeudi_soir' => 'Physique', + 'vendredi_matin' => 'Chimie', + 'vendredi_aprem' => 'Histoire', + 'vendredi_soir' => 'Géographie', + 'samedi_matin' => 'Mathématiques', + ]); + } +} diff --git a/database/seeders/EpreuveSeeder.php b/database/seeders/EpreuveSeeder.php new file mode 100644 index 0000000..bcc0d17 --- /dev/null +++ b/database/seeders/EpreuveSeeder.php @@ -0,0 +1,36 @@ + '2024-04-20', + 'heurDeb' => '09:00:00', + 'heurFin' => '12:00:00', + 'numProf' => 1, // Assurez-vous que cet ID existe dans la table professeurs + 'codFil' => 'Inf', // Assurez-vous que cet ID existe dans la table filieres + 'codMat' => 1, // Assurez-vous que cet ID existe dans la table matieres + 'annee' => 2024, + ]); + + Epreuve::create([ + 'dateEp' => '2024-04-21', + 'heurDeb' => '13:00:00', + 'heurFin' => '15:00:00', + 'numProf' => 2, // Assurez-vous que cet ID existe dans la table professeurs + 'codFil' => 'Inf', // Assurez-vous que cet ID existe dans la table filieres + 'codMat' => 2, // Assurez-vous que cet ID existe dans la table matieres + 'annee' => 2024, + ]); + } +} diff --git a/database/seeders/EtudiantParentSeeder.php b/database/seeders/EtudiantParentSeeder.php new file mode 100644 index 0000000..6cf36c4 --- /dev/null +++ b/database/seeders/EtudiantParentSeeder.php @@ -0,0 +1,29 @@ + 'Parent 1', + 'user_id' => 1, + ]); + + Etudiant_Parent::create([ + 'nom' => 'Parent 2', + 'user_id' => 2, + ]); + + + + } +} diff --git a/database/seeders/EtudiantSeeder.php b/database/seeders/EtudiantSeeder.php new file mode 100644 index 0000000..3e7814d --- /dev/null +++ b/database/seeders/EtudiantSeeder.php @@ -0,0 +1,25 @@ + 'Dupont', 'prenom' => 'Jean', 'sexe' => 'M', 'numero' => '1234567890', 'parent_id' => 1], + ]; + + // Insérez les étudiants dans la table + foreach ($etudiants as $etudiant) { + Etudiant::create($etudiant); + } + } +} diff --git a/database/seeders/FiliereSeeder.php b/database/seeders/FiliereSeeder.php new file mode 100644 index 0000000..4b59309 --- /dev/null +++ b/database/seeders/FiliereSeeder.php @@ -0,0 +1,39 @@ + 'Inf', + 'libFil' => 'Informatique'], + [ + 'codFil'=> 'Maths', + 'libFil' => 'Mathématiques'], + [ + 'codFil'=> 'SI', + 'libFil' => 'Sécurité Informatique'], + [ + 'codFil'=> 'AL', + 'libFil' => 'Architecture logiciel'], + [ + 'codFil'=> 'IA', + 'libFil' => 'Intelligence Artificielle'], + ]; + + // Insérer les filières dans la table 'filieres' + foreach ($filieres as $filiere) { + Filiere::create($filiere); + } + } +} diff --git a/database/seeders/InscriptionSeeder.php b/database/seeders/InscriptionSeeder.php new file mode 100644 index 0000000..77e6f84 --- /dev/null +++ b/database/seeders/InscriptionSeeder.php @@ -0,0 +1,31 @@ + '2024-01-10', + 'annee' => 2024, + 'codFil' => 'Inf', // Remplacez par l'ID d'une filière existante + 'matricule' => 'ETU001', // Remplacez par un matricule d'étudiant existant + 'user_id' => 1, // Remplacez par l'ID d'un utilisateur existant + ], + ]; + + // Insérez les inscriptions dans la table + foreach ($inscriptions as $inscription) { + Inscription::create($inscription); + } + } +} diff --git a/database/seeders/MatiereSeeder.php b/database/seeders/MatiereSeeder.php new file mode 100644 index 0000000..a1389c0 --- /dev/null +++ b/database/seeders/MatiereSeeder.php @@ -0,0 +1,28 @@ + 'Mathématiques', + ]); + + Matiere::create([ + 'libMat' => 'Physique', + ]); + + Matiere::create([ + 'libMat' => 'Chimie', + ]); + } +} diff --git a/database/seeders/ProfesseurSeeder.php b/database/seeders/ProfesseurSeeder.php new file mode 100644 index 0000000..a6f7b5e --- /dev/null +++ b/database/seeders/ProfesseurSeeder.php @@ -0,0 +1,26 @@ + 'Professeur X', + 'user_id' => 1, // Assurez-vous que cet ID existe dans la table users + ]); + + Professeur::create([ + 'nomProf' => 'Professeur Y', + 'user_id' => 2, // Assurez-vous que cet ID existe dans la table users + ]); + } +} diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 0000000..16901ef --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,39 @@ + 'John Doe', + 'email' => 'john.doe@example.com', + 'email_verified_at' => now(), + 'password' => Hash::make('12345678'), // Mot de passe crypté + 'role' => 'admin', // Rôle par défaut : admin + ], + [ + 'name' => 'Jane Smith', + 'email' => 'jane.smith@example.com', + 'email_verified_at' => now(), + 'password' => Hash::make('12345678'), + 'role' => 'user', // Utilisateur ordinaire + ], + ]; + + // Insérez les utilisateurs dans la table + foreach ($users as $user) { + User::create($user); + } + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..00f715b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2431 @@ +{ + "name": "studyhub", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@tailwindcss/forms": "^0.5.2", + "alpinejs": "^3.4.2", + "autoprefixer": "^10.4.2", + "axios": "^1.6.4", + "laravel-vite-plugin": "^1.0", + "postcss": "^8.4.31", + "tailwindcss": "^3.1.0", + "vite": "^5.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/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "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.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "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/@rollup/rollup-android-arm-eabi": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.3.tgz", + "integrity": "sha512-1ACInKIT0pXmTYuPoJAL8sOT0lV3PEACFSVxnD03hGIojJ1CmbzZmLJyk2xew+yxqTlmx7xydkiJcBzdp0V+AQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.3.tgz", + "integrity": "sha512-vGl+Bny8cawCM7ExugzqEB8ke3t7Pm9/mo+ciA9kJh6pMuNyM+31qhewMwHwseDZ/LtdW0SCocW1CsMxcq1Lsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.3.tgz", + "integrity": "sha512-Lj8J9WzQRvfWO4GfI+bBkIThUFV1PtI+es/YH/3cwUQ+edXu8Mre0JRJfRrAeRjPiHDPFFZaX51zfgHHEhgRAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.3.tgz", + "integrity": "sha512-NPPOXMTIWJk50lgZmRReEYJFvLG5rgMDzaVauWNB2MgFQYm9HuNXQdVVg3iEZ3A5StIzxhMlPjVyS5fsv4PJmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.3.tgz", + "integrity": "sha512-ij4tv1XtWcDScaTgoMnvDEYZ2Wjl2ZhDFEyftjBKu6sNNLHIkKuXBol/bVSh+md5zSJ6em9hUXyPO3cVPCsl4Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.3.tgz", + "integrity": "sha512-MTMAl30dzcfYB+smHe1sJuS2P1/hB8pqylkCe0/8/Lo8CADjy/eM8x43nBoR5eqcYgpOtCh7IgHpvqSMAE38xw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.3.tgz", + "integrity": "sha512-vY3fAg6JLDoNh781HHHMPvt8K6RWG3OmEj3xI9BOFSQTD5PNaGKvCB815MyGlDnFYUw7lH+WvvQqoBwLtRDR1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.3.tgz", + "integrity": "sha512-61SpQGBSb8QkfV/hUYWezlEig4ro55t8NcE5wWmy1bqRsRVHCEDkF534d+Lln/YeLUoSWtJHvvG3bx9lH/S6uA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.3.tgz", + "integrity": "sha512-4XGexJthsNhEEgv/zK4/NnAOjYKoeCsIoT+GkqTY2u3rse0lbJ8ft1bpDCdlkvifsLDL2uwe4fn8PLR4IMTKQQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.3.tgz", + "integrity": "sha512-/pArXjqnEdhbQ1qe4CTTlJ6/GjWGdWNRucKAp4fqKnKf7QC0BES3QEV34ACumHHQ4uEGt4GctF2ISCMRhkli0A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.3.tgz", + "integrity": "sha512-vu4f3Y8iwjtRfSZdmtP8nC1jmRx1IrRVo2cLQlQfpFZ0e2AE9YbPgfIzpuK+i3C4zFETaLLNGezbBns2NuS/uA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.3.tgz", + "integrity": "sha512-n4HEgIJulNSmAKT3SYF/1wuzf9od14woSBseNkzur7a+KJIbh2Jb+J9KIsdGt3jJnsLW0BT1Sj6MiwL4Zzku6Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.3.tgz", + "integrity": "sha512-guO/4N1884ig2AzTKPc6qA7OTnFMUEg/X2wiesywRO1eRD7FzHiaiTQQOLFmnUXWj2pgQXIT1g5g3e2RpezXcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.3.tgz", + "integrity": "sha512-+rxD3memdkhGz0NhNqbYHXBoA33MoHBK4uubZjF1IeQv1Psi6tqgsCcC6vwQjxBM1qoCqOQQBy0cgNbbZKnGUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.3.tgz", + "integrity": "sha512-0NxVbLhBXmwANWWbgZY/RdSkeuHEgF+u8Dc0qBowUVBYsR2y2vwVGjKgUcj1wtu3jpjs057io5g9HAPr3Icqjg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.3.tgz", + "integrity": "sha512-hutnZavtOx/G4uVdgoZz5279By9NVbgmxOmGGgnzUjZYuwp2+NzGq6KXQmHXBWz7W/vottXn38QmKYAdQLa/vQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", + "dev": true, + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@vue/reactivity": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", + "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", + "dev": true, + "dependencies": { + "@vue/shared": "3.1.5" + } + }, + "node_modules/@vue/shared": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", + "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==", + "dev": true + }, + "node_modules/alpinejs": { + "version": "3.13.9", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.13.9.tgz", + "integrity": "sha512-BTEJ3fcUpqKlB+aFYSWGVEp8IP3vA96x7wUaNSdb5SJxV5i7s+/Bduxy9D6TokcqpW5MygsnG1eBEFfr4AnQSw==", + "dev": true, + "dependencies": { + "@vue/reactivity": "~3.1.1" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "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.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "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.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "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.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "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.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "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.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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.30001612", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", + "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", + "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/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/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "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/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/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.4.746", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.746.tgz", + "integrity": "sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==", + "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/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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.4" + }, + "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.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "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.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "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.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "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/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "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/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.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "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": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.0.2.tgz", + "integrity": "sha512-Mcclml10khYzBVxDwJro8wnVDwD4i7XOSEMACQNnarvTnHjrjXLLL+B/Snif2wYAyElsOqagJZ7VAinb/2vF5g==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "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.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "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.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "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.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "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/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/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.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "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.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "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.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "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-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "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/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/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.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "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": "4.16.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.3.tgz", + "integrity": "sha512-Ygm4fFO4usWcAG3Ud36Lmif5nudoi0X6QPLC+kRgrRjulAbmFkaTawP7fTIkRDnCNSf/4IAQzXM1T8e691kRtw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.16.3", + "@rollup/rollup-android-arm64": "4.16.3", + "@rollup/rollup-darwin-arm64": "4.16.3", + "@rollup/rollup-darwin-x64": "4.16.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.16.3", + "@rollup/rollup-linux-arm-musleabihf": "4.16.3", + "@rollup/rollup-linux-arm64-gnu": "4.16.3", + "@rollup/rollup-linux-arm64-musl": "4.16.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.16.3", + "@rollup/rollup-linux-riscv64-gnu": "4.16.3", + "@rollup/rollup-linux-s390x-gnu": "4.16.3", + "@rollup/rollup-linux-x64-gnu": "4.16.3", + "@rollup/rollup-linux-x64-musl": "4.16.3", + "@rollup/rollup-win32-arm64-msvc": "4.16.3", + "@rollup/rollup-win32-ia32-msvc": "4.16.3", + "@rollup/rollup-win32-x64-msvc": "4.16.3", + "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/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/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.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "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.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.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.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "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.1.1", + "picocolors": "^1.0.0" + }, + "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": "5.2.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", + "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "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.1.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.1.0.tgz", + "integrity": "sha512-3cObNDzX6DdfhD9E7kf6w2mNunFpD7drxyNgHLw+XwIYAgb+Xt16SEXo0Up4VH+TMf3n+DSVJZtW2POBGcBYAA==", + "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/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/package.json b/package.json index 4e934ca..e158669 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,13 @@ "build": "vite build" }, "devDependencies": { + "@tailwindcss/forms": "^0.5.2", + "alpinejs": "^3.4.2", + "autoprefixer": "^10.4.2", "axios": "^1.6.4", "laravel-vite-plugin": "^1.0", + "postcss": "^8.4.31", + "tailwindcss": "^3.1.0", "vite": "^5.0" } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..49c0612 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/public/images/2.png b/public/images/2.png new file mode 100644 index 0000000000000000000000000000000000000000..b4c5009060597e44b6f505c5d5ac37bd69ed5d63 GIT binary patch literal 37255 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