From 3013bb574054de70689e0e0e3d0fe3dd856a5063 Mon Sep 17 00:00:00 2001 From: Funky Waddle Date: Sat, 6 Dec 2025 21:49:26 -0600 Subject: [PATCH] Initial commit of existing project --- .editorconfig | 18 + .env.example | 70 + .gitattributes | 11 + .gitignore | 1 + .prettierignore | 2 + .prettierrc | 26 + README.md | 205 +- app/Actions/Fortify/CreateNewUser.php | 39 + .../Fortify/PasswordValidationRules.php | 18 + app/Actions/Fortify/ResetUserPassword.php | 28 + app/Http/Controllers/Controller.php | 8 + .../Settings/PasswordController.php | 38 + .../Settings/ProfileController.php | 63 + .../TwoFactorAuthenticationController.php | 37 + app/Http/Middleware/HandleAppearance.php | 23 + app/Http/Middleware/HandleInertiaRequests.php | 51 + .../Settings/ProfileUpdateRequest.php | 30 + .../TwoFactorAuthenticationRequest.php | 30 + app/Models/User.php | 52 + .../Admin/AcceptMovieController.php | 30 + .../Admin/DeleteMovieController.php | 21 + .../Admin/EditMoviePageController.php | 17 + .../Admin/ExistsMovieController.php | 26 + .../Admin/MoviesListPageController.php | 15 + .../Admin/MoviesPageController.php | 15 + .../Admin/SearchMoviesController.php | 20 + .../Admin/UpdateMovieController.php | 22 + .../Browse/Entities/ActorShowController.php | 26 + .../Entities/DirectorShowController.php | 26 + .../Browse/Entities/GenreShowController.php | 26 + .../Browse/Entities/StudioShowController.php | 26 + .../Browse/MovieShowController.php | 17 + .../Browse/MoviesIndexController.php | 29 + .../Pages/ActorsShowPageController.php | 17 + .../Pages/DirectorsShowPageController.php | 17 + .../Pages/GenresShowPageController.php | 17 + .../Pages/PublicMovieShowPageController.php | 17 + .../Pages/PublicMoviesPageController.php | 15 + .../Pages/StudiosShowPageController.php | 17 + .../Http/Requests/AcceptMovieRequest.php | 22 + .../Http/Requests/DestroyMovieRequest.php | 18 + .../Http/Requests/ExistsMovieRequest.php | 21 + .../Http/Requests/SearchMoviesRequest.php | 28 + .../Http/Requests/UpdateMovieRequest.php | 44 + app/Modules/Movies/Models/Actor.php | 22 + app/Modules/Movies/Models/Country.php | 22 + app/Modules/Movies/Models/Director.php | 22 + app/Modules/Movies/Models/Genre.php | 22 + app/Modules/Movies/Models/Language.php | 22 + app/Modules/Movies/Models/Movie.php | 46 + app/Modules/Movies/Models/Studio.php | 22 + .../Providers/MoviesServiceProvider.php | 93 + app/Modules/Movies/README.md | 60 + .../Entities/GetActorWithMoviesService.php | 39 + .../Entities/GetDirectorWithMoviesService.php | 39 + .../Entities/GetGenreWithMoviesService.php | 62 + .../Entities/GetStudioWithMoviesService.php | 62 + .../Services/Browse/ListMoviesService.php | 98 + .../Services/Browse/ShowMovieService.php | 26 + .../Services/CheckMovieExistsService.php | 17 + .../CheckMovieExistsServiceInterface.php | 10 + .../Contracts/DeleteMovieServiceInterface.php | 8 + .../GetActorWithMoviesServiceInterface.php | 16 + .../GetDirectorWithMoviesServiceInterface.php | 16 + .../GetGenreWithMoviesServiceInterface.php | 16 + .../GetStudioWithMoviesServiceInterface.php | 16 + .../Contracts/ListMoviesServiceInterface.php | 13 + .../Services/Contracts/MovieProvider.php | 25 + .../Contracts/ShowMovieServiceInterface.php | 10 + .../Contracts/UpdateMovieServiceInterface.php | 17 + .../Contracts/UpsertMovieServiceInterface.php | 17 + .../Movies/Services/DeleteMovieService.php | 22 + .../Services/Omdb/OmdbMovieProvider.php | 161 + .../Movies/Services/UpdateMovieService.php | 68 + .../Services/UpsertMovieFromProvider.php | 118 + app/Modules/Movies/routes/admin.php | 26 + app/Modules/Movies/routes/api.php | 9 + app/Modules/Movies/routes/api_actors.php | 6 + app/Modules/Movies/routes/api_directors.php | 6 + app/Modules/Movies/routes/api_genres.php | 6 + app/Modules/Movies/routes/api_studios.php | 6 + app/Modules/Movies/routes/pages.php | 9 + app/Modules/Movies/routes/pages_actors.php | 6 + app/Modules/Movies/routes/pages_directors.php | 6 + app/Modules/Movies/routes/pages_genres.php | 6 + app/Modules/Movies/routes/pages_studios.php | 6 + app/Modules/Movies/routes/public.php | 8 + app/Providers/AppServiceProvider.php | 24 + app/Providers/FortifyServiceProvider.php | 91 + artisan | 18 + bootstrap/app.php | 30 + bootstrap/cache/.gitignore | 2 + bootstrap/providers.php | 6 + components.json | 19 + composer.json | 100 + composer.lock | 9961 +++++++++++++++++ config/app.php | 126 + config/auth.php | 115 + config/cache.php | 117 + config/database.php | 183 + config/filesystems.php | 80 + config/fortify.php | 157 + config/inertia.php | 52 + config/logging.php | 132 + config/mail.php | 118 + config/movies.php | 13 + config/queue.php | 129 + config/services.php | 38 + config/session.php | 217 + database/.gitignore | 1 + database/factories/ActorFactory.php | 21 + database/factories/CountryFactory.php | 21 + database/factories/DirectorFactory.php | 21 + database/factories/GenreFactory.php | 21 + database/factories/LanguageFactory.php | 21 + database/factories/MovieFactory.php | 35 + database/factories/StudioFactory.php | 21 + database/factories/UserFactory.php | 59 + .../0001_01_01_000000_create_users_table.php | 49 + .../0001_01_01_000001_create_cache_table.php | 35 + .../0001_01_01_000002_create_jobs_table.php | 57 + ..._add_two_factor_columns_to_users_table.php | 34 + ...2025_12_05_000001_create_movies_tables.php | 116 + ...pporting_names_case_insensitive_unique.php | 54 + database/seeders/DatabaseSeeder.php | 23 + eslint.config.js | 19 + package-lock.json | 5205 +++++++++ package.json | 53 + phpunit.xml | 35 + public/.htaccess | 25 + public/apple-touch-icon.png | Bin 0 -> 1662 bytes ...ue_type_script_setup_true_lang-DESMBqxz.js | 1 + ...ue_type_script_setup_true_lang-7XZAfK5W.js | 1 + public/build/assets/Appearance-x5-Kktlh.js | 1 + ...ue_type_script_setup_true_lang-B14CUTB5.js | 1 + .../build/assets/ConfirmPassword-wh4eUhzq.js | 1 + public/build/assets/Dashboard-BZ90YdF3.js | 1 + ...ue_type_script_setup_true_lang-Dg2xd9QK.js | 1 + public/build/assets/Edit-CBkUZj2d.css | 1 + public/build/assets/Edit-CORuyxK8.js | 1 + .../build/assets/ForgotPassword-BI_N76PO.js | 1 + public/build/assets/Index-BJjYncZL.css | 1 + public/build/assets/Index-BrX3yilR.css | 1 + public/build/assets/Index-CYUFIW2Y.js | 1 + public/build/assets/Index-Dc3cIue4.js | 1 + ...ue_type_script_setup_true_lang-BcBrC1ED.js | 1 + ...ue_type_script_setup_true_lang-DxwKzEqx.js | 1 + ...ue_type_script_setup_true_lang-Dbqibcwo.js | 1 + ...ue_type_script_setup_true_lang-ROf3tZlv.js | 1 + public/build/assets/List-CVA9NIjL.css | 1 + public/build/assets/List-C_4Kh8Sa.js | 1 + public/build/assets/Login-4gIV6O-Y.js | 1 + public/build/assets/Password-Cz_oOx7m.js | 1 + ...ue_type_script_setup_true_lang-D_qQ1GfR.js | 1 + public/build/assets/Profile-DvBzD9G7.js | 1 + public/build/assets/Register-kQGfWF-K.js | 1 + public/build/assets/ResetPassword-BPOrjW9k.js | 1 + .../build/assets/RovingFocusGroup-CNFroA6Y.js | 3 + public/build/assets/Show-B-qGUz9l.css | 1 + public/build/assets/Show-B81d5hyh.js | 1 + public/build/assets/Show-BCIzyp2I.js | 1 + public/build/assets/Show-BGTgh0m1.js | 1 + public/build/assets/Show-CLkQumZS.js | 1 + public/build/assets/Show-Cm2t8bQb.css | 1 + public/build/assets/Show-Csw6sC-4.css | 1 + public/build/assets/Show-DB_iXr9H.css | 1 + public/build/assets/Show-u0mnbIJy.css | 1 + public/build/assets/Show-y_rWxQ3Z.js | 1 + ...ue_type_script_setup_true_lang-BPOcqWqa.js | 1 + ...ue_type_script_setup_true_lang-JYycsYY3.js | 1 + public/build/assets/TwoFactor-CEzdBq7S.js | 1 + .../assets/TwoFactorChallenge-BSzmROh9.js | 1 + public/build/assets/VerifyEmail-DZQcbTya.js | 1 + .../build/assets/VisuallyHidden-Cu70tzB6.js | 1 + .../assets/VisuallyHiddenInput-Drd3EMOd.js | 1 + public/build/assets/Welcome-1IB3Dtj8.js | 1 + .../_plugin-vue_export-helper-DlAUqK2U.js | 1 + public/build/assets/app-BUIfoF4D.css | 1 + public/build/assets/app-CClrM5Yi.js | 75 + public/build/assets/check-BNffy8wt.js | 1 + .../build/assets/createLucideIcon-ZFd4jktC.js | 1 + public/build/assets/index--H2rh_A_.js | 1 + public/build/assets/index-BCC4ahRc.js | 1 + public/build/assets/index-C4J_hXM0.js | 1 + public/build/assets/index-DZxzsgmi.js | 1 + public/build/assets/index-vZYIBGLo.js | 1 + .../assets/useArrowNavigation-C6Y-ieo6.js | 1 + .../build/assets/useForwardExpose-BhawR5VU.js | 1 + public/build/manifest.json | 675 ++ public/favicon.ico | Bin 0 -> 4286 bytes public/favicon.svg | 3 + public/index.php | 20 + public/robots.txt | 2 + resources/css/app.css | 172 + .../Settings/PasswordController.ts | 151 + .../Controllers/Settings/ProfileController.ts | 217 + .../TwoFactorAuthenticationController.ts | 85 + .../App/Http/Controllers/Settings/index.ts | 11 + .../js/actions/App/Http/Controllers/index.ts | 7 + resources/js/actions/App/Http/index.ts | 7 + .../Admin/AcceptMovieController.ts | 60 + .../Admin/DeleteMovieController.ts | 88 + .../Admin/EditMoviePageController.ts | 103 + .../Admin/ExistsMovieController.ts | 85 + .../Admin/MoviesListPageController.ts | 85 + .../Controllers/Admin/MoviesPageController.ts | 85 + .../Admin/SearchMoviesController.ts | 85 + .../Admin/UpdateMovieController.ts | 88 + .../Movies/Http/Controllers/Admin/index.ts | 21 + .../Browse/Entities/ActorShowController.ts | 103 + .../Browse/Entities/DirectorShowController.ts | 103 + .../Browse/Entities/GenreShowController.ts | 103 + .../Browse/Entities/StudioShowController.ts | 103 + .../Http/Controllers/Browse/Entities/index.ts | 13 + .../Controllers/Browse/MovieShowController.ts | 103 + .../Browse/MoviesIndexController.ts | 85 + .../Movies/Http/Controllers/Browse/index.ts | 11 + .../Pages/ActorsShowPageController.ts | 103 + .../Pages/DirectorsShowPageController.ts | 103 + .../Pages/GenresShowPageController.ts | 103 + .../Pages/PublicMovieShowPageController.ts | 103 + .../Pages/PublicMoviesPageController.ts | 85 + .../Pages/StudiosShowPageController.ts | 103 + .../Movies/Http/Controllers/Pages/index.ts | 17 + .../Modules/Movies/Http/Controllers/index.ts | 11 + .../actions/App/Modules/Movies/Http/index.ts | 7 + .../js/actions/App/Modules/Movies/index.ts | 7 + resources/js/actions/App/Modules/index.ts | 7 + resources/js/actions/App/index.ts | 9 + .../Illuminate/Routing/RedirectController.ts | 203 + .../js/actions/Illuminate/Routing/index.ts | 7 + resources/js/actions/Illuminate/index.ts | 7 + .../AuthenticatedSessionController.ts | 197 + .../ConfirmablePasswordController.ts | 141 + .../ConfirmedPasswordStatusController.ts | 85 + ...firmedTwoFactorAuthenticationController.ts | 60 + ...EmailVerificationNotificationController.ts | 60 + .../EmailVerificationPromptController.ts | 85 + .../Http/Controllers/NewPasswordController.ts | 159 + .../PasswordResetLinkController.ts | 141 + .../Controllers/RecoveryCodeController.ts | 141 + .../Controllers/RegisteredUserController.ts | 141 + ...TwoFactorAuthenticatedSessionController.ts | 141 + .../TwoFactorAuthenticationController.ts | 126 + .../Controllers/TwoFactorQrCodeController.ts | 85 + .../TwoFactorSecretKeyController.ts | 85 + .../Http/Controllers/VerifyEmailController.ts | 102 + .../Laravel/Fortify/Http/Controllers/index.ts | 35 + .../js/actions/Laravel/Fortify/Http/index.ts | 7 + resources/js/actions/Laravel/Fortify/index.ts | 7 + resources/js/actions/Laravel/index.ts | 7 + resources/js/app.ts | 29 + resources/js/components/AlertError.vue | 30 + resources/js/components/AppContent.vue | 25 + resources/js/components/AppHeader.vue | 282 + resources/js/components/AppLogo.vue | 16 + resources/js/components/AppLogoIcon.vue | 29 + resources/js/components/AppShell.vue | 21 + resources/js/components/AppSidebar.vue | 71 + resources/js/components/AppSidebarHeader.vue | 27 + resources/js/components/AppearanceTabs.vue | 33 + resources/js/components/Breadcrumbs.vue | 42 + resources/js/components/DeleteUser.vue | 115 + resources/js/components/Heading.vue | 17 + resources/js/components/HeadingSmall.vue | 17 + resources/js/components/Icon.vue | 36 + resources/js/components/InputError.vue | 13 + resources/js/components/NavFooter.vue | 44 + resources/js/components/NavMain.vue | 38 + resources/js/components/NavUser.vue | 54 + .../js/components/PlaceholderPattern.vue | 33 + resources/js/components/TextLink.vue | 25 + .../js/components/TwoFactorRecoveryCodes.vue | 123 + .../js/components/TwoFactorSetupModal.vue | 300 + resources/js/components/UserInfo.vue | 38 + resources/js/components/UserMenuContent.vue | 54 + resources/js/components/ui/alert/Alert.vue | 21 + .../components/ui/alert/AlertDescription.vue | 17 + .../js/components/ui/alert/AlertTitle.vue | 17 + resources/js/components/ui/alert/index.ts | 24 + resources/js/components/ui/avatar/Avatar.vue | 18 + .../components/ui/avatar/AvatarFallback.vue | 23 + .../js/components/ui/avatar/AvatarImage.vue | 16 + resources/js/components/ui/avatar/index.ts | 3 + resources/js/components/ui/badge/Badge.vue | 26 + resources/js/components/ui/badge/index.ts | 26 + .../components/ui/breadcrumb/Breadcrumb.vue | 17 + .../ui/breadcrumb/BreadcrumbEllipsis.vue | 23 + .../ui/breadcrumb/BreadcrumbItem.vue | 17 + .../ui/breadcrumb/BreadcrumbLink.vue | 20 + .../ui/breadcrumb/BreadcrumbList.vue | 17 + .../ui/breadcrumb/BreadcrumbPage.vue | 20 + .../ui/breadcrumb/BreadcrumbSeparator.vue | 22 + .../js/components/ui/breadcrumb/index.ts | 7 + resources/js/components/ui/button/Button.vue | 27 + resources/js/components/ui/button/index.ts | 36 + resources/js/components/ui/card/Card.vue | 22 + .../js/components/ui/card/CardAction.vue | 17 + .../js/components/ui/card/CardContent.vue | 17 + .../js/components/ui/card/CardDescription.vue | 17 + .../js/components/ui/card/CardFooter.vue | 17 + .../js/components/ui/card/CardHeader.vue | 17 + resources/js/components/ui/card/CardTitle.vue | 17 + resources/js/components/ui/card/index.ts | 7 + .../js/components/ui/checkbox/Checkbox.vue | 37 + resources/js/components/ui/checkbox/index.ts | 1 + .../components/ui/collapsible/Collapsible.vue | 19 + .../ui/collapsible/CollapsibleContent.vue | 14 + .../ui/collapsible/CollapsibleTrigger.vue | 14 + .../js/components/ui/collapsible/index.ts | 3 + resources/js/components/ui/dialog/Dialog.vue | 17 + .../js/components/ui/dialog/DialogClose.vue | 14 + .../js/components/ui/dialog/DialogContent.vue | 49 + .../ui/dialog/DialogDescription.vue | 25 + .../js/components/ui/dialog/DialogFooter.vue | 15 + .../js/components/ui/dialog/DialogHeader.vue | 17 + .../js/components/ui/dialog/DialogOverlay.vue | 23 + .../ui/dialog/DialogScrollContent.vue | 59 + .../js/components/ui/dialog/DialogTitle.vue | 25 + .../js/components/ui/dialog/DialogTrigger.vue | 14 + resources/js/components/ui/dialog/index.ts | 10 + .../ui/dropdown-menu/DropdownMenu.vue | 17 + .../DropdownMenuCheckboxItem.vue | 41 + .../ui/dropdown-menu/DropdownMenuContent.vue | 39 + .../ui/dropdown-menu/DropdownMenuGroup.vue | 14 + .../ui/dropdown-menu/DropdownMenuItem.vue | 30 + .../ui/dropdown-menu/DropdownMenuLabel.vue | 22 + .../dropdown-menu/DropdownMenuRadioGroup.vue | 22 + .../dropdown-menu/DropdownMenuRadioItem.vue | 42 + .../dropdown-menu/DropdownMenuSeparator.vue | 26 + .../ui/dropdown-menu/DropdownMenuShortcut.vue | 17 + .../ui/dropdown-menu/DropdownMenuSub.vue | 19 + .../dropdown-menu/DropdownMenuSubContent.vue | 31 + .../dropdown-menu/DropdownMenuSubTrigger.vue | 30 + .../ui/dropdown-menu/DropdownMenuTrigger.vue | 16 + .../js/components/ui/dropdown-menu/index.ts | 16 + resources/js/components/ui/input/Input.vue | 33 + resources/js/components/ui/input/index.ts | 1 + resources/js/components/ui/label/Label.vue | 28 + resources/js/components/ui/label/index.ts | 1 + .../ui/navigation-menu/NavigationMenu.vue | 35 + .../navigation-menu/NavigationMenuContent.vue | 35 + .../NavigationMenuIndicator.vue | 25 + .../ui/navigation-menu/NavigationMenuItem.vue | 20 + .../ui/navigation-menu/NavigationMenuLink.vue | 27 + .../ui/navigation-menu/NavigationMenuList.vue | 30 + .../navigation-menu/NavigationMenuTrigger.vue | 35 + .../NavigationMenuViewport.vue | 34 + .../js/components/ui/navigation-menu/index.ts | 14 + .../js/components/ui/pin-input/PinInput.vue | 25 + .../components/ui/pin-input/PinInputGroup.vue | 21 + .../ui/pin-input/PinInputSeparator.vue | 19 + .../components/ui/pin-input/PinInputSlot.vue | 21 + resources/js/components/ui/pin-input/index.ts | 4 + .../js/components/ui/separator/Separator.vue | 28 + resources/js/components/ui/separator/index.ts | 1 + resources/js/components/ui/sheet/Sheet.vue | 17 + .../js/components/ui/sheet/SheetClose.vue | 14 + .../js/components/ui/sheet/SheetContent.vue | 63 + .../components/ui/sheet/SheetDescription.vue | 23 + .../js/components/ui/sheet/SheetFooter.vue | 16 + .../js/components/ui/sheet/SheetHeader.vue | 15 + .../js/components/ui/sheet/SheetOverlay.vue | 23 + .../js/components/ui/sheet/SheetTitle.vue | 23 + .../js/components/ui/sheet/SheetTrigger.vue | 14 + resources/js/components/ui/sheet/index.ts | 8 + .../js/components/ui/sidebar/Sidebar.vue | 96 + .../components/ui/sidebar/SidebarContent.vue | 18 + .../components/ui/sidebar/SidebarFooter.vue | 18 + .../js/components/ui/sidebar/SidebarGroup.vue | 18 + .../ui/sidebar/SidebarGroupAction.vue | 27 + .../ui/sidebar/SidebarGroupContent.vue | 18 + .../ui/sidebar/SidebarGroupLabel.vue | 25 + .../components/ui/sidebar/SidebarHeader.vue | 18 + .../js/components/ui/sidebar/SidebarInput.vue | 22 + .../js/components/ui/sidebar/SidebarInset.vue | 21 + .../js/components/ui/sidebar/SidebarMenu.vue | 18 + .../ui/sidebar/SidebarMenuAction.vue | 34 + .../ui/sidebar/SidebarMenuBadge.vue | 26 + .../ui/sidebar/SidebarMenuButton.vue | 49 + .../ui/sidebar/SidebarMenuButtonChild.vue | 34 + .../components/ui/sidebar/SidebarMenuItem.vue | 18 + .../ui/sidebar/SidebarMenuSkeleton.vue | 34 + .../components/ui/sidebar/SidebarMenuSub.vue | 22 + .../ui/sidebar/SidebarMenuSubButton.vue | 36 + .../ui/sidebar/SidebarMenuSubItem.vue | 18 + .../components/ui/sidebar/SidebarProvider.vue | 81 + .../js/components/ui/sidebar/SidebarRail.vue | 33 + .../ui/sidebar/SidebarSeparator.vue | 19 + .../components/ui/sidebar/SidebarTrigger.vue | 27 + resources/js/components/ui/sidebar/index.ts | 60 + resources/js/components/ui/sidebar/utils.ts | 19 + .../js/components/ui/skeleton/Skeleton.vue | 17 + resources/js/components/ui/skeleton/index.ts | 1 + .../js/components/ui/spinner/Spinner.vue | 17 + resources/js/components/ui/spinner/index.ts | 1 + .../js/components/ui/tooltip/Tooltip.vue | 17 + .../components/ui/tooltip/TooltipContent.vue | 33 + .../components/ui/tooltip/TooltipProvider.vue | 13 + .../components/ui/tooltip/TooltipTrigger.vue | 14 + resources/js/components/ui/tooltip/index.ts | 4 + resources/js/composables/useAppearance.ts | 99 + resources/js/composables/useInitials.ts | 14 + resources/js/composables/useTwoFactorAuth.ts | 104 + resources/js/layouts/AppLayout.vue | 18 + resources/js/layouts/AuthLayout.vue | 14 + resources/js/layouts/app/AppHeaderLayout.vue | 23 + resources/js/layouts/app/AppSidebarLayout.vue | 25 + resources/js/layouts/auth/AuthCardLayout.vue | 50 + .../js/layouts/auth/AuthSimpleLayout.vue | 43 + resources/js/layouts/auth/AuthSplitLayout.vue | 56 + resources/js/layouts/settings/Layout.vue | 72 + resources/js/lib/utils.ts | 18 + resources/js/pages/Dashboard.vue | 129 + resources/js/pages/Welcome.vue | 842 ++ resources/js/pages/actors/Show.vue | 227 + resources/js/pages/admin/movies/Edit.vue | 286 + resources/js/pages/admin/movies/Index.vue | 295 + resources/js/pages/admin/movies/List.vue | 245 + resources/js/pages/auth/ConfirmPassword.vue | 53 + resources/js/pages/auth/ForgotPassword.vue | 65 + resources/js/pages/auth/Login.vue | 110 + resources/js/pages/auth/Register.vue | 108 + resources/js/pages/auth/ResetPassword.vue | 89 + .../js/pages/auth/TwoFactorChallenge.vue | 141 + resources/js/pages/auth/VerifyEmail.vue | 49 + resources/js/pages/directors/Show.vue | 227 + resources/js/pages/genres/Show.vue | 227 + resources/js/pages/movies/Index.vue | 240 + resources/js/pages/movies/Show.vue | 170 + resources/js/pages/settings/Appearance.vue | 34 + resources/js/pages/settings/Password.vue | 114 + resources/js/pages/settings/Profile.vue | 128 + resources/js/pages/settings/TwoFactor.vue | 121 + resources/js/pages/studios/Show.vue | 227 + resources/js/routes/admin/index.ts | 7 + resources/js/routes/admin/movies/index.ts | 660 ++ resources/js/routes/api/index.ts | 7 + .../api/movies/entities/actors/index.ts | 105 + .../api/movies/entities/directors/index.ts | 105 + .../api/movies/entities/genres/index.ts | 105 + .../js/routes/api/movies/entities/index.ts | 13 + .../api/movies/entities/studios/index.ts | 105 + resources/js/routes/api/movies/index.ts | 189 + resources/js/routes/appearance/index.ts | 80 + resources/js/routes/boost/index.ts | 57 + resources/js/routes/entities/index.ts | 7 + .../js/routes/entities/pages/actors/index.ts | 105 + .../routes/entities/pages/directors/index.ts | 105 + .../js/routes/entities/pages/genres/index.ts | 105 + resources/js/routes/entities/pages/index.ts | 13 + .../js/routes/entities/pages/studios/index.ts | 105 + resources/js/routes/index.ts | 366 + resources/js/routes/login/index.ts | 62 + resources/js/routes/movies/index.ts | 187 + resources/js/routes/password/confirm/index.ts | 62 + resources/js/routes/password/index.ts | 466 + resources/js/routes/profile/index.ts | 221 + resources/js/routes/register/index.ts | 62 + resources/js/routes/storage/index.ts | 98 + resources/js/routes/two-factor/index.ts | 654 ++ resources/js/routes/two-factor/login/index.ts | 62 + resources/js/routes/user-password/index.ts | 154 + resources/js/routes/verification/index.ts | 243 + resources/js/ssr.ts | 24 + resources/js/types/globals.d.ts | 26 + resources/js/types/index.d.ts | 39 + resources/js/wayfinder/index.ts | 145 + resources/views/app.blade.php | 49 + routes/console.php | 8 + routes/settings.php | 28 + routes/web.php | 17 + storage/app/.gitignore | 4 + storage/app/private/.gitignore | 2 + storage/app/public/.gitignore | 2 + storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + tests/Feature/Auth/AuthenticationTest.php | 84 + tests/Feature/Auth/EmailVerificationTest.php | 95 + .../Feature/Auth/PasswordConfirmationTest.php | 22 + tests/Feature/Auth/PasswordResetTest.php | 73 + tests/Feature/Auth/RegistrationTest.php | 19 + tests/Feature/Auth/TwoFactorChallengeTest.php | 45 + .../Auth/VerificationNotificationTest.php | 29 + tests/Feature/DashboardTest.php | 16 + tests/Feature/ExampleTest.php | 7 + tests/Feature/Movies/AdminAcceptMovieTest.php | 117 + tests/Feature/Movies/AdminExistsMovieTest.php | 52 + tests/Feature/Movies/AdminManageMovieTest.php | 54 + .../Feature/Movies/AdminSearchMoviesTest.php | 65 + .../Movies/DashboardLatestMoviesTest.php | 46 + .../Movies/PublicEntitiesBrowseTest.php | 117 + .../Feature/Movies/PublicMoviesBrowseTest.php | 36 + .../PublicMoviesSortingFilteringTest.php | 75 + tests/Feature/Settings/PasswordUpdateTest.php | 50 + tests/Feature/Settings/ProfileUpdateTest.php | 85 + .../Settings/TwoFactorAuthenticationTest.php | 79 + tests/Pest.php | 47 + tests/TestCase.php | 10 + tests/Unit/ExampleTest.php | 5 + .../GetActorWithMoviesServiceTest.php | 38 + .../GetDirectorWithMoviesServiceTest.php | 37 + .../GetGenreWithMoviesServiceTest.php | 34 + .../GetStudioWithMoviesServiceTest.php | 37 + tests/Unit/Movies/ListMoviesServiceTest.php | 32 + tests/Unit/Movies/OmdbMovieProviderTest.php | 100 + tests/Unit/Movies/ShowMovieServiceTest.php | 51 + .../Movies/UpsertMovieFromProviderTest.php | 90 + tsconfig.json | 126 + vite.config.ts | 27 + 515 files changed, 41441 insertions(+), 2 deletions(-) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 app/Actions/Fortify/CreateNewUser.php create mode 100644 app/Actions/Fortify/PasswordValidationRules.php create mode 100644 app/Actions/Fortify/ResetUserPassword.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/Settings/PasswordController.php create mode 100644 app/Http/Controllers/Settings/ProfileController.php create mode 100644 app/Http/Controllers/Settings/TwoFactorAuthenticationController.php create mode 100644 app/Http/Middleware/HandleAppearance.php create mode 100644 app/Http/Middleware/HandleInertiaRequests.php create mode 100644 app/Http/Requests/Settings/ProfileUpdateRequest.php create mode 100644 app/Http/Requests/Settings/TwoFactorAuthenticationRequest.php create mode 100644 app/Models/User.php create mode 100644 app/Modules/Movies/Http/Controllers/Admin/AcceptMovieController.php create mode 100644 app/Modules/Movies/Http/Controllers/Admin/DeleteMovieController.php create mode 100644 app/Modules/Movies/Http/Controllers/Admin/EditMoviePageController.php create mode 100644 app/Modules/Movies/Http/Controllers/Admin/ExistsMovieController.php create mode 100644 app/Modules/Movies/Http/Controllers/Admin/MoviesListPageController.php create mode 100644 app/Modules/Movies/Http/Controllers/Admin/MoviesPageController.php create mode 100644 app/Modules/Movies/Http/Controllers/Admin/SearchMoviesController.php create mode 100644 app/Modules/Movies/Http/Controllers/Admin/UpdateMovieController.php create mode 100644 app/Modules/Movies/Http/Controllers/Browse/Entities/ActorShowController.php create mode 100644 app/Modules/Movies/Http/Controllers/Browse/Entities/DirectorShowController.php create mode 100644 app/Modules/Movies/Http/Controllers/Browse/Entities/GenreShowController.php create mode 100644 app/Modules/Movies/Http/Controllers/Browse/Entities/StudioShowController.php create mode 100644 app/Modules/Movies/Http/Controllers/Browse/MovieShowController.php create mode 100644 app/Modules/Movies/Http/Controllers/Browse/MoviesIndexController.php create mode 100644 app/Modules/Movies/Http/Controllers/Pages/ActorsShowPageController.php create mode 100644 app/Modules/Movies/Http/Controllers/Pages/DirectorsShowPageController.php create mode 100644 app/Modules/Movies/Http/Controllers/Pages/GenresShowPageController.php create mode 100644 app/Modules/Movies/Http/Controllers/Pages/PublicMovieShowPageController.php create mode 100644 app/Modules/Movies/Http/Controllers/Pages/PublicMoviesPageController.php create mode 100644 app/Modules/Movies/Http/Controllers/Pages/StudiosShowPageController.php create mode 100644 app/Modules/Movies/Http/Requests/AcceptMovieRequest.php create mode 100644 app/Modules/Movies/Http/Requests/DestroyMovieRequest.php create mode 100644 app/Modules/Movies/Http/Requests/ExistsMovieRequest.php create mode 100644 app/Modules/Movies/Http/Requests/SearchMoviesRequest.php create mode 100644 app/Modules/Movies/Http/Requests/UpdateMovieRequest.php create mode 100644 app/Modules/Movies/Models/Actor.php create mode 100644 app/Modules/Movies/Models/Country.php create mode 100644 app/Modules/Movies/Models/Director.php create mode 100644 app/Modules/Movies/Models/Genre.php create mode 100644 app/Modules/Movies/Models/Language.php create mode 100644 app/Modules/Movies/Models/Movie.php create mode 100644 app/Modules/Movies/Models/Studio.php create mode 100644 app/Modules/Movies/Providers/MoviesServiceProvider.php create mode 100644 app/Modules/Movies/README.md create mode 100644 app/Modules/Movies/Services/Browse/Entities/GetActorWithMoviesService.php create mode 100644 app/Modules/Movies/Services/Browse/Entities/GetDirectorWithMoviesService.php create mode 100644 app/Modules/Movies/Services/Browse/Entities/GetGenreWithMoviesService.php create mode 100644 app/Modules/Movies/Services/Browse/Entities/GetStudioWithMoviesService.php create mode 100644 app/Modules/Movies/Services/Browse/ListMoviesService.php create mode 100644 app/Modules/Movies/Services/Browse/ShowMovieService.php create mode 100644 app/Modules/Movies/Services/CheckMovieExistsService.php create mode 100644 app/Modules/Movies/Services/Contracts/CheckMovieExistsServiceInterface.php create mode 100644 app/Modules/Movies/Services/Contracts/DeleteMovieServiceInterface.php create mode 100644 app/Modules/Movies/Services/Contracts/GetActorWithMoviesServiceInterface.php create mode 100644 app/Modules/Movies/Services/Contracts/GetDirectorWithMoviesServiceInterface.php create mode 100644 app/Modules/Movies/Services/Contracts/GetGenreWithMoviesServiceInterface.php create mode 100644 app/Modules/Movies/Services/Contracts/GetStudioWithMoviesServiceInterface.php create mode 100644 app/Modules/Movies/Services/Contracts/ListMoviesServiceInterface.php create mode 100644 app/Modules/Movies/Services/Contracts/MovieProvider.php create mode 100644 app/Modules/Movies/Services/Contracts/ShowMovieServiceInterface.php create mode 100644 app/Modules/Movies/Services/Contracts/UpdateMovieServiceInterface.php create mode 100644 app/Modules/Movies/Services/Contracts/UpsertMovieServiceInterface.php create mode 100644 app/Modules/Movies/Services/DeleteMovieService.php create mode 100644 app/Modules/Movies/Services/Omdb/OmdbMovieProvider.php create mode 100644 app/Modules/Movies/Services/UpdateMovieService.php create mode 100644 app/Modules/Movies/Services/UpsertMovieFromProvider.php create mode 100644 app/Modules/Movies/routes/admin.php create mode 100644 app/Modules/Movies/routes/api.php create mode 100644 app/Modules/Movies/routes/api_actors.php create mode 100644 app/Modules/Movies/routes/api_directors.php create mode 100644 app/Modules/Movies/routes/api_genres.php create mode 100644 app/Modules/Movies/routes/api_studios.php create mode 100644 app/Modules/Movies/routes/pages.php create mode 100644 app/Modules/Movies/routes/pages_actors.php create mode 100644 app/Modules/Movies/routes/pages_directors.php create mode 100644 app/Modules/Movies/routes/pages_genres.php create mode 100644 app/Modules/Movies/routes/pages_studios.php create mode 100644 app/Modules/Movies/routes/public.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Providers/FortifyServiceProvider.php create mode 100755 artisan create mode 100644 bootstrap/app.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 bootstrap/providers.php create mode 100644 components.json create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/cache.php create mode 100644 config/database.php create mode 100644 config/filesystems.php create mode 100644 config/fortify.php create mode 100644 config/inertia.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/movies.php create mode 100644 config/queue.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 database/.gitignore create mode 100644 database/factories/ActorFactory.php create mode 100644 database/factories/CountryFactory.php create mode 100644 database/factories/DirectorFactory.php create mode 100644 database/factories/GenreFactory.php create mode 100644 database/factories/LanguageFactory.php create mode 100644 database/factories/MovieFactory.php create mode 100644 database/factories/StudioFactory.php create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/0001_01_01_000000_create_users_table.php create mode 100644 database/migrations/0001_01_01_000001_create_cache_table.php create mode 100644 database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100644 database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php create mode 100644 database/migrations/2025_12_05_000001_create_movies_tables.php create mode 100644 database/migrations/2025_12_06_014900_make_supporting_names_case_insensitive_unique.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 eslint.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 phpunit.xml create mode 100644 public/.htaccess create mode 100644 public/apple-touch-icon.png create mode 100644 public/build/assets/AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js create mode 100644 public/build/assets/AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js create mode 100644 public/build/assets/Appearance-x5-Kktlh.js create mode 100644 public/build/assets/AuthLayout.vue_vue_type_script_setup_true_lang-B14CUTB5.js create mode 100644 public/build/assets/ConfirmPassword-wh4eUhzq.js create mode 100644 public/build/assets/Dashboard-BZ90YdF3.js create mode 100644 public/build/assets/DialogTitle.vue_vue_type_script_setup_true_lang-Dg2xd9QK.js create mode 100644 public/build/assets/Edit-CBkUZj2d.css create mode 100644 public/build/assets/Edit-CORuyxK8.js create mode 100644 public/build/assets/ForgotPassword-BI_N76PO.js create mode 100644 public/build/assets/Index-BJjYncZL.css create mode 100644 public/build/assets/Index-BrX3yilR.css create mode 100644 public/build/assets/Index-CYUFIW2Y.js create mode 100644 public/build/assets/Index-Dc3cIue4.js create mode 100644 public/build/assets/Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js create mode 100644 public/build/assets/InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js create mode 100644 public/build/assets/Label.vue_vue_type_script_setup_true_lang-Dbqibcwo.js create mode 100644 public/build/assets/Layout.vue_vue_type_script_setup_true_lang-ROf3tZlv.js create mode 100644 public/build/assets/List-CVA9NIjL.css create mode 100644 public/build/assets/List-C_4Kh8Sa.js create mode 100644 public/build/assets/Login-4gIV6O-Y.js create mode 100644 public/build/assets/Password-Cz_oOx7m.js create mode 100644 public/build/assets/PinInputSlot.vue_vue_type_script_setup_true_lang-D_qQ1GfR.js create mode 100644 public/build/assets/Profile-DvBzD9G7.js create mode 100644 public/build/assets/Register-kQGfWF-K.js create mode 100644 public/build/assets/ResetPassword-BPOrjW9k.js create mode 100644 public/build/assets/RovingFocusGroup-CNFroA6Y.js create mode 100644 public/build/assets/Show-B-qGUz9l.css create mode 100644 public/build/assets/Show-B81d5hyh.js create mode 100644 public/build/assets/Show-BCIzyp2I.js create mode 100644 public/build/assets/Show-BGTgh0m1.js create mode 100644 public/build/assets/Show-CLkQumZS.js create mode 100644 public/build/assets/Show-Cm2t8bQb.css create mode 100644 public/build/assets/Show-Csw6sC-4.css create mode 100644 public/build/assets/Show-DB_iXr9H.css create mode 100644 public/build/assets/Show-u0mnbIJy.css create mode 100644 public/build/assets/Show-y_rWxQ3Z.js create mode 100644 public/build/assets/Spinner.vue_vue_type_script_setup_true_lang-BPOcqWqa.js create mode 100644 public/build/assets/TextLink.vue_vue_type_script_setup_true_lang-JYycsYY3.js create mode 100644 public/build/assets/TwoFactor-CEzdBq7S.js create mode 100644 public/build/assets/TwoFactorChallenge-BSzmROh9.js create mode 100644 public/build/assets/VerifyEmail-DZQcbTya.js create mode 100644 public/build/assets/VisuallyHidden-Cu70tzB6.js create mode 100644 public/build/assets/VisuallyHiddenInput-Drd3EMOd.js create mode 100644 public/build/assets/Welcome-1IB3Dtj8.js create mode 100644 public/build/assets/_plugin-vue_export-helper-DlAUqK2U.js create mode 100644 public/build/assets/app-BUIfoF4D.css create mode 100644 public/build/assets/app-CClrM5Yi.js create mode 100644 public/build/assets/check-BNffy8wt.js create mode 100644 public/build/assets/createLucideIcon-ZFd4jktC.js create mode 100644 public/build/assets/index--H2rh_A_.js create mode 100644 public/build/assets/index-BCC4ahRc.js create mode 100644 public/build/assets/index-C4J_hXM0.js create mode 100644 public/build/assets/index-DZxzsgmi.js create mode 100644 public/build/assets/index-vZYIBGLo.js create mode 100644 public/build/assets/useArrowNavigation-C6Y-ieo6.js create mode 100644 public/build/assets/useForwardExpose-BhawR5VU.js create mode 100644 public/build/manifest.json create mode 100644 public/favicon.ico create mode 100644 public/favicon.svg create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 resources/css/app.css create mode 100644 resources/js/actions/App/Http/Controllers/Settings/PasswordController.ts create mode 100644 resources/js/actions/App/Http/Controllers/Settings/ProfileController.ts create mode 100644 resources/js/actions/App/Http/Controllers/Settings/TwoFactorAuthenticationController.ts create mode 100644 resources/js/actions/App/Http/Controllers/Settings/index.ts create mode 100644 resources/js/actions/App/Http/Controllers/index.ts create mode 100644 resources/js/actions/App/Http/index.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Admin/AcceptMovieController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Admin/DeleteMovieController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Admin/EditMoviePageController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Admin/ExistsMovieController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Admin/MoviesListPageController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Admin/MoviesPageController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Admin/SearchMoviesController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Admin/UpdateMovieController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Admin/index.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Browse/Entities/ActorShowController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Browse/Entities/DirectorShowController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Browse/Entities/GenreShowController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Browse/Entities/StudioShowController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Browse/Entities/index.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Browse/MovieShowController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Browse/MoviesIndexController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Browse/index.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Pages/ActorsShowPageController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Pages/DirectorsShowPageController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Pages/GenresShowPageController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Pages/PublicMovieShowPageController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Pages/PublicMoviesPageController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Pages/StudiosShowPageController.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/Pages/index.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/Controllers/index.ts create mode 100644 resources/js/actions/App/Modules/Movies/Http/index.ts create mode 100644 resources/js/actions/App/Modules/Movies/index.ts create mode 100644 resources/js/actions/App/Modules/index.ts create mode 100644 resources/js/actions/App/index.ts create mode 100644 resources/js/actions/Illuminate/Routing/RedirectController.ts create mode 100644 resources/js/actions/Illuminate/Routing/index.ts create mode 100644 resources/js/actions/Illuminate/index.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/AuthenticatedSessionController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/ConfirmablePasswordController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/ConfirmedPasswordStatusController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/ConfirmedTwoFactorAuthenticationController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/EmailVerificationNotificationController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/EmailVerificationPromptController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/NewPasswordController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/PasswordResetLinkController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/RecoveryCodeController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/RegisteredUserController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/TwoFactorAuthenticatedSessionController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/TwoFactorAuthenticationController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/TwoFactorQrCodeController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/TwoFactorSecretKeyController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/VerifyEmailController.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/Controllers/index.ts create mode 100644 resources/js/actions/Laravel/Fortify/Http/index.ts create mode 100644 resources/js/actions/Laravel/Fortify/index.ts create mode 100644 resources/js/actions/Laravel/index.ts create mode 100644 resources/js/app.ts create mode 100644 resources/js/components/AlertError.vue create mode 100644 resources/js/components/AppContent.vue create mode 100644 resources/js/components/AppHeader.vue create mode 100644 resources/js/components/AppLogo.vue create mode 100644 resources/js/components/AppLogoIcon.vue create mode 100644 resources/js/components/AppShell.vue create mode 100644 resources/js/components/AppSidebar.vue create mode 100644 resources/js/components/AppSidebarHeader.vue create mode 100644 resources/js/components/AppearanceTabs.vue create mode 100644 resources/js/components/Breadcrumbs.vue create mode 100644 resources/js/components/DeleteUser.vue create mode 100644 resources/js/components/Heading.vue create mode 100644 resources/js/components/HeadingSmall.vue create mode 100644 resources/js/components/Icon.vue create mode 100644 resources/js/components/InputError.vue create mode 100644 resources/js/components/NavFooter.vue create mode 100644 resources/js/components/NavMain.vue create mode 100644 resources/js/components/NavUser.vue create mode 100644 resources/js/components/PlaceholderPattern.vue create mode 100644 resources/js/components/TextLink.vue create mode 100644 resources/js/components/TwoFactorRecoveryCodes.vue create mode 100644 resources/js/components/TwoFactorSetupModal.vue create mode 100644 resources/js/components/UserInfo.vue create mode 100644 resources/js/components/UserMenuContent.vue create mode 100644 resources/js/components/ui/alert/Alert.vue create mode 100644 resources/js/components/ui/alert/AlertDescription.vue create mode 100644 resources/js/components/ui/alert/AlertTitle.vue create mode 100644 resources/js/components/ui/alert/index.ts create mode 100644 resources/js/components/ui/avatar/Avatar.vue create mode 100644 resources/js/components/ui/avatar/AvatarFallback.vue create mode 100644 resources/js/components/ui/avatar/AvatarImage.vue create mode 100644 resources/js/components/ui/avatar/index.ts create mode 100644 resources/js/components/ui/badge/Badge.vue create mode 100644 resources/js/components/ui/badge/index.ts create mode 100644 resources/js/components/ui/breadcrumb/Breadcrumb.vue create mode 100644 resources/js/components/ui/breadcrumb/BreadcrumbEllipsis.vue create mode 100644 resources/js/components/ui/breadcrumb/BreadcrumbItem.vue create mode 100644 resources/js/components/ui/breadcrumb/BreadcrumbLink.vue create mode 100644 resources/js/components/ui/breadcrumb/BreadcrumbList.vue create mode 100644 resources/js/components/ui/breadcrumb/BreadcrumbPage.vue create mode 100644 resources/js/components/ui/breadcrumb/BreadcrumbSeparator.vue create mode 100644 resources/js/components/ui/breadcrumb/index.ts create mode 100644 resources/js/components/ui/button/Button.vue create mode 100644 resources/js/components/ui/button/index.ts create mode 100644 resources/js/components/ui/card/Card.vue create mode 100644 resources/js/components/ui/card/CardAction.vue create mode 100644 resources/js/components/ui/card/CardContent.vue create mode 100644 resources/js/components/ui/card/CardDescription.vue create mode 100644 resources/js/components/ui/card/CardFooter.vue create mode 100644 resources/js/components/ui/card/CardHeader.vue create mode 100644 resources/js/components/ui/card/CardTitle.vue create mode 100644 resources/js/components/ui/card/index.ts create mode 100644 resources/js/components/ui/checkbox/Checkbox.vue create mode 100644 resources/js/components/ui/checkbox/index.ts create mode 100644 resources/js/components/ui/collapsible/Collapsible.vue create mode 100644 resources/js/components/ui/collapsible/CollapsibleContent.vue create mode 100644 resources/js/components/ui/collapsible/CollapsibleTrigger.vue create mode 100644 resources/js/components/ui/collapsible/index.ts create mode 100644 resources/js/components/ui/dialog/Dialog.vue create mode 100644 resources/js/components/ui/dialog/DialogClose.vue create mode 100644 resources/js/components/ui/dialog/DialogContent.vue create mode 100644 resources/js/components/ui/dialog/DialogDescription.vue create mode 100644 resources/js/components/ui/dialog/DialogFooter.vue create mode 100644 resources/js/components/ui/dialog/DialogHeader.vue create mode 100644 resources/js/components/ui/dialog/DialogOverlay.vue create mode 100644 resources/js/components/ui/dialog/DialogScrollContent.vue create mode 100644 resources/js/components/ui/dialog/DialogTitle.vue create mode 100644 resources/js/components/ui/dialog/DialogTrigger.vue create mode 100644 resources/js/components/ui/dialog/index.ts create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenu.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuContent.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuGroup.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuItem.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuLabel.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuRadioItem.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuSeparator.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuShortcut.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuSub.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuSubContent.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue create mode 100644 resources/js/components/ui/dropdown-menu/DropdownMenuTrigger.vue create mode 100644 resources/js/components/ui/dropdown-menu/index.ts create mode 100644 resources/js/components/ui/input/Input.vue create mode 100644 resources/js/components/ui/input/index.ts create mode 100644 resources/js/components/ui/label/Label.vue create mode 100644 resources/js/components/ui/label/index.ts create mode 100644 resources/js/components/ui/navigation-menu/NavigationMenu.vue create mode 100644 resources/js/components/ui/navigation-menu/NavigationMenuContent.vue create mode 100644 resources/js/components/ui/navigation-menu/NavigationMenuIndicator.vue create mode 100644 resources/js/components/ui/navigation-menu/NavigationMenuItem.vue create mode 100644 resources/js/components/ui/navigation-menu/NavigationMenuLink.vue create mode 100644 resources/js/components/ui/navigation-menu/NavigationMenuList.vue create mode 100644 resources/js/components/ui/navigation-menu/NavigationMenuTrigger.vue create mode 100644 resources/js/components/ui/navigation-menu/NavigationMenuViewport.vue create mode 100644 resources/js/components/ui/navigation-menu/index.ts create mode 100644 resources/js/components/ui/pin-input/PinInput.vue create mode 100644 resources/js/components/ui/pin-input/PinInputGroup.vue create mode 100644 resources/js/components/ui/pin-input/PinInputSeparator.vue create mode 100644 resources/js/components/ui/pin-input/PinInputSlot.vue create mode 100644 resources/js/components/ui/pin-input/index.ts create mode 100644 resources/js/components/ui/separator/Separator.vue create mode 100644 resources/js/components/ui/separator/index.ts create mode 100644 resources/js/components/ui/sheet/Sheet.vue create mode 100644 resources/js/components/ui/sheet/SheetClose.vue create mode 100644 resources/js/components/ui/sheet/SheetContent.vue create mode 100644 resources/js/components/ui/sheet/SheetDescription.vue create mode 100644 resources/js/components/ui/sheet/SheetFooter.vue create mode 100644 resources/js/components/ui/sheet/SheetHeader.vue create mode 100644 resources/js/components/ui/sheet/SheetOverlay.vue create mode 100644 resources/js/components/ui/sheet/SheetTitle.vue create mode 100644 resources/js/components/ui/sheet/SheetTrigger.vue create mode 100644 resources/js/components/ui/sheet/index.ts create mode 100644 resources/js/components/ui/sidebar/Sidebar.vue create mode 100644 resources/js/components/ui/sidebar/SidebarContent.vue create mode 100644 resources/js/components/ui/sidebar/SidebarFooter.vue create mode 100644 resources/js/components/ui/sidebar/SidebarGroup.vue create mode 100644 resources/js/components/ui/sidebar/SidebarGroupAction.vue create mode 100644 resources/js/components/ui/sidebar/SidebarGroupContent.vue create mode 100644 resources/js/components/ui/sidebar/SidebarGroupLabel.vue create mode 100644 resources/js/components/ui/sidebar/SidebarHeader.vue create mode 100644 resources/js/components/ui/sidebar/SidebarInput.vue create mode 100644 resources/js/components/ui/sidebar/SidebarInset.vue create mode 100644 resources/js/components/ui/sidebar/SidebarMenu.vue create mode 100644 resources/js/components/ui/sidebar/SidebarMenuAction.vue create mode 100644 resources/js/components/ui/sidebar/SidebarMenuBadge.vue create mode 100644 resources/js/components/ui/sidebar/SidebarMenuButton.vue create mode 100644 resources/js/components/ui/sidebar/SidebarMenuButtonChild.vue create mode 100644 resources/js/components/ui/sidebar/SidebarMenuItem.vue create mode 100644 resources/js/components/ui/sidebar/SidebarMenuSkeleton.vue create mode 100644 resources/js/components/ui/sidebar/SidebarMenuSub.vue create mode 100644 resources/js/components/ui/sidebar/SidebarMenuSubButton.vue create mode 100644 resources/js/components/ui/sidebar/SidebarMenuSubItem.vue create mode 100644 resources/js/components/ui/sidebar/SidebarProvider.vue create mode 100644 resources/js/components/ui/sidebar/SidebarRail.vue create mode 100644 resources/js/components/ui/sidebar/SidebarSeparator.vue create mode 100644 resources/js/components/ui/sidebar/SidebarTrigger.vue create mode 100644 resources/js/components/ui/sidebar/index.ts create mode 100644 resources/js/components/ui/sidebar/utils.ts create mode 100644 resources/js/components/ui/skeleton/Skeleton.vue create mode 100644 resources/js/components/ui/skeleton/index.ts create mode 100644 resources/js/components/ui/spinner/Spinner.vue create mode 100644 resources/js/components/ui/spinner/index.ts create mode 100644 resources/js/components/ui/tooltip/Tooltip.vue create mode 100644 resources/js/components/ui/tooltip/TooltipContent.vue create mode 100644 resources/js/components/ui/tooltip/TooltipProvider.vue create mode 100644 resources/js/components/ui/tooltip/TooltipTrigger.vue create mode 100644 resources/js/components/ui/tooltip/index.ts create mode 100644 resources/js/composables/useAppearance.ts create mode 100644 resources/js/composables/useInitials.ts create mode 100644 resources/js/composables/useTwoFactorAuth.ts create mode 100644 resources/js/layouts/AppLayout.vue create mode 100644 resources/js/layouts/AuthLayout.vue create mode 100644 resources/js/layouts/app/AppHeaderLayout.vue create mode 100644 resources/js/layouts/app/AppSidebarLayout.vue create mode 100644 resources/js/layouts/auth/AuthCardLayout.vue create mode 100644 resources/js/layouts/auth/AuthSimpleLayout.vue create mode 100644 resources/js/layouts/auth/AuthSplitLayout.vue create mode 100644 resources/js/layouts/settings/Layout.vue create mode 100644 resources/js/lib/utils.ts create mode 100644 resources/js/pages/Dashboard.vue create mode 100644 resources/js/pages/Welcome.vue create mode 100644 resources/js/pages/actors/Show.vue create mode 100644 resources/js/pages/admin/movies/Edit.vue create mode 100644 resources/js/pages/admin/movies/Index.vue create mode 100644 resources/js/pages/admin/movies/List.vue create mode 100644 resources/js/pages/auth/ConfirmPassword.vue create mode 100644 resources/js/pages/auth/ForgotPassword.vue create mode 100644 resources/js/pages/auth/Login.vue create mode 100644 resources/js/pages/auth/Register.vue create mode 100644 resources/js/pages/auth/ResetPassword.vue create mode 100644 resources/js/pages/auth/TwoFactorChallenge.vue create mode 100644 resources/js/pages/auth/VerifyEmail.vue create mode 100644 resources/js/pages/directors/Show.vue create mode 100644 resources/js/pages/genres/Show.vue create mode 100644 resources/js/pages/movies/Index.vue create mode 100644 resources/js/pages/movies/Show.vue create mode 100644 resources/js/pages/settings/Appearance.vue create mode 100644 resources/js/pages/settings/Password.vue create mode 100644 resources/js/pages/settings/Profile.vue create mode 100644 resources/js/pages/settings/TwoFactor.vue create mode 100644 resources/js/pages/studios/Show.vue create mode 100644 resources/js/routes/admin/index.ts create mode 100644 resources/js/routes/admin/movies/index.ts create mode 100644 resources/js/routes/api/index.ts create mode 100644 resources/js/routes/api/movies/entities/actors/index.ts create mode 100644 resources/js/routes/api/movies/entities/directors/index.ts create mode 100644 resources/js/routes/api/movies/entities/genres/index.ts create mode 100644 resources/js/routes/api/movies/entities/index.ts create mode 100644 resources/js/routes/api/movies/entities/studios/index.ts create mode 100644 resources/js/routes/api/movies/index.ts create mode 100644 resources/js/routes/appearance/index.ts create mode 100644 resources/js/routes/boost/index.ts create mode 100644 resources/js/routes/entities/index.ts create mode 100644 resources/js/routes/entities/pages/actors/index.ts create mode 100644 resources/js/routes/entities/pages/directors/index.ts create mode 100644 resources/js/routes/entities/pages/genres/index.ts create mode 100644 resources/js/routes/entities/pages/index.ts create mode 100644 resources/js/routes/entities/pages/studios/index.ts create mode 100644 resources/js/routes/index.ts create mode 100644 resources/js/routes/login/index.ts create mode 100644 resources/js/routes/movies/index.ts create mode 100644 resources/js/routes/password/confirm/index.ts create mode 100644 resources/js/routes/password/index.ts create mode 100644 resources/js/routes/profile/index.ts create mode 100644 resources/js/routes/register/index.ts create mode 100644 resources/js/routes/storage/index.ts create mode 100644 resources/js/routes/two-factor/index.ts create mode 100644 resources/js/routes/two-factor/login/index.ts create mode 100644 resources/js/routes/user-password/index.ts create mode 100644 resources/js/routes/verification/index.ts create mode 100644 resources/js/ssr.ts create mode 100644 resources/js/types/globals.d.ts create mode 100644 resources/js/types/index.d.ts create mode 100644 resources/js/wayfinder/index.ts create mode 100644 resources/views/app.blade.php create mode 100644 routes/console.php create mode 100644 routes/settings.php create mode 100644 routes/web.php create mode 100644 storage/app/.gitignore create mode 100644 storage/app/private/.gitignore create mode 100644 storage/app/public/.gitignore create mode 100644 storage/framework/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/cache/data/.gitignore create mode 100644 storage/framework/sessions/.gitignore create mode 100644 storage/framework/testing/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/logs/.gitignore 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/RegistrationTest.php create mode 100644 tests/Feature/Auth/TwoFactorChallengeTest.php create mode 100644 tests/Feature/Auth/VerificationNotificationTest.php create mode 100644 tests/Feature/DashboardTest.php create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/Feature/Movies/AdminAcceptMovieTest.php create mode 100644 tests/Feature/Movies/AdminExistsMovieTest.php create mode 100644 tests/Feature/Movies/AdminManageMovieTest.php create mode 100644 tests/Feature/Movies/AdminSearchMoviesTest.php create mode 100644 tests/Feature/Movies/DashboardLatestMoviesTest.php create mode 100644 tests/Feature/Movies/PublicEntitiesBrowseTest.php create mode 100644 tests/Feature/Movies/PublicMoviesBrowseTest.php create mode 100644 tests/Feature/Movies/PublicMoviesSortingFilteringTest.php create mode 100644 tests/Feature/Settings/PasswordUpdateTest.php create mode 100644 tests/Feature/Settings/ProfileUpdateTest.php create mode 100644 tests/Feature/Settings/TwoFactorAuthenticationTest.php create mode 100644 tests/Pest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 tests/Unit/Movies/Entities/GetActorWithMoviesServiceTest.php create mode 100644 tests/Unit/Movies/Entities/GetDirectorWithMoviesServiceTest.php create mode 100644 tests/Unit/Movies/Entities/GetGenreWithMoviesServiceTest.php create mode 100644 tests/Unit/Movies/Entities/GetStudioWithMoviesServiceTest.php create mode 100644 tests/Unit/Movies/ListMoviesServiceTest.php create mode 100644 tests/Unit/Movies/OmdbMovieProviderTest.php create mode 100644 tests/Unit/Movies/ShowMovieServiceTest.php create mode 100644 tests/Unit/Movies/UpsertMovieFromProviderTest.php create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..a186cd2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[compose.yaml] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..053933c --- /dev/null +++ b/.env.example @@ -0,0 +1,70 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY=base64:E0+Ieqm3EN0qO5yMEFEkXcpTY0FhglNAZUlHdEfn2eU= +APP_DEBUG=true +APP_URL=http://localhost:8000 + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +# APP_MAINTENANCE_STORE=database + +# PHP_CLI_SERVER_WORKERS=4 + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +# Movies / OMDb +OMDB_API_KEY= +OMDB_LANGUAGE=en-US +OMDB_CACHE_TTL=3600 + +DB_CONNECTION=sqlite +# DB_HOST=127.0.0.1 +# DB_PORT=3306 +# DB_DATABASE=laravel +# DB_USERNAME=root +# DB_PASSWORD= + +SESSION_DRIVER=database +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_CONNECTION=log +FILESYSTEM_DISK=local +QUEUE_CONNECTION=database + +CACHE_STORE=database +# CACHE_PREFIX= + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=log +MAIL_SCHEME=null +MAIL_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +VITE_APP_NAME="${APP_NAME}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..4da48a8 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +CHANGELOG.md export-ignore +README.md export-ignore +.github/workflows/browser-tests.yml export-ignore diff --git a/.gitignore b/.gitignore index fffc9ef..9c71212 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ docs/_book # TODO: where does this rule come from? test/ +.idea/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..6b929ae --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +resources/js/components/ui/* +resources/views/mail/* diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..5b647f9 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,26 @@ +{ + "semi": true, + "singleQuote": true, + "singleAttributePerLine": false, + "htmlWhitespaceSensitivity": "css", + "printWidth": 80, + "plugins": [ + "prettier-plugin-organize-imports", + "prettier-plugin-tailwindcss" + ], + "tailwindFunctions": [ + "clsx", + "cn", + "cva" + ], + "tailwindStylesheet": "resources/css/app.css", + "tabWidth": 4, + "overrides": [ + { + "files": "**/*.yml", + "options": { + "tabWidth": 2 + } + } + ] +} diff --git a/README.md b/README.md index 997e168..570e29f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,204 @@ -# PIMS +# PIMS — Personal Inventory Management System -Personal Inventory Management System \ No newline at end of file +PIMS is a Laravel + Inertia.js + Vue 3 application intended to manage personal inventory. This repository is a modern Laravel 12 starter that pairs a PHP backend with a TypeScript/Vue frontend, bundled via Vite and styled with Tailwind CSS. + +Note: This README was updated to reflect the current codebase. Where details are unclear in the repository, TODOs are explicitly noted for maintainers to fill in. + +## Overview + +- Backend: Laravel Framework ^12.0 (PHP ^8.2) +- Inertia.js (server: `inertiajs/inertia-laravel` ^2.x) +- Frontend: Vue 3, TypeScript, Vite 7, Tailwind CSS 4 +- Auth: Laravel Fortify +- Dev tooling: Laravel Boost, Pail (logs), Pint (code style), ESLint, Prettier +- Package managers: Composer (PHP) and npm (Node) +- Default entry point: `public/index.php` + +## Requirements + +- PHP 8.2+ +- Composer 2.x +- Node.js 18+ (recommended LTS) and npm 9+ +- SQLite (default on first-run) or another database supported by Laravel + - The project creates `database/database.sqlite` on project creation and runs migrations automatically in some script flows. + +## Getting Started + +### 1) Clone and configure + +``` +git clone pims +cd pims +``` + +Create your environment file and app key, install dependencies, run migrations, and build assets. The Composer `setup` script automates these steps: + +``` +composer run setup +``` + +What `composer run setup` does: +- `composer install` +- Copy `.env.example` to `.env` if it does not exist +- `php artisan key:generate` +- `php artisan migrate --force` +- `npm install` +- `npm run build` + +If you prefer to do these manually: + +``` +cp .env.example .env # if .env.example is populated; see TODO below +php artisan key:generate +composer install +php artisan migrate +npm install +npm run dev # or npm run build +``` + +### 2) Run the app in development + +Option A — Single terminal processes: + +``` +php artisan serve +php artisan queue:listen --tries=1 # optional if you use queues +php artisan pail --timeout=0 # optional live log viewer +npm run dev # Vite dev server for assets +``` + +Option B — Use the combined dev script (runs server, queue, logs, and Vite together): + +``` +composer run dev +``` + +Server will be available at the host/port shown in `php artisan serve` output (typically http://127.0.0.1:8000). The default route `/` renders an Inertia page `Welcome`. The `dashboard` route is protected by `auth` and `verified` middleware. + +### Optional: Inertia SSR (Server-Side Rendering) + +This project includes scripts to build SSR bundles and start the Inertia SSR server. + +``` +composer run dev:ssr # will run php server, queue, logs, and the Inertia SSR server +``` + +Or build SSR assets without starting the SSR process: + +``` +npm run build:ssr +``` + +## Scripts + +Composer: +- `composer run setup` — Full setup: install PHP deps, ensure `.env`, generate key, migrate, install Node deps, build assets +- `composer run dev` — Concurrent dev processes (server, queue worker, logs, Vite) +- `composer run dev:ssr` — Build SSR assets and run server + queue + logs + Inertia SSR +- `composer run test` — Clear config cache and run tests via `php artisan test` + +npm: +- `npm run dev` — Vite dev server +- `npm run build` — Build production assets +- `npm run build:ssr` — Build production assets and SSR bundle +- `npm run lint` — ESLint with auto-fix +- `npm run format` — Prettier write on `resources/` +- `npm run format:check` — Prettier check + +## Environment Variables + +- The repository contains an `.env.example` file, but it is currently empty. +- TODO: Populate `.env.example` with the required variables for this app (e.g., `APP_NAME`, `APP_ENV`, `APP_KEY`, database config, mail config, etc.). +- On first setup, the scripts will generate `APP_KEY` automatically. +- Database: the project’s Composer post-create hook creates `database/database.sqlite` and runs migrations; you can continue with SQLite (set `DB_CONNECTION=sqlite`) or configure MySQL/PostgreSQL/etc. in `.env`. + +## Project Structure + +High-level directories of interest: + +- `app/` — Laravel application code (models, jobs, controllers, etc.) +- `bootstrap/` — Laravel bootstrapping +- `config/` — Configuration files +- `database/` — Migrations, seeders; SQLite file may live here (`database.sqlite`) +- `public/` — Web server document root; main PHP entry point is `public/index.php` +- `resources/` — Frontend assets (Vue, TypeScript, styles) +- `routes/` — Route definitions (e.g., `web.php` renders Inertia pages) +- `storage/` — Framework storage (logs, cache, sessions) +- `tests/` — Test suite (Pest + Laravel plugin) +- `vite.config.ts` — Vite build configuration +- `composer.json` — PHP dependencies and Composer scripts +- `package.json` — Node dependencies and npm scripts + +## Modules + +This application is organized to support feature modules under `app/Modules/` (e.g., Movies, Books, Games, Collectibles). Each module owns its domain logic and ships with its own `README.md` documenting endpoints, data models, services/contracts, environment variables, and development notes. + +- Current module(s): + - Movies — see `app/Modules/Movies/README.md` for detailed documentation. + +As additional modules are added (Books, Games, Collectibles, etc.), refer to their respective `app/Modules//README.md` files for module-specific guidance. + +## Running Tests + +You can run tests with either Composer or Artisan directly: + +``` +composer run test +# or +php artisan test +``` + +The project is configured for Pest with `pestphp/pest` and `pest-plugin-laravel` in `require-dev`. + +## Database & Migrations + +Run pending migrations: + +``` +php artisan migrate +``` + +Seeders/factories are available under `database/` if defined. + +Default behavior suggests SQLite can be used out of the box. To switch to another DB, update your `.env` accordingly and re-run migrations. + +## Linting & Formatting + +``` +npm run lint # ESLint +npm run format # Prettier write +npm run format:check # Prettier check +``` + +PHP code style is managed by Laravel Pint (installed as a dev dependency). You can run it via: + +``` +./vendor/bin/pint +``` + +## Development Notes + +- Logs: `php artisan pail --timeout=0` starts a live log viewer. +- Queues: `php artisan queue:listen --tries=1` is used in the dev script. +- Docker: Laravel Sail is present as a dev dependency, but the repo does not include a Sail config section here. + - TODO: Confirm whether Sail should be the preferred local environment and document the `./vendor/bin/sail` workflow if applicable. + +## Deployment + +General Laravel deployment notes: + +1. Ensure environment variables are configured and `APP_KEY` is set. +2. Run migrations: `php artisan migrate --force`. +3. Build assets: `npm ci && npm run build`. +4. Cache optimizations (optional): + - `php artisan config:cache` + - `php artisan route:cache` + - `php artisan view:cache` + +TODO: Add specific deployment instructions (hosting provider, CI/CD, SSR process, queue workers, scheduler) once decided. + +## License + +This project is licensed under the MIT License (per `composer.json`). + +TODO: If a `LICENSE` file is missing in the repository root, add one with the MIT license text. diff --git a/app/Actions/Fortify/CreateNewUser.php b/app/Actions/Fortify/CreateNewUser.php new file mode 100644 index 0000000..aebff5e --- /dev/null +++ b/app/Actions/Fortify/CreateNewUser.php @@ -0,0 +1,39 @@ + $input + */ + public function create(array $input): User + { + Validator::make($input, [ + 'name' => ['required', 'string', 'max:255'], + 'email' => [ + 'required', + 'string', + 'email', + 'max:255', + Rule::unique(User::class), + ], + 'password' => $this->passwordRules(), + ])->validate(); + + return User::create([ + 'name' => $input['name'], + 'email' => $input['email'], + 'password' => $input['password'], + ]); + } +} diff --git a/app/Actions/Fortify/PasswordValidationRules.php b/app/Actions/Fortify/PasswordValidationRules.php new file mode 100644 index 0000000..76b19d3 --- /dev/null +++ b/app/Actions/Fortify/PasswordValidationRules.php @@ -0,0 +1,18 @@ +|string> + */ + protected function passwordRules(): array + { + return ['required', 'string', Password::default(), 'confirmed']; + } +} diff --git a/app/Actions/Fortify/ResetUserPassword.php b/app/Actions/Fortify/ResetUserPassword.php new file mode 100644 index 0000000..688d62f --- /dev/null +++ b/app/Actions/Fortify/ResetUserPassword.php @@ -0,0 +1,28 @@ + $input + */ + public function reset(User $user, array $input): void + { + Validator::make($input, [ + 'password' => $this->passwordRules(), + ])->validate(); + + $user->forceFill([ + 'password' => $input['password'], + ])->save(); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..8677cd5 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,8 @@ +validate([ + 'current_password' => ['required', 'current_password'], + 'password' => ['required', Password::defaults(), 'confirmed'], + ]); + + $request->user()->update([ + 'password' => $validated['password'], + ]); + + return back(); + } +} diff --git a/app/Http/Controllers/Settings/ProfileController.php b/app/Http/Controllers/Settings/ProfileController.php new file mode 100644 index 0000000..10f3d22 --- /dev/null +++ b/app/Http/Controllers/Settings/ProfileController.php @@ -0,0 +1,63 @@ + $request->user() instanceof MustVerifyEmail, + 'status' => $request->session()->get('status'), + ]); + } + + /** + * Update the user's profile information. + */ + public function update(ProfileUpdateRequest $request): RedirectResponse + { + $request->user()->fill($request->validated()); + + if ($request->user()->isDirty('email')) { + $request->user()->email_verified_at = null; + } + + $request->user()->save(); + + return to_route('profile.edit'); + } + + /** + * Delete the user's profile. + */ + public function destroy(Request $request): RedirectResponse + { + $request->validate([ + 'password' => ['required', 'current_password'], + ]); + + $user = $request->user(); + + Auth::logout(); + + $user->delete(); + + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + return redirect('/'); + } +} diff --git a/app/Http/Controllers/Settings/TwoFactorAuthenticationController.php b/app/Http/Controllers/Settings/TwoFactorAuthenticationController.php new file mode 100644 index 0000000..4402383 --- /dev/null +++ b/app/Http/Controllers/Settings/TwoFactorAuthenticationController.php @@ -0,0 +1,37 @@ +ensureStateIsValid(); + + return Inertia::render('settings/TwoFactor', [ + 'twoFactorEnabled' => $request->user()->hasEnabledTwoFactorAuthentication(), + 'requiresConfirmation' => Features::optionEnabled(Features::twoFactorAuthentication(), 'confirm'), + ]); + } +} diff --git a/app/Http/Middleware/HandleAppearance.php b/app/Http/Middleware/HandleAppearance.php new file mode 100644 index 0000000..f1a02bb --- /dev/null +++ b/app/Http/Middleware/HandleAppearance.php @@ -0,0 +1,23 @@ +cookie('appearance') ?? 'system'); + + return $next($request); + } +} diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php new file mode 100644 index 0000000..bd89013 --- /dev/null +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -0,0 +1,51 @@ + + */ + public function share(Request $request): array + { + [$message, $author] = str(Inspiring::quotes()->random())->explode('-'); + + return [ + ...parent::share($request), + 'name' => config('app.name'), + 'quote' => ['message' => trim($message), 'author' => trim($author)], + 'auth' => [ + 'user' => $request->user(), + ], + 'sidebarOpen' => ! $request->hasCookie('sidebar_state') || $request->cookie('sidebar_state') === 'true', + ]; + } +} diff --git a/app/Http/Requests/Settings/ProfileUpdateRequest.php b/app/Http/Requests/Settings/ProfileUpdateRequest.php new file mode 100644 index 0000000..c294aab --- /dev/null +++ b/app/Http/Requests/Settings/ProfileUpdateRequest.php @@ -0,0 +1,30 @@ +|string> + */ + 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/Http/Requests/Settings/TwoFactorAuthenticationRequest.php b/app/Http/Requests/Settings/TwoFactorAuthenticationRequest.php new file mode 100644 index 0000000..9db81d2 --- /dev/null +++ b/app/Http/Requests/Settings/TwoFactorAuthenticationRequest.php @@ -0,0 +1,30 @@ +|string> + */ + public function rules(): array + { + return []; + } +} diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100644 index 0000000..05faee4 --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,52 @@ + */ + use HasFactory, Notifiable, TwoFactorAuthenticatable; + + /** + * The attributes that are mass assignable. + * + * @var list + */ + protected $fillable = [ + 'name', + 'email', + 'password', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var list + */ + protected $hidden = [ + 'password', + 'two_factor_secret', + 'two_factor_recovery_codes', + 'remember_token', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + 'two_factor_confirmed_at' => 'datetime', + ]; + } +} diff --git a/app/Modules/Movies/Http/Controllers/Admin/AcceptMovieController.php b/app/Modules/Movies/Http/Controllers/Admin/AcceptMovieController.php new file mode 100644 index 0000000..39b8c45 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Admin/AcceptMovieController.php @@ -0,0 +1,30 @@ +validated('provider_id'); + $mode = $request->validated('mode'); // overwrite|duplicate + + $details = $provider->details($providerId); + + $movie = $upserter->handle($details, $mode); + + return response()->json([ + 'status' => 'ok', + 'movie_id' => $movie->id, + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Admin/DeleteMovieController.php b/app/Modules/Movies/Http/Controllers/Admin/DeleteMovieController.php new file mode 100644 index 0000000..94968a1 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Admin/DeleteMovieController.php @@ -0,0 +1,21 @@ +handle($movie); + + return response()->json([ + 'status' => 'ok', + 'deleted' => true, + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Admin/EditMoviePageController.php b/app/Modules/Movies/Http/Controllers/Admin/EditMoviePageController.php new file mode 100644 index 0000000..15922a7 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Admin/EditMoviePageController.php @@ -0,0 +1,17 @@ + (int) $movie, + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Admin/ExistsMovieController.php b/app/Modules/Movies/Http/Controllers/Admin/ExistsMovieController.php new file mode 100644 index 0000000..21c8578 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Admin/ExistsMovieController.php @@ -0,0 +1,26 @@ +validated('provider') ?? 'omdb'; + $providerId = $request->validated('provider_id'); + + $movie = $service->findByProviderId($provider, $providerId); + + return response()->json([ + 'exists' => (bool) $movie, + 'movie_id' => $movie?->id, + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Admin/MoviesListPageController.php b/app/Modules/Movies/Http/Controllers/Admin/MoviesListPageController.php new file mode 100644 index 0000000..28c0e1a --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Admin/MoviesListPageController.php @@ -0,0 +1,15 @@ +validated('q'); + $page = (int) $request->validated('page'); + $result = $provider->search($q, $page); + + return response()->json($result); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Admin/UpdateMovieController.php b/app/Modules/Movies/Http/Controllers/Admin/UpdateMovieController.php new file mode 100644 index 0000000..3851cfb --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Admin/UpdateMovieController.php @@ -0,0 +1,22 @@ +validated(); + $updated = $service->handle($movie, $data); + + return response()->json([ + 'status' => 'ok', + 'movie' => $updated, + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Browse/Entities/ActorShowController.php b/app/Modules/Movies/Http/Controllers/Browse/Entities/ActorShowController.php new file mode 100644 index 0000000..29f7874 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Browse/Entities/ActorShowController.php @@ -0,0 +1,26 @@ +handle($id, [ + 'q' => $request->string('q')->toString(), + 'per_page' => $request->integer('per_page', 20), + 'sort' => $request->string('sort')->toString() ?: 'title_asc', + ]); + + return response()->json([ + 'entity' => $result['entity'], + 'movies' => $result['movies'], + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Browse/Entities/DirectorShowController.php b/app/Modules/Movies/Http/Controllers/Browse/Entities/DirectorShowController.php new file mode 100644 index 0000000..0b884a1 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Browse/Entities/DirectorShowController.php @@ -0,0 +1,26 @@ +handle($id, [ + 'q' => $request->string('q')->toString(), + 'per_page' => $request->integer('per_page', 20), + 'sort' => $request->string('sort')->toString() ?: 'title_asc', + ]); + + return response()->json([ + 'entity' => $result['entity'], + 'movies' => $result['movies'], + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Browse/Entities/GenreShowController.php b/app/Modules/Movies/Http/Controllers/Browse/Entities/GenreShowController.php new file mode 100644 index 0000000..0d17149 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Browse/Entities/GenreShowController.php @@ -0,0 +1,26 @@ +handle($id, [ + 'q' => $request->string('q')->toString(), + 'per_page' => $request->integer('per_page', 20), + 'sort' => $request->string('sort')->toString() ?: 'title_asc', + ]); + + return response()->json([ + 'entity' => $result['entity'], + 'movies' => $result['movies'], + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Browse/Entities/StudioShowController.php b/app/Modules/Movies/Http/Controllers/Browse/Entities/StudioShowController.php new file mode 100644 index 0000000..96bd7e1 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Browse/Entities/StudioShowController.php @@ -0,0 +1,26 @@ +handle($id, [ + 'q' => $request->string('q')->toString(), + 'per_page' => $request->integer('per_page', 20), + 'sort' => $request->string('sort')->toString() ?: 'title_asc', + ]); + + return response()->json([ + 'entity' => $result['entity'], + 'movies' => $result['movies'], + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Browse/MovieShowController.php b/app/Modules/Movies/Http/Controllers/Browse/MovieShowController.php new file mode 100644 index 0000000..9d2a5d1 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Browse/MovieShowController.php @@ -0,0 +1,17 @@ +getById($id); + return response()->json($model); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Browse/MoviesIndexController.php b/app/Modules/Movies/Http/Controllers/Browse/MoviesIndexController.php new file mode 100644 index 0000000..3b16ae6 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Browse/MoviesIndexController.php @@ -0,0 +1,29 @@ +list([ + 'q' => $request->string('q')->toString(), + 'per_page' => $request->integer('per_page', 20), + 'sort' => $request->string('sort')->toString() ?: 'title_asc', + 'genre' => $request->string('genre')->toString(), + 'rating' => $request->string('rating')->toString(), + 'year_min' => $request->has('year_min') ? $request->integer('year_min') : null, + 'year_max' => $request->has('year_max') ? $request->integer('year_max') : null, + 'actor' => $request->string('actor')->toString(), + 'director' => $request->string('director')->toString(), + 'studio' => $request->string('studio')->toString(), + ]); + + return response()->json($paginator); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Pages/ActorsShowPageController.php b/app/Modules/Movies/Http/Controllers/Pages/ActorsShowPageController.php new file mode 100644 index 0000000..562f824 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Pages/ActorsShowPageController.php @@ -0,0 +1,17 @@ + (int) $actor, + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Pages/DirectorsShowPageController.php b/app/Modules/Movies/Http/Controllers/Pages/DirectorsShowPageController.php new file mode 100644 index 0000000..2bfb07d --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Pages/DirectorsShowPageController.php @@ -0,0 +1,17 @@ + (int) $director, + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Pages/GenresShowPageController.php b/app/Modules/Movies/Http/Controllers/Pages/GenresShowPageController.php new file mode 100644 index 0000000..cb59b07 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Pages/GenresShowPageController.php @@ -0,0 +1,17 @@ + (int) $genre, + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Pages/PublicMovieShowPageController.php b/app/Modules/Movies/Http/Controllers/Pages/PublicMovieShowPageController.php new file mode 100644 index 0000000..7f5a636 --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Pages/PublicMovieShowPageController.php @@ -0,0 +1,17 @@ + (int) $movie, + ]); + } +} diff --git a/app/Modules/Movies/Http/Controllers/Pages/PublicMoviesPageController.php b/app/Modules/Movies/Http/Controllers/Pages/PublicMoviesPageController.php new file mode 100644 index 0000000..62c237c --- /dev/null +++ b/app/Modules/Movies/Http/Controllers/Pages/PublicMoviesPageController.php @@ -0,0 +1,15 @@ + (int) $studio, + ]); + } +} diff --git a/app/Modules/Movies/Http/Requests/AcceptMovieRequest.php b/app/Modules/Movies/Http/Requests/AcceptMovieRequest.php new file mode 100644 index 0000000..14603e9 --- /dev/null +++ b/app/Modules/Movies/Http/Requests/AcceptMovieRequest.php @@ -0,0 +1,22 @@ +user(); + } + + public function rules(): array + { + return [ + 'provider_id' => ['required', 'string'], + 'mode' => ['required', Rule::in(['overwrite', 'duplicate'])], + ]; + } +} diff --git a/app/Modules/Movies/Http/Requests/DestroyMovieRequest.php b/app/Modules/Movies/Http/Requests/DestroyMovieRequest.php new file mode 100644 index 0000000..b38a01b --- /dev/null +++ b/app/Modules/Movies/Http/Requests/DestroyMovieRequest.php @@ -0,0 +1,18 @@ +user(); + } + + public function rules(): array + { + return []; + } +} diff --git a/app/Modules/Movies/Http/Requests/ExistsMovieRequest.php b/app/Modules/Movies/Http/Requests/ExistsMovieRequest.php new file mode 100644 index 0000000..2a71116 --- /dev/null +++ b/app/Modules/Movies/Http/Requests/ExistsMovieRequest.php @@ -0,0 +1,21 @@ +user(); + } + + public function rules(): array + { + return [ + 'provider' => ['sometimes', 'string'], + 'provider_id' => ['required', 'string'], + ]; + } +} diff --git a/app/Modules/Movies/Http/Requests/SearchMoviesRequest.php b/app/Modules/Movies/Http/Requests/SearchMoviesRequest.php new file mode 100644 index 0000000..38603ab --- /dev/null +++ b/app/Modules/Movies/Http/Requests/SearchMoviesRequest.php @@ -0,0 +1,28 @@ +user(); + } + + public function rules(): array + { + return [ + 'q' => ['required', 'string', 'min:2'], + 'page' => ['sometimes', 'integer', 'min:1'], + ]; + } + + public function validated($key = null, $default = null) + { + $data = parent::validated(); + $data['page'] = isset($data['page']) ? (int) $data['page'] : 1; + return $key ? ($data[$key] ?? $default) : $data; + } +} diff --git a/app/Modules/Movies/Http/Requests/UpdateMovieRequest.php b/app/Modules/Movies/Http/Requests/UpdateMovieRequest.php new file mode 100644 index 0000000..2746fa2 --- /dev/null +++ b/app/Modules/Movies/Http/Requests/UpdateMovieRequest.php @@ -0,0 +1,44 @@ +user(); + } + + public function rules(): array + { + return [ + // Scalars (all optional) + 'title' => ['sometimes', 'string', 'min:1'], + 'original_title' => ['sometimes', 'nullable', 'string'], + 'description' => ['sometimes', 'nullable', 'string'], + 'poster_url' => ['sometimes', 'nullable', 'url'], + 'backdrop_url' => ['sometimes', 'nullable', 'url'], + 'rating' => ['sometimes', 'nullable', 'string', 'max:20'], + 'release_date' => ['sometimes', 'nullable', 'date'], + 'year' => ['sometimes', 'nullable', 'integer', 'min:1800', 'max:3000'], + 'runtime' => ['sometimes', 'nullable', 'integer', 'min:1', 'max:10000'], + + // Relations via free-text chips (arrays of strings) + 'genres' => ['sometimes', 'array'], + 'genres.*' => ['string', 'min:1'], + 'actors' => ['sometimes', 'array'], + 'actors.*' => ['string', 'min:1'], + 'directors' => ['sometimes', 'array'], + 'directors.*' => ['string', 'min:1'], + 'studios' => ['sometimes', 'array'], + 'studios.*' => ['string', 'min:1'], + 'countries' => ['sometimes', 'array'], + 'countries.*' => ['string', 'min:1'], + 'languages' => ['sometimes', 'array'], + 'languages.*' => ['string', 'min:1'], + ]; + } +} diff --git a/app/Modules/Movies/Models/Actor.php b/app/Modules/Movies/Models/Actor.php new file mode 100644 index 0000000..272f28e --- /dev/null +++ b/app/Modules/Movies/Models/Actor.php @@ -0,0 +1,22 @@ +belongsToMany(Movie::class, 'movie_actor'); } + + protected static function newFactory(): Factory + { + return \Database\Factories\ActorFactory::new(); + } +} diff --git a/app/Modules/Movies/Models/Country.php b/app/Modules/Movies/Models/Country.php new file mode 100644 index 0000000..a237fdb --- /dev/null +++ b/app/Modules/Movies/Models/Country.php @@ -0,0 +1,22 @@ +belongsToMany(Movie::class, 'movie_country'); } + + protected static function newFactory(): Factory + { + return \Database\Factories\CountryFactory::new(); + } +} diff --git a/app/Modules/Movies/Models/Director.php b/app/Modules/Movies/Models/Director.php new file mode 100644 index 0000000..512df33 --- /dev/null +++ b/app/Modules/Movies/Models/Director.php @@ -0,0 +1,22 @@ +belongsToMany(Movie::class, 'movie_director'); } + + protected static function newFactory(): Factory + { + return \Database\Factories\DirectorFactory::new(); + } +} diff --git a/app/Modules/Movies/Models/Genre.php b/app/Modules/Movies/Models/Genre.php new file mode 100644 index 0000000..7837eca --- /dev/null +++ b/app/Modules/Movies/Models/Genre.php @@ -0,0 +1,22 @@ +belongsToMany(Movie::class, 'movie_genre'); } + + protected static function newFactory(): Factory + { + return \Database\Factories\GenreFactory::new(); + } +} diff --git a/app/Modules/Movies/Models/Language.php b/app/Modules/Movies/Models/Language.php new file mode 100644 index 0000000..371d064 --- /dev/null +++ b/app/Modules/Movies/Models/Language.php @@ -0,0 +1,22 @@ +belongsToMany(Movie::class, 'movie_language'); } + + protected static function newFactory(): Factory + { + return \Database\Factories\LanguageFactory::new(); + } +} diff --git a/app/Modules/Movies/Models/Movie.php b/app/Modules/Movies/Models/Movie.php new file mode 100644 index 0000000..0e9ea7a --- /dev/null +++ b/app/Modules/Movies/Models/Movie.php @@ -0,0 +1,46 @@ + 'array', + 'release_date' => 'date', + ]; + + public function genres(): BelongsToMany { return $this->belongsToMany(Genre::class, 'movie_genre'); } + public function actors(): BelongsToMany { return $this->belongsToMany(Actor::class, 'movie_actor'); } + public function directors(): BelongsToMany { return $this->belongsToMany(Director::class, 'movie_director'); } + public function studios(): BelongsToMany { return $this->belongsToMany(Studio::class, 'movie_studio'); } + public function countries(): BelongsToMany { return $this->belongsToMany(Country::class, 'movie_country'); } + public function languages(): BelongsToMany { return $this->belongsToMany(Language::class, 'movie_language'); } + + protected static function newFactory(): Factory + { + return \Database\Factories\MovieFactory::new(); + } +} diff --git a/app/Modules/Movies/Models/Studio.php b/app/Modules/Movies/Models/Studio.php new file mode 100644 index 0000000..d81f64a --- /dev/null +++ b/app/Modules/Movies/Models/Studio.php @@ -0,0 +1,22 @@ +belongsToMany(Movie::class, 'movie_studio'); } + + protected static function newFactory(): Factory + { + return \Database\Factories\StudioFactory::new(); + } +} diff --git a/app/Modules/Movies/Providers/MoviesServiceProvider.php b/app/Modules/Movies/Providers/MoviesServiceProvider.php new file mode 100644 index 0000000..73c64dc --- /dev/null +++ b/app/Modules/Movies/Providers/MoviesServiceProvider.php @@ -0,0 +1,93 @@ +app->bind(MovieProvider::class, function () { + $provider = config('movies.provider', 'omdb'); + return match ($provider) { + 'omdb' => new OmdbMovieProvider(), + default => new OmdbMovieProvider(), + }; + }); + + // Bind service interfaces to implementations + $this->app->bind(ListMoviesServiceInterface::class, ListMoviesService::class); + $this->app->bind(ShowMovieServiceInterface::class, ShowMovieService::class); + $this->app->bind(UpsertMovieServiceInterface::class, UpsertMovieFromProvider::class); + $this->app->bind(CheckMovieExistsServiceInterface::class, CheckMovieExistsService::class); + + // Entity services + $this->app->bind(GetActorWithMoviesServiceInterface::class, GetActorWithMoviesService::class); + $this->app->bind(GetDirectorWithMoviesServiceInterface::class, GetDirectorWithMoviesService::class); + $this->app->bind(GetStudioWithMoviesServiceInterface::class, GetStudioWithMoviesService::class); + $this->app->bind(GetGenreWithMoviesServiceInterface::class, GetGenreWithMoviesService::class); + + // Admin management services + $this->app->bind(UpdateMovieServiceInterface::class, UpdateMovieService::class); + $this->app->bind(DeleteMovieServiceInterface::class, DeleteMovieService::class); + } + + public function boot(): void + { + // Module routes + Route::middleware(['web', 'auth', 'verified']) + ->prefix('admin/movies') + ->as('admin.movies.') + ->group(__DIR__ . '/../routes/admin.php'); + + // Public API (JSON) routes + Route::middleware(['web']) + ->prefix('api/movies') + ->as('api.movies.') + ->group(__DIR__ . '/../routes/api.php'); + + // Entity API routes (actors/directors/studios/genres) + Route::middleware(['web']) + ->prefix('api') + ->as('api.movies.entities.') + ->group(function () { + Route::prefix('actors')->as('actors.')->group(__DIR__ . '/../routes/api_actors.php'); + Route::prefix('directors')->as('directors.')->group(__DIR__ . '/../routes/api_directors.php'); + Route::prefix('studios')->as('studios.')->group(__DIR__ . '/../routes/api_studios.php'); + Route::prefix('genres')->as('genres.')->group(__DIR__ . '/../routes/api_genres.php'); + }); + + // Public Inertia pages + Route::middleware(['web']) + ->prefix('movies') + ->as('movies.') + ->group(__DIR__ . '/../routes/pages.php'); + + // Entity Inertia pages + Route::middleware(['web']) + ->as('entities.pages.') + ->group(function () { + Route::prefix('actors')->as('actors.')->group(__DIR__ . '/../routes/pages_actors.php'); + Route::prefix('directors')->as('directors.')->group(__DIR__ . '/../routes/pages_directors.php'); + Route::prefix('studios')->as('studios.')->group(__DIR__ . '/../routes/pages_studios.php'); + Route::prefix('genres')->as('genres.')->group(__DIR__ . '/../routes/pages_genres.php'); + }); + } +} diff --git a/app/Modules/Movies/README.md b/app/Modules/Movies/README.md new file mode 100644 index 0000000..648459d --- /dev/null +++ b/app/Modules/Movies/README.md @@ -0,0 +1,60 @@ +# Movies Module + +This module implements service-first Movies functionality, including: +- Admin search + accept flow (OMDb) +- Public browsing (Inertia pages) backed by JSON API +- Strict controller→service separation + +## Endpoints + +Admin (auth required) +- GET /admin/movies → Inertia admin page (search + accept) +- GET /admin/movies/search?q=&page= → JSON results from OMDb (10 per page) +- GET /admin/movies/exists?provider_id= → Duplicate check +- POST /admin/movies/accept { provider_id, mode: overwrite|duplicate } → Persist movie + +Public +- Inertia pages: GET /movies, GET /movies/{id} +- JSON API: GET /api/movies, GET /api/movies/{id} + +## Data model +- Fully normalized tables: movies, genres, actors, directors, studios, countries, languages + pivot tables. +- Provider ID is not unique. Duplicates are allowed when “Save as Duplicate” is selected. +- Images are stored as remote URLs only (not downloaded). + +## Services & Contracts +- Provider: App\\Modules\\Movies\\Services\\Contracts\\MovieProvider (OMDb implementation) +- Browse: ListMoviesServiceInterface, ShowMovieServiceInterface +- Admin: UpsertMovieServiceInterface, CheckMovieExistsServiceInterface + +All DI bindings are registered in MoviesServiceProvider. + +## Admin flow +1. Search calls /admin/movies/search (OMDb search). List shows poster, title, year only (no details calls). +2. Accept button: + - If unique, accepts immediately (no modal). + - If duplicate exists by provider_id, shows modal: Overwrite | Save as Duplicate | Cancel. +3. On successful accept, a small toast appears and the row is marked “Accepted”. + +## Public browsing +- /movies (Inertia) fetches from /api/movies with infinite scroll. Each row shows poster, title, year, rating, genres, and a ~50-word description snippet. +- /movies/{id} (Inertia) fetches from /api/movies/{id} and shows details with all relations. + +## Environment +Add to .env (values shown as placeholders): +``` +OMDB_API_KEY= +OMDB_LANGUAGE=en-US +OMDB_CACHE_TTL=3600 +``` + +Set your real OMDb key locally (per user decision). Timezone is America/Chicago. + +## Development +- Run backend: `php artisan serve` +- Frontend dev: `npm install && npm run dev` +- Tests: `./vendor/bin/pest` + +## Notes +- Pagination: OMDb search uses 10/page; public DB pagination defaults to 20/page (configurable at request). +- Controller classes contain no business logic; all logic resides in services. diff --git a/app/Modules/Movies/Services/Browse/Entities/GetActorWithMoviesService.php b/app/Modules/Movies/Services/Browse/Entities/GetActorWithMoviesService.php new file mode 100644 index 0000000..0e2050f --- /dev/null +++ b/app/Modules/Movies/Services/Browse/Entities/GetActorWithMoviesService.php @@ -0,0 +1,39 @@ +find($id); + if (!$actor) { + throw (new ModelNotFoundException())->setModel(Actor::class, [$id]); + } + + $perPage = max(1, min((int)($params['per_page'] ?? 20), 50)); + $q = isset($params['q']) ? trim((string)$params['q']) : ''; + + $movies = Movie::query() + ->whereHas('actors', fn($q2) => $q2->whereKey($actor->id)) + ->with(['genres']) + ->when($q !== '', fn($query) => $query->where('title', 'like', "%{$q}%")) + ->latest() + ->paginate($perPage); + + return [ + 'entity' => $actor, + 'movies' => $movies, + ]; + } +} diff --git a/app/Modules/Movies/Services/Browse/Entities/GetDirectorWithMoviesService.php b/app/Modules/Movies/Services/Browse/Entities/GetDirectorWithMoviesService.php new file mode 100644 index 0000000..42f5196 --- /dev/null +++ b/app/Modules/Movies/Services/Browse/Entities/GetDirectorWithMoviesService.php @@ -0,0 +1,39 @@ +find($id); + if (!$director) { + throw (new ModelNotFoundException())->setModel(Director::class, [$id]); + } + + $perPage = max(1, min((int)($params['per_page'] ?? 20), 50)); + $q = isset($params['q']) ? trim((string)$params['q']) : ''; + + $movies = Movie::query() + ->whereHas('directors', fn($q2) => $q2->whereKey($director->id)) + ->with(['genres']) + ->when($q !== '', fn($query) => $query->where('title', 'like', "%{$q}%")) + ->latest() + ->paginate($perPage); + + return [ + 'entity' => $director, + 'movies' => $movies, + ]; + } +} diff --git a/app/Modules/Movies/Services/Browse/Entities/GetGenreWithMoviesService.php b/app/Modules/Movies/Services/Browse/Entities/GetGenreWithMoviesService.php new file mode 100644 index 0000000..1b5c406 --- /dev/null +++ b/app/Modules/Movies/Services/Browse/Entities/GetGenreWithMoviesService.php @@ -0,0 +1,62 @@ +find($id); + if (!$genre) { + throw (new ModelNotFoundException())->setModel(Genre::class, [$id]); + } + + $perPage = max(1, min((int)($params['per_page'] ?? 20), 50)); + $q = isset($params['q']) ? trim((string)$params['q']) : ''; + $sort = isset($params['sort']) ? trim((string)$params['sort']) : 'title_asc'; + + $moviesQuery = Movie::query() + ->whereHas('genres', fn($q2) => $q2->whereKey($genre->id)) + ->with(['genres']) + ->when($q !== '', fn($query) => $query->where('title', 'like', "%{$q}%")); + + switch ($sort) { + case 'title_desc': + $moviesQuery->orderBy('title', 'desc'); + break; + case 'newest': + $moviesQuery->orderBy('created_at', 'desc'); + break; + case 'oldest': + $moviesQuery->orderBy('created_at', 'asc'); + break; + case 'year_asc': + $moviesQuery->orderBy('year', 'asc'); + break; + case 'year_desc': + $moviesQuery->orderBy('year', 'desc'); + break; + case 'title_asc': + default: + $moviesQuery->orderBy('title', 'asc'); + break; + } + + $movies = $moviesQuery->paginate($perPage); + + return [ + 'entity' => $genre, + 'movies' => $movies, + ]; + } +} diff --git a/app/Modules/Movies/Services/Browse/Entities/GetStudioWithMoviesService.php b/app/Modules/Movies/Services/Browse/Entities/GetStudioWithMoviesService.php new file mode 100644 index 0000000..0f63154 --- /dev/null +++ b/app/Modules/Movies/Services/Browse/Entities/GetStudioWithMoviesService.php @@ -0,0 +1,62 @@ +find($id); + if (!$studio) { + throw (new ModelNotFoundException())->setModel(Studio::class, [$id]); + } + + $perPage = max(1, min((int)($params['per_page'] ?? 20), 50)); + $q = isset($params['q']) ? trim((string)$params['q']) : ''; + $sort = isset($params['sort']) ? trim((string)$params['sort']) : 'title_asc'; + + $moviesQuery = Movie::query() + ->whereHas('studios', fn($q2) => $q2->whereKey($studio->id)) + ->with(['genres']) + ->when($q !== '', fn($query) => $query->where('title', 'like', "%{$q}%")); + + switch ($sort) { + case 'title_desc': + $moviesQuery->orderBy('title', 'desc'); + break; + case 'newest': + $moviesQuery->orderBy('created_at', 'desc'); + break; + case 'oldest': + $moviesQuery->orderBy('created_at', 'asc'); + break; + case 'year_asc': + $moviesQuery->orderBy('year', 'asc'); + break; + case 'year_desc': + $moviesQuery->orderBy('year', 'desc'); + break; + case 'title_asc': + default: + $moviesQuery->orderBy('title', 'asc'); + break; + } + + $movies = $moviesQuery->paginate($perPage); + + return [ + 'entity' => $studio, + 'movies' => $movies, + ]; + } +} diff --git a/app/Modules/Movies/Services/Browse/ListMoviesService.php b/app/Modules/Movies/Services/Browse/ListMoviesService.php new file mode 100644 index 0000000..1e43f09 --- /dev/null +++ b/app/Modules/Movies/Services/Browse/ListMoviesService.php @@ -0,0 +1,98 @@ +with(['genres', 'actors', 'directors']); + + if ($q !== '') { + $query->where('title', 'like', "%{$q}%"); + } + + if ($genre !== '') { + $ln = mb_strtolower($genre); + $query->whereHas('genres', fn($q2) => $q2->whereRaw('lower(name) = ?', [$ln])); + } + if ($rating !== '') { + $query->where('rating', $rating); + } + if ($yearMin !== null) { + $query->where('year', '>=', $yearMin); + } + if ($yearMax !== null) { + $query->where('year', '<=', $yearMax); + } + if ($actor !== '') { + $ln = mb_strtolower($actor); + $query->whereHas('actors', fn($q2) => $q2->whereRaw('lower(name) = ?', [$ln])); + } + if ($director !== '') { + $ln = mb_strtolower($director); + $query->whereHas('directors', fn($q2) => $q2->whereRaw('lower(name) = ?', [$ln])); + } + if ($studio !== '') { + $ln = mb_strtolower($studio); + $query->whereHas('studios', fn($q2) => $q2->whereRaw('lower(name) = ?', [$ln])); + } + + // Sorting + switch ($sort) { + case 'title_desc': + $query->orderBy('title', 'desc'); + break; + case 'newest': + $query->orderBy('created_at', 'desc'); + break; + case 'oldest': + $query->orderBy('created_at', 'asc'); + break; + case 'year_asc': + $query->orderBy('year', 'asc'); + break; + case 'year_desc': + $query->orderBy('year', 'desc'); + break; + case 'title_asc': + default: + $query->orderBy('title', 'asc'); + break; + } + + return $query->paginate($perPage); + } +} diff --git a/app/Modules/Movies/Services/Browse/ShowMovieService.php b/app/Modules/Movies/Services/Browse/ShowMovieService.php new file mode 100644 index 0000000..f698c26 --- /dev/null +++ b/app/Modules/Movies/Services/Browse/ShowMovieService.php @@ -0,0 +1,26 @@ +with(['genres', 'actors', 'directors', 'studios', 'countries', 'languages']) + ->find($id); + + if (!$movie) { + throw (new ModelNotFoundException())->setModel(Movie::class, [$id]); + } + + return $movie; + } +} diff --git a/app/Modules/Movies/Services/CheckMovieExistsService.php b/app/Modules/Movies/Services/CheckMovieExistsService.php new file mode 100644 index 0000000..db3df45 --- /dev/null +++ b/app/Modules/Movies/Services/CheckMovieExistsService.php @@ -0,0 +1,17 @@ +where('provider', $provider) + ->where('provider_id', $providerId) + ->first(); + } +} diff --git a/app/Modules/Movies/Services/Contracts/CheckMovieExistsServiceInterface.php b/app/Modules/Movies/Services/Contracts/CheckMovieExistsServiceInterface.php new file mode 100644 index 0000000..8c80577 --- /dev/null +++ b/app/Modules/Movies/Services/Contracts/CheckMovieExistsServiceInterface.php @@ -0,0 +1,10 @@ +find($id); + if (!$movie) { + throw (new ModelNotFoundException())->setModel(Movie::class, [$id]); + } + + // Hard delete cascades through pivots due to FK cascade in migrations + $movie->delete(); + } +} diff --git a/app/Modules/Movies/Services/Omdb/OmdbMovieProvider.php b/app/Modules/Movies/Services/Omdb/OmdbMovieProvider.php new file mode 100644 index 0000000..2d8bb9f --- /dev/null +++ b/app/Modules/Movies/Services/Omdb/OmdbMovieProvider.php @@ -0,0 +1,161 @@ +baseUrl = rtrim(config('movies.omdb.base_url', 'https://www.omdbapi.com/'), '/'); + $this->apiKey = config('movies.omdb.api_key'); + $this->cacheTtl = (int) config('movies.omdb.cache_ttl', 3600); + } + + public function search(string $query, int $page = 1): array + { + $query = trim($query); + if ($query === '') { + return ['results' => collect(), 'total' => 0, 'page' => 1, 'has_more' => false]; + } + + $cacheKey = sprintf('omdb.search.%s.p%s', md5($query), $page); + $data = Cache::remember($cacheKey, $this->cacheTtl, function () use ($query, $page) { + $response = Http::acceptJson() + ->timeout(6) + ->retry(3, 300) + ->get($this->baseUrl, [ + 'apikey' => $this->apiKey, + 's' => $query, + 'type' => 'movie', + 'page' => $page, + ]); + + if ($response->failed()) { + abort(502, 'Couldn’t reach OMDb. Please try again.'); + } + + return $response->json(); + }); + + $results = collect(); + $total = 0; + $hasMore = false; + if (isset($data['Response']) && $data['Response'] === 'True' && isset($data['Search'])) { + $total = (int) ($data['totalResults'] ?? 0); + $hasMore = $page * 10 < $total; // OMDb pages of 10 + $results = collect($data['Search'])->map(function ($item) { + return [ + 'provider' => 'omdb', + 'provider_id' => $item['imdbID'] ?? null, + 'title' => $item['Title'] ?? null, + 'year' => $item['Year'] ?? null, + 'poster_url' => ($item['Poster'] ?? 'N/A') !== 'N/A' ? $item['Poster'] : null, + ]; + }); + } + + return [ + 'results' => $results, + 'total' => $total, + 'page' => $page, + 'has_more' => $hasMore, + ]; + } + + public function details(string $id): array + { + $id = trim($id); + $cacheKey = sprintf('omdb.details.%s', $id); + $data = Cache::remember($cacheKey, $this->cacheTtl, function () use ($id) { + $response = Http::acceptJson() + ->timeout(6) + ->retry(3, 300) + ->get($this->baseUrl, [ + 'apikey' => $this->apiKey, + 'i' => $id, + 'plot' => 'full', + 'type' => 'movie', + ]); + + if ($response->failed()) { + abort(502, 'Couldn’t reach OMDb. Please try again.'); + } + + return $response->json(); + }); + + if (!isset($data['Response']) || $data['Response'] !== 'True') { + // Map explicit OMDb errors that indicate provider-side issues differently if needed + // Default to not found for details when OMDb says False + abort(404, 'Movie not found in OMDb'); + } + + // Normalize to internal structure + $genres = $this->splitList($data['Genre'] ?? ''); + $actors = $this->splitList($data['Actors'] ?? ''); + $directors = $this->splitList($data['Director'] ?? ''); + $studios = $this->splitList($data['Production'] ?? ''); + $countries = $this->splitList($data['Country'] ?? ''); + $languages = $this->splitList($data['Language'] ?? ''); + + return [ + 'provider' => 'omdb', + 'provider_id' => $data['imdbID'] ?? null, + 'external_ids' => [ + 'imdb' => $data['imdbID'] ?? null, + 'omdb' => $data['imdbID'] ?? null, + ], + 'title' => $data['Title'] ?? null, + 'original_title' => $data['Title'] ?? null, + 'description' => $data['Plot'] ?? null, + 'poster_url' => ($data['Poster'] ?? 'N/A') !== 'N/A' ? $data['Poster'] : null, + 'backdrop_url' => null, + 'genres' => $genres, + 'rating' => $data['Rated'] ?? null, + 'release_date' => $this->parseDate($data['Released'] ?? null), + 'year' => isset($data['Year']) ? (int) substr($data['Year'], 0, 4) : null, + 'runtime' => $this->parseRuntime($data['Runtime'] ?? null), + 'actors' => $actors, + 'directors' => $directors, + 'studios' => $studios, + 'countries' => $countries, + 'languages' => $languages, + ]; + } + + protected function splitList(?string $value): array + { + if (!$value || $value === 'N/A') return []; + return collect(explode(',', $value)) + ->map(fn($v) => trim($v)) + ->filter() + ->values() + ->all(); + } + + protected function parseRuntime(?string $runtime): ?int + { + if (!$runtime) return null; + if (preg_match('/(\d+) min/i', $runtime, $m)) { + return (int) $m[1]; + } + return null; + } + + protected function parseDate(?string $date): ?string + { + if (!$date || $date === 'N/A') return null; + // OMDb uses formats like "01 Jan 2000" + $ts = strtotime($date); + return $ts ? date('Y-m-d', $ts) : null; + } +} diff --git a/app/Modules/Movies/Services/UpdateMovieService.php b/app/Modules/Movies/Services/UpdateMovieService.php new file mode 100644 index 0000000..32eab20 --- /dev/null +++ b/app/Modules/Movies/Services/UpdateMovieService.php @@ -0,0 +1,68 @@ +find($id); + if (!$movie) { + throw (new ModelNotFoundException())->setModel(Movie::class, [$id]); + } + + return DB::transaction(function () use ($movie, $data) { + // Scalars + $movie->fill(array_intersect_key($data, array_flip([ + 'title', 'original_title', 'description', 'poster_url', 'backdrop_url', 'rating', 'release_date', 'year', 'runtime', + ]))); + $movie->save(); + + // Relations via free-text chips (names) + $this->syncNames($movie, Genre::class, 'genres', $data['genres'] ?? []); + $this->syncNames($movie, Actor::class, 'actors', $data['actors'] ?? []); + $this->syncNames($movie, Director::class, 'directors', $data['directors'] ?? []); + $this->syncNames($movie, Studio::class, 'studios', $data['studios'] ?? []); + $this->syncNames($movie, Country::class, 'countries', $data['countries'] ?? []); + $this->syncNames($movie, Language::class, 'languages', $data['languages'] ?? []); + + return $movie->refresh(); + }); + } + + protected function syncNames(Movie $movie, string $modelClass, string $relation, array $names): void + { + if (!is_array($names)) return; + $ids = collect($names) + ->filter() + ->map(fn($n) => $this->normalizeName((string)$n)) + ->filter(fn($n) => $n !== '') + ->map(function ($normalized) use ($modelClass) { + $existing = $modelClass::query() + ->whereRaw('lower(name) = ?', [mb_strtolower($normalized)]) + ->first(); + if ($existing) return $existing->getKey(); + $m = new $modelClass(); + $m->setAttribute('name', $normalized); + $m->save(); + return $m->getKey(); + }) + ->values() + ->all(); + + if (method_exists($movie, $relation)) { + $movie->{$relation}()->sync($ids); + } + } + + protected function normalizeName(string $name): string + { + return trim(preg_replace('/\s+/u', ' ', $name) ?? ''); + } +} diff --git a/app/Modules/Movies/Services/UpsertMovieFromProvider.php b/app/Modules/Movies/Services/UpsertMovieFromProvider.php new file mode 100644 index 0000000..c968400 --- /dev/null +++ b/app/Modules/Movies/Services/UpsertMovieFromProvider.php @@ -0,0 +1,118 @@ +where('provider', $provider) + ->where('provider_id', $providerId) + ->first(); + } + + if (!$movie) { + $movie = new Movie(); + } + + // Fill scalar fields + $movie->fill([ + 'provider' => $provider, + 'provider_id' => $providerId, + 'external_ids' => $details['external_ids'] ?? null, + 'title' => $details['title'] ?? '', + 'original_title' => $details['original_title'] ?? null, + 'description' => $details['description'] ?? null, + 'poster_url' => $details['poster_url'] ?? null, + 'backdrop_url' => $details['backdrop_url'] ?? null, + 'rating' => $details['rating'] ?? null, + 'release_date' => $details['release_date'] ?? null, + 'year' => $details['year'] ?? null, + 'runtime' => $details['runtime'] ?? null, + ]); + + $movie->save(); + + // Sync relations using names from details payload + $this->syncByNames($movie, Genre::class, 'genres', $details['genres'] ?? []); + $this->syncByNames($movie, Actor::class, 'actors', $details['actors'] ?? []); + $this->syncByNames($movie, Director::class, 'directors', $details['directors'] ?? []); + $this->syncByNames($movie, Studio::class, 'studios', $details['studios'] ?? []); + $this->syncByNames($movie, Country::class, 'countries', $details['countries'] ?? []); + $this->syncByNames($movie, Language::class, 'languages', $details['languages'] ?? []); + + return $movie->refresh(); + }); + } + + /** + * @param Movie $movie + * @param class-string $modelClass + * @param string $relation + * @param array $names Names to sync + */ + protected function syncByNames(Movie $movie, string $modelClass, string $relation, array $names): void + { + // Create or fetch IDs by name (case-insensitive normalization) + $ids = collect($names) + ->filter() + ->map(function ($name) use ($modelClass) { + $original = (string) $name; + $normalized = $this->normalizeName($original); + if ($normalized === '') return null; + + // Find existing row in a case-insensitive way + /** @var \Illuminate\Database\Eloquent\Model|null $existing */ + $existing = $modelClass::query() + ->whereRaw('lower(name) = ?', [mb_strtolower($normalized)]) + ->first(); + + if ($existing) { + return $existing->getKey(); + } + + /** @var \Illuminate\Database\Eloquent\Model $model */ + $model = new $modelClass(); + $model->setAttribute('name', $normalized); + $model->save(); + return $model->getKey(); + }) + ->filter() + ->values() + ->all(); + + // Sync relation if method exists + if (method_exists($movie, $relation)) { + $movie->{$relation}()->sync($ids); + } + } + + /** + * Normalize a person/genre/studio/etc name for de-duplication. + */ + protected function normalizeName(string $name): string + { + // Trim, collapse internal whitespace to single spaces + $name = trim(preg_replace('/\s+/u', ' ', $name) ?? ''); + // Leave original casing (provider’s) but comparisons will be lowercase. + return $name; + } +} diff --git a/app/Modules/Movies/routes/admin.php b/app/Modules/Movies/routes/admin.php new file mode 100644 index 0000000..f473383 --- /dev/null +++ b/app/Modules/Movies/routes/admin.php @@ -0,0 +1,26 @@ +name('index'); + +// Admin Add Movie page (OMDb search + accept flow) +Route::get('add', [MoviesPageController::class, '__invoke'])->name('add'); + +Route::get('search', [SearchMoviesController::class, '__invoke'])->name('search'); +Route::post('accept', [AcceptMovieController::class, 'store'])->name('accept'); +Route::get('exists', [ExistsMovieController::class, '__invoke'])->name('exists'); + +// Admin edit/update/delete +Route::get('{movie}/edit', [EditMoviePageController::class, '__invoke'])->name('edit'); +Route::patch('{movie}', [UpdateMovieController::class, 'update'])->name('update'); +Route::delete('{movie}', [DeleteMovieController::class, 'destroy'])->name('destroy'); diff --git a/app/Modules/Movies/routes/api.php b/app/Modules/Movies/routes/api.php new file mode 100644 index 0000000..03a8c59 --- /dev/null +++ b/app/Modules/Movies/routes/api.php @@ -0,0 +1,9 @@ +name('index'); +Route::get('{movie}', [MovieShowController::class, '__invoke'])->name('show'); diff --git a/app/Modules/Movies/routes/api_actors.php b/app/Modules/Movies/routes/api_actors.php new file mode 100644 index 0000000..e6036da --- /dev/null +++ b/app/Modules/Movies/routes/api_actors.php @@ -0,0 +1,6 @@ +name('show'); diff --git a/app/Modules/Movies/routes/api_directors.php b/app/Modules/Movies/routes/api_directors.php new file mode 100644 index 0000000..3351f48 --- /dev/null +++ b/app/Modules/Movies/routes/api_directors.php @@ -0,0 +1,6 @@ +name('show'); diff --git a/app/Modules/Movies/routes/api_genres.php b/app/Modules/Movies/routes/api_genres.php new file mode 100644 index 0000000..2960f8c --- /dev/null +++ b/app/Modules/Movies/routes/api_genres.php @@ -0,0 +1,6 @@ +name('show'); diff --git a/app/Modules/Movies/routes/api_studios.php b/app/Modules/Movies/routes/api_studios.php new file mode 100644 index 0000000..9ebdab7 --- /dev/null +++ b/app/Modules/Movies/routes/api_studios.php @@ -0,0 +1,6 @@ +name('show'); diff --git a/app/Modules/Movies/routes/pages.php b/app/Modules/Movies/routes/pages.php new file mode 100644 index 0000000..807f226 --- /dev/null +++ b/app/Modules/Movies/routes/pages.php @@ -0,0 +1,9 @@ +name('index'); +Route::get('{movie}', [PublicMovieShowPageController::class, '__invoke'])->name('show'); diff --git a/app/Modules/Movies/routes/pages_actors.php b/app/Modules/Movies/routes/pages_actors.php new file mode 100644 index 0000000..65b4833 --- /dev/null +++ b/app/Modules/Movies/routes/pages_actors.php @@ -0,0 +1,6 @@ +name('show'); diff --git a/app/Modules/Movies/routes/pages_directors.php b/app/Modules/Movies/routes/pages_directors.php new file mode 100644 index 0000000..0d69ed6 --- /dev/null +++ b/app/Modules/Movies/routes/pages_directors.php @@ -0,0 +1,6 @@ +name('show'); diff --git a/app/Modules/Movies/routes/pages_genres.php b/app/Modules/Movies/routes/pages_genres.php new file mode 100644 index 0000000..f05e2e3 --- /dev/null +++ b/app/Modules/Movies/routes/pages_genres.php @@ -0,0 +1,6 @@ +name('show'); diff --git a/app/Modules/Movies/routes/pages_studios.php b/app/Modules/Movies/routes/pages_studios.php new file mode 100644 index 0000000..7b859db --- /dev/null +++ b/app/Modules/Movies/routes/pages_studios.php @@ -0,0 +1,6 @@ +name('show'); diff --git a/app/Modules/Movies/routes/public.php b/app/Modules/Movies/routes/public.php new file mode 100644 index 0000000..c95a1a9 --- /dev/null +++ b/app/Modules/Movies/routes/public.php @@ -0,0 +1,8 @@ +name('index'); +Route::get('{movie}', [MovieShowController::class, '__invoke'])->name('show'); diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..452e6b6 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,24 @@ +configureActions(); + $this->configureViews(); + $this->configureRateLimiting(); + } + + /** + * Configure Fortify actions. + */ + private function configureActions(): void + { + Fortify::resetUserPasswordsUsing(ResetUserPassword::class); + Fortify::createUsersUsing(CreateNewUser::class); + } + + /** + * Configure Fortify views. + */ + private function configureViews(): void + { + Fortify::loginView(fn (Request $request) => Inertia::render('auth/Login', [ + 'canResetPassword' => Features::enabled(Features::resetPasswords()), + 'canRegister' => Features::enabled(Features::registration()), + 'status' => $request->session()->get('status'), + ])); + + Fortify::resetPasswordView(fn (Request $request) => Inertia::render('auth/ResetPassword', [ + 'email' => $request->email, + 'token' => $request->route('token'), + ])); + + Fortify::requestPasswordResetLinkView(fn (Request $request) => Inertia::render('auth/ForgotPassword', [ + 'status' => $request->session()->get('status'), + ])); + + Fortify::verifyEmailView(fn (Request $request) => Inertia::render('auth/VerifyEmail', [ + 'status' => $request->session()->get('status'), + ])); + + Fortify::registerView(fn () => Inertia::render('auth/Register')); + + Fortify::twoFactorChallengeView(fn () => Inertia::render('auth/TwoFactorChallenge')); + + Fortify::confirmPasswordView(fn () => Inertia::render('auth/ConfirmPassword')); + } + + /** + * Configure rate limiting. + */ + private function configureRateLimiting(): void + { + RateLimiter::for('two-factor', function (Request $request) { + return Limit::perMinute(5)->by($request->session()->get('login.id')); + }); + + RateLimiter::for('login', function (Request $request) { + $throttleKey = Str::transliterate(Str::lower($request->input(Fortify::username())).'|'.$request->ip()); + + return Limit::perMinute(5)->by($throttleKey); + }); + } +} diff --git a/artisan b/artisan new file mode 100755 index 0000000..c35e31d --- /dev/null +++ b/artisan @@ -0,0 +1,18 @@ +#!/usr/bin/env php +handleCommand(new ArgvInput); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..1e4d2e4 --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,30 @@ +withRouting( + web: __DIR__.'/../routes/web.php', + commands: __DIR__.'/../routes/console.php', + health: '/up', + ) + ->withProviders([ + App\Modules\Movies\Providers\MoviesServiceProvider::class, + ]) + ->withMiddleware(function (Middleware $middleware): void { + $middleware->encryptCookies(except: ['appearance', 'sidebar_state']); + + $middleware->web(append: [ + HandleAppearance::class, + HandleInertiaRequests::class, + AddLinkHeadersForPreloadedAssets::class, + ]); + }) + ->withExceptions(function (Exceptions $exceptions): void { + // + })->create(); diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/bootstrap/providers.php b/bootstrap/providers.php new file mode 100644 index 0000000..0ad9c57 --- /dev/null +++ b/bootstrap/providers.php @@ -0,0 +1,6 @@ +=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "dasprid/enum", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "b5874fa9ed0043116c72162ec7f4fb50e02e7cce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/b5874fa9ed0043116c72162ec7f4fb50e02e7cce", + "reference": "b5874fa9ed0043116c72162ec7f4fb50e02e7cce", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.7" + }, + "time": "2025-09-16T12:23:56+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "shasum": "" + }, + "require": { + "php": "^8.2|^8.3|^8.4|^8.5" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.32|^2.1.31", + "phpunit/phpunit": "^8.5.48|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2025-10-31T18:51:33+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "shasum": "" + }, + "require": { + "php": "^8.1", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8" + }, + "require-dev": { + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-12-03T09:33:47+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-08-23T22:36:01+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2025-08-23T21:21:41+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:27:06+00:00" + }, + { + "name": "inertiajs/inertia-laravel", + "version": "v2.0.11", + "source": { + "type": "git", + "url": "https://github.com/inertiajs/inertia-laravel.git", + "reference": "041e148b3228407b5abe584a4f02df2651ab4d85" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/041e148b3228407b5abe584a4f02df2651ab4d85", + "reference": "041e148b3228407b5abe584a4f02df2651ab4d85", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel/framework": "^10.0|^11.0|^12.0", + "php": "^8.1.0", + "symfony/console": "^6.2|^7.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.2", + "larastan/larastan": "^3.0", + "laravel/pint": "^1.16", + "mockery/mockery": "^1.3.3", + "orchestra/testbench": "^8.0|^9.2|^10.0", + "phpunit/phpunit": "^10.4|^11.5", + "roave/security-advisories": "dev-master" + }, + "suggest": { + "ext-pcntl": "Recommended when running the Inertia SSR server via the `inertia:start-ssr` artisan command." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Inertia\\ServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./helpers.php" + ], + "psr-4": { + "Inertia\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "homepage": "https://reinink.ca" + } + ], + "description": "The Laravel adapter for Inertia.js.", + "keywords": [ + "inertia", + "laravel" + ], + "support": { + "issues": "https://github.com/inertiajs/inertia-laravel/issues", + "source": "https://github.com/inertiajs/inertia-laravel/tree/v2.0.11" + }, + "time": "2025-11-26T23:07:12+00:00" + }, + { + "name": "laravel/fortify", + "version": "v1.32.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/fortify.git", + "reference": "26db37ed915770e5f0f91f6b7e153d9b3e6c09e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/fortify/zipball/26db37ed915770e5f0f91f6b7e153d9b3e6c09e8", + "reference": "26db37ed915770e5f0f91f6b7e153d9b3e6c09e8", + "shasum": "" + }, + "require": { + "bacon/bacon-qr-code": "^3.0", + "ext-json": "*", + "illuminate/support": "^10.0|^11.0|^12.0", + "php": "^8.1", + "pragmarx/google2fa": "^9.0", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^8.36|^9.15|^10.8", + "phpstan/phpstan": "^1.10" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Fortify\\FortifyServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Fortify\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Backend controllers and scaffolding for Laravel authentication.", + "keywords": [ + "auth", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/fortify/issues", + "source": "https://github.com/laravel/fortify" + }, + "time": "2025-11-21T01:53:28+00:00" + }, + { + "name": "laravel/framework", + "version": "v12.41.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "3e229b05935fd0300c632fb1f718c73046d664fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/3e229b05935fd0300c632fb1f718c73046d664fc", + "reference": "3e229b05935fd0300c632fb1f718c73046d664fc", + "shasum": "" + }, + "require": { + "brick/math": "^0.11|^0.12|^0.13|^0.14", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.3.0", + "laravel/serializable-closure": "^1.3|^2.0", + "league/commonmark": "^2.7", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^3.8.4", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.2.0", + "symfony/error-handler": "^7.2.0", + "symfony/finder": "^7.2.0", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.2.0", + "symfony/mailer": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33", + "symfony/process": "^7.2.0", + "symfony/routing": "^7.2.0", + "symfony/uid": "^7.2.0", + "symfony/var-dumper": "^7.2.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/json-schema": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "laravel/pint": "^1.18", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "opis/json-schema": "^2.4.1", + "orchestra/testbench-core": "^10.8.0", + "pda/pheanstalk": "^5.0.6|^7.0.0", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", + "predis/predis": "^2.3|^3.0", + "resend/resend-php": "^0.10.0|^1.0", + "symfony/cache": "^7.2.0", + "symfony/http-client": "^7.2.0", + "symfony/psr-http-message-bridge": "^7.2.0", + "symfony/translation": "^7.2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", + "predis/predis": "Required to use the predis connector (^2.3|^3.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0|^1.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-12-03T01:02:13+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.3.8", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "096748cdfb81988f60090bbb839ce3205ace0d35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/096748cdfb81988f60090bbb839ce3205ace0d35", + "reference": "096748cdfb81988f60090bbb839ce3205ace0d35", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0|^12.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4|^4.0", + "phpstan/phpstan": "^1.12.28", + "phpstan/phpstan-mockery": "^1.1.3" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.8" + }, + "time": "2025-11-21T20:52:52+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v2.0.7", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "cb291e4c998ac50637c7eeb58189c14f5de5b9dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/cb291e4c998ac50637c7eeb58189c14f5de5b9dd", + "reference": "cb291e4c998ac50637c7eeb58189c14f5de5b9dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0|^4.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2025-11-21T20:52:36+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.10.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "3bcb5f62d6f837e0f093a601e26badafb127bd4c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/3bcb5f62d6f837e0f093a601e26badafb127bd4c", + "reference": "3bcb5f62d6f837e0f093a601e26badafb127bd4c", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.10.2" + }, + "time": "2025-11-20T16:29:12+00:00" + }, + { + "name": "laravel/wayfinder", + "version": "v0.1.12", + "source": { + "type": "git", + "url": "https://github.com/laravel/wayfinder.git", + "reference": "08285225df7f8a094789ad8f384ac6bad6712ff6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/wayfinder/zipball/08285225df7f8a094789ad8f384ac6bad6712ff6", + "reference": "08285225df7f8a094789ad8f384ac6bad6712ff6", + "shasum": "" + }, + "require": { + "illuminate/console": "^11.0|^12.0", + "illuminate/filesystem": "^11.0|^12.0", + "illuminate/routing": "^11.0|^12.0", + "illuminate/support": "^11.0|^12.0", + "php": "^8.2", + "phpstan/phpdoc-parser": "^2.3" + }, + "require-dev": { + "laravel/pint": "^1.21", + "orchestra/testbench": "^10.1 | ^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Wayfinder\\WayfinderServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Wayfinder\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Generate TypeScript representations of your Laravel actions and routes.", + "homepage": "https://github.com/laravel/wayfinder", + "keywords": [ + "laravel", + "php", + "routes", + "typescript" + ], + "support": { + "issues": "https://github.com/laravel/wayfinder/issues", + "source": "https://github.com/laravel/wayfinder" + }, + "time": "2025-09-08T17:03:10+00:00" + }, + { + "name": "league/commonmark", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4efa10c1e56488e658d10adf7b7b7dcd19940bfb", + "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.9-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2025-11-26T21:48:24+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.30.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277", + "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3|^2", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.30.2" + }, + "time": "2025-11-10T17:13:11+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.30.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/ab4f9d0d672f601b102936aa728801dd1a11968d", + "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.2" + }, + "time": "2025-11-10T11:23:37+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "league/uri", + "version": "7.6.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "f625804987a0a9112d954f9209d91fec52182344" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/f625804987a0a9112d954f9209d91fec52182344", + "reference": "f625804987a0a9112d954f9209d91fec52182344", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.6", + "php": "^8.1", + "psr/http-factory": "^1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", + "league/uri-components": "Needed to easily manipulate URI objects components", + "league/uri-polyfill": "Needed to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle WHATWG URL", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.6.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2025-11-18T12:17:23+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.6.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "ccbfb51c0445298e7e0b7f4481b942f589665368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/ccbfb51c0445298e7e0b7f4481b942f589665368", + "reference": "ccbfb51c0445298e7e0b7f4481b942f589665368", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle WHATWG URL", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.6.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2025-11-18T12:17:23+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.9.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.9.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2025-03-24T10:02:05+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.11.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "bdb375400dcd162624531666db4799b36b64e4a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1", + "reference": "bdb375400dcd162624531666db4799b36b64e4a1", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2025-12-02T21:04:28+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.3", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/2befc2f42d7c715fd9d95efc31b1081e5d765004", + "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.5" + }, + "require-dev": { + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^2.0@stable", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.3" + }, + "time": "2025-10-30T22:57:59+00:00" + }, + { + "name": "nette/utils", + "version": "v4.1.0", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "fa1f0b8261ed150447979eb22e373b7b7ad5a8e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/fa1f0b8261ed150447979eb22e373b7b7ad5a8e0", + "reference": "fa1f0b8261ed150447979eb22e373b7b7ad5a8e0", + "shasum": "" + }, + "require": { + "php": "8.2 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/tester": "^2.5", + "phpstan/phpstan-nette": "^2.0@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.1.0" + }, + "time": "2025-12-01T17:49:23+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.6.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "3a454ca033b9e06b63282ce19562e892747449bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb", + "reference": "3a454ca033b9e06b63282ce19562e892747449bb", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2" + }, + "time": "2025-10-21T19:32:17+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.3.3", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/6fb2a640ff502caace8e05fd7be3b503a7e1c017", + "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.3.6" + }, + "require-dev": { + "illuminate/console": "^11.46.1", + "laravel/pint": "^1.25.1", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.1.3", + "phpstan/phpstan": "^1.12.32", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.3.5", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.3" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2025-11-20T02:34:59+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.1.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2025-09-24T15:06:41+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.4", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2025-08-21T11:53:16+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", + "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0" + }, + "time": "2025-08-30T15:50:23+00:00" + }, + { + "name": "pragmarx/google2fa", + "version": "v9.0.0", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "e6bc62dd6ae83acc475f57912e27466019a1f2cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/e6bc62dd6ae83acc475f57912e27466019a1f2cf", + "reference": "e6bc62dd6ae83acc475f57912e27466019a1f2cf", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1.0|^2.0|^3.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa/issues", + "source": "https://github.com/antonioribeiro/google2fa/tree/v9.0.0" + }, + "time": "2025-09-19T22:51:08+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.15", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "38953bc71491c838fcb6ebcbdc41ab7483cd549c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/38953bc71491c838fcb6ebcbdc41ab7483cd549c", + "reference": "38953bc71491c838fcb6ebcbdc41ab7483cd549c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "composer/class-map-generator": "^1.6" + }, + "suggest": { + "composer/class-map-generator": "Improved tab completion performance with better class discovery.", + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "https://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.15" + }, + "time": "2025-11-28T00:00:14+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.1" + }, + "time": "2025-03-22T05:38:12+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.9.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/81f941f6f729b1e3ceea61d9d014f8b6c6800440", + "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.9.1" + }, + "time": "2025-09-04T20:59:21+00:00" + }, + { + "name": "symfony/clock", + "version": "v8.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/832119f9b8dbc6c8e6f65f30c5969eca1e88764f", + "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v8.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-12T15:46:48+00:00" + }, + { + "name": "symfony/console", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8", + "reference": "0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-27T13:27:24+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "ab862f478513e7ca2fe9ec117a6f01a8da6e1135" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/ab862f478513e7ca2fe9ec117a6f01a8da6e1135", + "reference": "ab862f478513e7ca2fe9ec117a6f01a8da6e1135", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-30T13:39:42+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/48be2b0653594eea32dcef130cca1c811dcf25c2", + "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-05T14:29:59+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v8.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "573f95783a2ec6e38752979db139f09fec033f03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/573f95783a2ec6e38752979db139f09fec033f03", + "reference": "573f95783a2ec6e38752979db139f09fec033f03", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/security-http": "<7.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/error-handler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-30T14:17:19+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "340b9ed7320570f319028a2cbec46d40535e94bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd", + "reference": "340b9ed7320570f319028a2cbec46d40535e94bd", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-05T05:42:40+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "769c1720b68e964b13b58529c17d4a385c62167b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/769c1720b68e964b13b58529c17d4a385c62167b", + "reference": "769c1720b68e964b13b58529c17d4a385c62167b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.1" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-13T08:49:24+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "7348193cd384495a755554382e4526f27c456085" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/7348193cd384495a755554382e4526f27c456085", + "reference": "7348193cd384495a755554382e4526f27c456085", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^7.3|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/flex": "<2.10", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^7.1|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.1|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-27T13:38:24+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "a3d9eea8cfa467ece41f0f54ba28185d74bd53fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/a3d9eea8cfa467ece41f0f54ba28185d74bd53fd", + "reference": "a3d9eea8cfa467ece41f0f54ba28185d74bd53fd", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/mime": "^7.2|^8.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-21T15:26:00+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/bdb02729471be5d047a3ac4a69068748f1a6be7a", + "reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-16T10:14:42+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-27T09:58:17+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-10T14:38:51+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-24T13:30:11+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-23T16:12:55+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", + "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-16T11:21:06+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "4720254cb2644a0b876233d258a32bf017330db7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/4720254cb2644a0b876233d258a32bf017330db7", + "reference": "4720254cb2644a0b876233d258a32bf017330db7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-27T13:27:24+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:30:57+00:00" + }, + { + "name": "symfony/string", + "version": "v8.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "f929eccf09531078c243df72398560e32fa4cf4f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/f929eccf09531078c243df72398560e32fa4cf4f", + "reference": "f929eccf09531078c243df72398560e32fa4cf4f", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v8.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-11T14:37:55+00:00" + }, + { + "name": "symfony/translation", + "version": "v8.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "82ab368a6fca6358d995b6dd5c41590fb42c03e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/82ab368a6fca6358d995b6dd5c41590fb42c03e6", + "reference": "82ab368a6fca6358d995b6dd5c41590fb42c03e6", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation-contracts": "^3.6.1" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/http-client-contracts": "<2.5", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v8.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-27T08:09:45+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "2498e9f81b7baa206f44de583f2f48350b90142c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/2498e9f81b7baa206f44de583f2f48350b90142c", + "reference": "2498e9f81b7baa206f44de583f2f48350b90142c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-25T11:02:55+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41fd6c4ae28c38b294b42af6db61446594a0dece", + "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-27T20:36:44+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" + }, + "time": "2024-12-21T16:25:41+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.2", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2025-04-30T23:37:27+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2024-11-21T01:49:47+00:00" + } + ], + "packages-dev": [ + { + "name": "brianium/paratest", + "version": "v7.15.0", + "source": { + "type": "git", + "url": "https://github.com/paratestphp/paratest.git", + "reference": "272ff9d59b2ed0bd97c86c3cfe97c9784dabf786" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/272ff9d59b2ed0bd97c86c3cfe97c9784dabf786", + "reference": "272ff9d59b2ed0bd97c86c3cfe97c9784dabf786", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "fidry/cpu-core-counter": "^1.3.0", + "jean85/pretty-package-versions": "^2.1.1", + "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "phpunit/php-code-coverage": "^12.5.0", + "phpunit/php-file-iterator": "^6", + "phpunit/php-timer": "^8", + "phpunit/phpunit": "^12.4.4", + "sebastian/environment": "^8.0.3", + "symfony/console": "^7.3.4 || ^8.0.0", + "symfony/process": "^7.3.4 || ^8.0.0" + }, + "require-dev": { + "doctrine/coding-standard": "^14.0.0", + "ext-pcntl": "*", + "ext-pcov": "*", + "ext-posix": "*", + "phpstan/phpstan": "^2.1.32", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpstan/phpstan-phpunit": "^2.0.8", + "phpstan/phpstan-strict-rules": "^2.0.7", + "symfony/filesystem": "^7.3.2 || ^8.0.0" + }, + "bin": [ + "bin/paratest", + "bin/paratest_for_phpstorm" + ], + "type": "library", + "autoload": { + "psr-4": { + "ParaTest\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "role": "Developer" + }, + { + "name": "Filippo Tessarotto", + "email": "zoeslam@gmail.com", + "role": "Developer" + } + ], + "description": "Parallel testing for PHP", + "homepage": "https://github.com/paratestphp/paratest", + "keywords": [ + "concurrent", + "parallel", + "phpunit", + "testing" + ], + "support": { + "issues": "https://github.com/paratestphp/paratest/issues", + "source": "https://github.com/paratestphp/paratest/tree/v7.15.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/Slamdunk", + "type": "github" + }, + { + "url": "https://paypal.me/filippotessarotto", + "type": "paypal" + } + ], + "time": "2025-11-30T08:08:11+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + }, + "time": "2025-04-07T20:06:18+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2025-08-14T07:29:31+00:00" + }, + { + "name": "filp/whoops", + "version": "2.18.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.18.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-08-08T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" + }, + "time": "2025-04-30T06:54:44+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "rector/rector": "^2.0", + "vimeo/psalm": "^4.3 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1" + }, + "time": "2025-03-19T14:43:43+00:00" + }, + { + "name": "laravel/boost", + "version": "v1.8.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/boost.git", + "reference": "dbdef07edbf101049f6d308654ead2f4324de703" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/boost/zipball/dbdef07edbf101049f6d308654ead2f4324de703", + "reference": "dbdef07edbf101049f6d308654ead2f4324de703", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^7.9", + "illuminate/console": "^10.49.0|^11.45.3|^12.28.1", + "illuminate/contracts": "^10.49.0|^11.45.3|^12.28.1", + "illuminate/routing": "^10.49.0|^11.45.3|^12.28.1", + "illuminate/support": "^10.49.0|^11.45.3|^12.28.1", + "laravel/mcp": "^0.4.1", + "laravel/prompts": "0.1.25|^0.3.6", + "laravel/roster": "^0.2.9", + "php": "^8.1" + }, + "require-dev": { + "laravel/pint": "1.20", + "mockery/mockery": "^1.6.12", + "orchestra/testbench": "^8.36.0|^9.15.0|^10.6", + "pestphp/pest": "^2.36.0|^3.8.4", + "phpstan/phpstan": "^2.1.27", + "rector/rector": "^2.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Boost\\BoostServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Boost\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Laravel Boost accelerates AI-assisted development by providing the essential context and structure that AI needs to generate high-quality, Laravel-specific code.", + "homepage": "https://github.com/laravel/boost", + "keywords": [ + "ai", + "dev", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/boost/issues", + "source": "https://github.com/laravel/boost" + }, + "time": "2025-12-05T05:54:57+00:00" + }, + { + "name": "laravel/mcp", + "version": "v0.4.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/mcp.git", + "reference": "27ab10181d25067de7ace427edb562084d0d0aa3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/mcp/zipball/27ab10181d25067de7ace427edb562084d0d0aa3", + "reference": "27ab10181d25067de7ace427edb562084d0d0aa3", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/console": "^10.49.0|^11.45.3|^12.28.1", + "illuminate/container": "^10.49.0|^11.45.3|^12.28.1", + "illuminate/contracts": "^10.49.0|^11.45.3|^12.28.1", + "illuminate/http": "^10.49.0|^11.45.3|^12.28.1", + "illuminate/json-schema": "^12.28.1", + "illuminate/routing": "^10.49.0|^11.45.3|^12.28.1", + "illuminate/support": "^10.49.0|^11.45.3|^12.28.1", + "illuminate/validation": "^10.49.0|^11.45.3|^12.28.1", + "php": "^8.1" + }, + "require-dev": { + "laravel/pint": "^1.20", + "orchestra/testbench": "^8.36|^9.15|^10.8", + "pestphp/pest": "^2.36.0|^3.8.4|^4.1.0", + "phpstan/phpstan": "^2.1.27", + "rector/rector": "^2.2.4" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Mcp": "Laravel\\Mcp\\Server\\Facades\\Mcp" + }, + "providers": [ + "Laravel\\Mcp\\Server\\McpServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Mcp\\": "src/", + "Laravel\\Mcp\\Server\\": "src/Server/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Rapidly build MCP servers for your Laravel applications.", + "homepage": "https://github.com/laravel/mcp", + "keywords": [ + "laravel", + "mcp" + ], + "support": { + "issues": "https://github.com/laravel/mcp/issues", + "source": "https://github.com/laravel/mcp" + }, + "time": "2025-12-04T17:29:08+00:00" + }, + { + "name": "laravel/pail", + "version": "v1.2.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "49f92285ff5d6fc09816e976a004f8dec6a0ea30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/49f92285ff5d6fc09816e976a004f8dec6a0ea30", + "reference": "49f92285ff5d6fc09816e976a004f8dec6a0ea30", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0", + "illuminate/contracts": "^10.24|^11.0|^12.0", + "illuminate/log": "^10.24|^11.0|^12.0", + "illuminate/process": "^10.24|^11.0|^12.0", + "illuminate/support": "^10.24|^11.0|^12.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "laravel/framework": "^10.24|^11.0|^12.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.17|^10.8", + "pestphp/pest": "^2.20|^3.0|^4.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0|^4.0", + "phpstan/phpstan": "^1.12.27", + "symfony/var-dumper": "^6.3|^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "dev", + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2025-11-20T16:29:35+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "69dcca060ecb15e4b564af63d1f642c81a241d6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/69dcca060ecb15e4b564af63d1f642c81a241d6f", + "reference": "69dcca060ecb15e4b564af63d1f642c81a241d6f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.90.0", + "illuminate/view": "^12.40.1", + "larastan/larastan": "^3.8.0", + "laravel-zero/framework": "^12.0.4", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^2.3.3", + "pestphp/pest": "^3.8.4" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "dev", + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2025-11-25T21:15:52+00:00" + }, + { + "name": "laravel/roster", + "version": "v0.2.9", + "source": { + "type": "git", + "url": "https://github.com/laravel/roster.git", + "reference": "82bbd0e2de614906811aebdf16b4305956816fa6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/roster/zipball/82bbd0e2de614906811aebdf16b4305956816fa6", + "reference": "82bbd0e2de614906811aebdf16b4305956816fa6", + "shasum": "" + }, + "require": { + "illuminate/console": "^10.0|^11.0|^12.0", + "illuminate/contracts": "^10.0|^11.0|^12.0", + "illuminate/routing": "^10.0|^11.0|^12.0", + "illuminate/support": "^10.0|^11.0|^12.0", + "php": "^8.1|^8.2", + "symfony/yaml": "^6.4|^7.2" + }, + "require-dev": { + "laravel/pint": "^1.14", + "mockery/mockery": "^1.6", + "orchestra/testbench": "^8.22.0|^9.0|^10.0", + "pestphp/pest": "^2.0|^3.0", + "phpstan/phpstan": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Roster\\RosterServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Roster\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Detect packages & approaches in use within a Laravel project", + "homepage": "https://github.com/laravel/roster", + "keywords": [ + "dev", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/roster/issues", + "source": "https://github.com/laravel/roster" + }, + "time": "2025-10-20T09:56:46+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.50.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "9177d5de1c8247166b92ea6049c2b069d2a1802f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/9177d5de1c8247166b92ea6049c2b069d2a1802f", + "reference": "9177d5de1c8247166b92ea6049c2b069d2a1802f", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0", + "symfony/yaml": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "phpstan/phpstan": "^2.0" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2025-12-03T17:16:36+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.8.3", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1dc9e88d105699d0fee8bb18890f41b274f6b4c4", + "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.18.1", + "nunomaduro/termwind": "^2.3.1", + "php": "^8.2.0", + "symfony/console": "^7.3.0" + }, + "conflict": { + "laravel/framework": "<11.44.2 || >=13.0.0", + "phpunit/phpunit": "<11.5.15 || >=13.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.8.3", + "larastan/larastan": "^3.4.2", + "laravel/framework": "^11.44.2 || ^12.18", + "laravel/pint": "^1.22.1", + "laravel/sail": "^1.43.1", + "laravel/sanctum": "^4.1.1", + "laravel/tinker": "^2.10.1", + "orchestra/testbench-core": "^9.12.0 || ^10.4", + "pestphp/pest": "^3.8.2 || ^4.0.0", + "sebastian/environment": "^7.2.1 || ^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "dev", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2025-11-20T02:55:25+00:00" + }, + { + "name": "pestphp/pest", + "version": "v4.1.6", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest.git", + "reference": "ae419afd363299c29ad5b17e8b70d118b1068bb4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest/zipball/ae419afd363299c29ad5b17e8b70d118b1068bb4", + "reference": "ae419afd363299c29ad5b17e8b70d118b1068bb4", + "shasum": "" + }, + "require": { + "brianium/paratest": "^7.14.2", + "nunomaduro/collision": "^8.8.3", + "nunomaduro/termwind": "^2.3.3", + "pestphp/pest-plugin": "^4.0.0", + "pestphp/pest-plugin-arch": "^4.0.0", + "pestphp/pest-plugin-mutate": "^4.0.1", + "pestphp/pest-plugin-profanity": "^4.2.0", + "php": "^8.3.0", + "phpunit/phpunit": "^12.4.4", + "symfony/process": "^7.4.0|^8.0.0" + }, + "conflict": { + "filp/whoops": "<2.18.3", + "phpunit/phpunit": ">12.4.4", + "sebastian/exporter": "<7.0.0", + "webmozart/assert": "<1.11.0" + }, + "require-dev": { + "pestphp/pest-dev-tools": "^4.0.0", + "pestphp/pest-plugin-browser": "^4.1.1", + "pestphp/pest-plugin-type-coverage": "^4.0.3", + "psy/psysh": "^0.12.15" + }, + "bin": [ + "bin/pest" + ], + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Mutate\\Plugins\\Mutate", + "Pest\\Plugins\\Configuration", + "Pest\\Plugins\\Bail", + "Pest\\Plugins\\Cache", + "Pest\\Plugins\\Coverage", + "Pest\\Plugins\\Init", + "Pest\\Plugins\\Environment", + "Pest\\Plugins\\Help", + "Pest\\Plugins\\Memory", + "Pest\\Plugins\\Only", + "Pest\\Plugins\\Printer", + "Pest\\Plugins\\ProcessIsolation", + "Pest\\Plugins\\Profile", + "Pest\\Plugins\\Retry", + "Pest\\Plugins\\Snapshot", + "Pest\\Plugins\\Verbose", + "Pest\\Plugins\\Version", + "Pest\\Plugins\\Shard", + "Pest\\Plugins\\Parallel" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php", + "src/Pest.php" + ], + "psr-4": { + "Pest\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "The elegant PHP Testing Framework.", + "keywords": [ + "framework", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "issues": "https://github.com/pestphp/pest/issues", + "source": "https://github.com/pestphp/pest/tree/v4.1.6" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-11-28T12:04:48+00:00" + }, + { + "name": "pestphp/pest-plugin", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin.git", + "reference": "9d4b93d7f73d3f9c3189bb22c220fef271cdf568" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/9d4b93d7f73d3f9c3189bb22c220fef271cdf568", + "reference": "9d4b93d7f73d3f9c3189bb22c220fef271cdf568", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0.0", + "composer-runtime-api": "^2.2.2", + "php": "^8.3" + }, + "conflict": { + "pestphp/pest": "<4.0.0" + }, + "require-dev": { + "composer/composer": "^2.8.10", + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Pest\\Plugin\\Manager" + }, + "autoload": { + "psr-4": { + "Pest\\Plugin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest plugin manager", + "keywords": [ + "framework", + "manager", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin/tree/v4.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2025-08-20T12:35:58+00:00" + }, + { + "name": "pestphp/pest-plugin-arch", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-arch.git", + "reference": "25bb17e37920ccc35cbbcda3b00d596aadf3e58d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/25bb17e37920ccc35cbbcda3b00d596aadf3e58d", + "reference": "25bb17e37920ccc35cbbcda3b00d596aadf3e58d", + "shasum": "" + }, + "require": { + "pestphp/pest-plugin": "^4.0.0", + "php": "^8.3", + "ta-tikoma/phpunit-architecture-test": "^0.8.5" + }, + "require-dev": { + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Arch\\Plugin" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Arch\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Arch plugin for Pest PHP.", + "keywords": [ + "arch", + "architecture", + "framework", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v4.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-08-20T13:10:51+00:00" + }, + { + "name": "pestphp/pest-plugin-laravel", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-laravel.git", + "reference": "e12a07046b826a40b1c8632fd7b80d6b8d7b628e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/e12a07046b826a40b1c8632fd7b80d6b8d7b628e", + "reference": "e12a07046b826a40b1c8632fd7b80d6b8d7b628e", + "shasum": "" + }, + "require": { + "laravel/framework": "^11.45.2|^12.25.0", + "pestphp/pest": "^4.0.0", + "php": "^8.3.0" + }, + "require-dev": { + "laravel/dusk": "^8.3.3", + "orchestra/testbench": "^9.13.0|^10.5.0", + "pestphp/pest-dev-tools": "^4.0.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Laravel\\Plugin" + ] + }, + "laravel": { + "providers": [ + "Pest\\Laravel\\PestServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Laravel Plugin", + "keywords": [ + "framework", + "laravel", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v4.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-08-20T12:46:37+00:00" + }, + { + "name": "pestphp/pest-plugin-mutate", + "version": "v4.0.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-mutate.git", + "reference": "d9b32b60b2385e1688a68cc227594738ec26d96c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/d9b32b60b2385e1688a68cc227594738ec26d96c", + "reference": "d9b32b60b2385e1688a68cc227594738ec26d96c", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.6.1", + "pestphp/pest-plugin": "^4.0.0", + "php": "^8.3", + "psr/simple-cache": "^3.0.0" + }, + "require-dev": { + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0", + "pestphp/pest-plugin-type-coverage": "^4.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pest\\Mutate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + }, + { + "name": "Sandro Gehri", + "email": "sandrogehri@gmail.com" + } + ], + "description": "Mutates your code to find untested cases", + "keywords": [ + "framework", + "mutate", + "mutation", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v4.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/gehrisandro", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-08-21T20:19:25+00:00" + }, + { + "name": "pestphp/pest-plugin-profanity", + "version": "v4.2.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-profanity.git", + "reference": "c37e5e2c7136ee4eae12082e7952332bc1c6600a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-profanity/zipball/c37e5e2c7136ee4eae12082e7952332bc1c6600a", + "reference": "c37e5e2c7136ee4eae12082e7952332bc1c6600a", + "shasum": "" + }, + "require": { + "pestphp/pest-plugin": "^4.0.0", + "php": "^8.3" + }, + "require-dev": { + "faissaloux/pest-plugin-inside": "^1.9", + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Profanity\\Plugin" + ] + } + }, + "autoload": { + "psr-4": { + "Pest\\Profanity\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Profanity Plugin", + "keywords": [ + "framework", + "pest", + "php", + "plugin", + "profanity", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-profanity/tree/v4.2.0" + }, + "time": "2025-10-28T23:14:11+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.6.5", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/90614c73d3800e187615e2dd236ad0e2a01bf761", + "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.5" + }, + "time": "2025-11-27T19:50:05+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0" + }, + "time": "2025-11-21T15:09:14+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "12.5.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "bca180c050dd3ae15f87c26d25cabb34fe1a0a5a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/bca180c050dd3ae15f87c26d25cabb34fe1a0a5a", + "reference": "bca180c050dd3ae15f87c26d25cabb34fe1a0a5a", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.6.2", + "php": ">=8.3", + "phpunit/php-file-iterator": "^6.0", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.0.3", + "sebastian/lines-of-code": "^4.0", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^1.3.1" + }, + "require-dev": { + "phpunit/phpunit": "^12.4.4" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "12.5.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2025-11-29T07:15:54+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "961bc913d42fe24a257bfff826a5068079ac7782" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", + "reference": "961bc913d42fe24a257bfff826a5068079ac7782", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:37+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^12.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:58+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:16+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "8.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:38+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "12.4.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "9253ec75a672e39fcc9d85bdb61448215b8162c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9253ec75a672e39fcc9d85bdb61448215b8162c7", + "reference": "9253ec75a672e39fcc9d85bdb61448215b8162c7", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.4.0", + "phpunit/php-file-iterator": "^6.0.0", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.0", + "sebastian/comparator": "^7.1.3", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.0.3", + "sebastian/exporter": "^7.0.2", + "sebastian/global-state": "^8.0.2", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/type": "^6.0.3", + "sebastian/version": "^6.0.0", + "staabm/side-effects-detector": "^1.0.5" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "12.4-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.4.4" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2025-11-21T07:39:11+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" + } + ], + "time": "2025-09-14T09:36:45+00:00" + }, + { + "name": "sebastian/comparator", + "version": "7.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dc904b4bb3ab070865fa4068cd84f3da8b945148", + "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.2" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2025-08-20T11:27:00+00:00" + }, + { + "name": "sebastian/complexity", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:46+00:00" + }, + { + "name": "sebastian/environment", + "version": "8.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2025-08-12T14:11:56+00:00" + }, + { + "name": "sebastian/exporter", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2025-09-24T06:16:11+00:00" + }, + { + "name": "sebastian/global-state", + "version": "8.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" + } + ], + "time": "2025-08-29T11:29:25+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:57:28+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:57:48+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:17+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-13T04:44:59+00:00" + }, + { + "name": "sebastian/type", + "version": "6.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2025-08-09T06:57:12+00:00" + }, + { + "name": "sebastian/version", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T05:00:38+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "6c84a4b55aee4cd02034d1c528e83f69ddf63810" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/6c84a4b55aee4cd02034d1c528e83f69ddf63810", + "reference": "6c84a4b55aee4cd02034d1c528e83f69ddf63810", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-16T10:14:42+00:00" + }, + { + "name": "ta-tikoma/phpunit-architecture-test", + "version": "0.8.5", + "source": { + "type": "git", + "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", + "reference": "cf6fb197b676ba716837c886baca842e4db29005" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/cf6fb197b676ba716837c886baca842e4db29005", + "reference": "cf6fb197b676ba716837c886baca842e4db29005", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18.0 || ^5.0.0", + "php": "^8.1.0", + "phpdocumentor/reflection-docblock": "^5.3.0", + "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0", + "symfony/finder": "^6.4.0 || ^7.0.0" + }, + "require-dev": { + "laravel/pint": "^1.13.7", + "phpstan/phpstan": "^1.10.52" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPUnit\\Architecture\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ni Shi", + "email": "futik0ma011@gmail.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Methods for testing application architecture", + "keywords": [ + "architecture", + "phpunit", + "stucture", + "test", + "testing" + ], + "support": { + "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.5" + }, + "time": "2025-04-20T20:23:40+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-11-17T20:03:58+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-date": "*", + "ext-filter": "*", + "php": "^7.2 || ^8.0" + }, + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.12.1" + }, + "time": "2025-10-29T15:56:20+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.2" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..f4866e7 --- /dev/null +++ b/config/app.php @@ -0,0 +1,126 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | the application so that it's available within Artisan commands. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. + | + */ + + 'timezone' => 'America/Chicago', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), + + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. + | + */ + + 'cipher' => 'AES-256-CBC', + + 'key' => env('APP_KEY'), + + 'previous_keys' => [ + ...array_filter( + explode(',', (string) env('APP_PREVIOUS_KEYS', '')) + ), + ], + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), + ], + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..7d1eb0d --- /dev/null +++ b/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => env('AUTH_GUARD', 'web'), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | which utilizes session storage plus the Eloquent user provider. + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | If you have multiple user tables or models you may configure multiple + | providers to represent the model / table. These providers may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => env('AUTH_MODEL', App\Models\User::class), + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the number of seconds before a password confirmation + | window expires and users are asked to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..b32aead --- /dev/null +++ b/config/cache.php @@ -0,0 +1,117 @@ + env('CACHE_STORE', 'database'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "array", "database", "file", "memcached", + | "redis", "dynamodb", "octane", + | "failover", "null" + | + */ + + 'stores' => [ + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_CACHE_CONNECTION'), + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + 'lock_table' => env('DB_CACHE_LOCK_TABLE'), + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), + 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + 'failover' => [ + 'driver' => 'failover', + 'stores' => [ + 'database', + 'array', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'), + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..53dcae0 --- /dev/null +++ b/config/database.php @@ -0,0 +1,183 @@ + env('DB_CONNECTION', 'sqlite'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DB_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + 'busy_timeout' => null, + 'journal_mode' => null, + 'synchronous' => null, + 'transaction_mode' => 'DEFERRED', + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'mariadb' => [ + 'driver' => 'mariadb', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'), + 'persistent' => env('REDIS_PERSISTENT', false), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..3d671bd --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,80 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Below you may configure as many filesystem disks as necessary, and you + | may even configure multiple disks for the same driver. Examples for + | most supported storage drivers are configured here for reference. + | + | Supported drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app/private'), + 'serve' => true, + 'throw' => false, + 'report' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + 'throw' => false, + 'report' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + 'report' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/fortify.php b/config/fortify.php new file mode 100644 index 0000000..ce67e2c --- /dev/null +++ b/config/fortify.php @@ -0,0 +1,157 @@ + 'web', + + /* + |-------------------------------------------------------------------------- + | Fortify Password Broker + |-------------------------------------------------------------------------- + | + | Here you may specify which password broker Fortify can use when a user + | is resetting their password. This configured value should match one + | of your password brokers setup in your "auth" configuration file. + | + */ + + 'passwords' => 'users', + + /* + |-------------------------------------------------------------------------- + | Username / Email + |-------------------------------------------------------------------------- + | + | This value defines which model attribute should be considered as your + | application's "username" field. Typically, this might be the email + | address of the users but you are free to change this value here. + | + | Out of the box, Fortify expects forgot password and reset password + | requests to have a field named 'email'. If the application uses + | another name for the field you may define it below as needed. + | + */ + + 'username' => 'email', + + 'email' => 'email', + + /* + |-------------------------------------------------------------------------- + | Lowercase Usernames + |-------------------------------------------------------------------------- + | + | This value defines whether usernames should be lowercased before saving + | them in the database, as some database system string fields are case + | sensitive. You may disable this for your application if necessary. + | + */ + + 'lowercase_usernames' => true, + + /* + |-------------------------------------------------------------------------- + | Home Path + |-------------------------------------------------------------------------- + | + | Here you may configure the path where users will get redirected during + | authentication or password reset when the operations are successful + | and the user is authenticated. You are free to change this value. + | + */ + + 'home' => '/dashboard', + + /* + |-------------------------------------------------------------------------- + | Fortify Routes Prefix / Subdomain + |-------------------------------------------------------------------------- + | + | Here you may specify which prefix Fortify will assign to all the routes + | that it registers with the application. If necessary, you may change + | subdomain under which all of the Fortify routes will be available. + | + */ + + 'prefix' => '', + + 'domain' => null, + + /* + |-------------------------------------------------------------------------- + | Fortify Routes Middleware + |-------------------------------------------------------------------------- + | + | Here you may specify which middleware Fortify will assign to the routes + | that it registers with the application. If necessary, you may change + | these middleware but typically this provided default is preferred. + | + */ + + 'middleware' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Rate Limiting + |-------------------------------------------------------------------------- + | + | By default, Fortify will throttle logins to five requests per minute for + | every email and IP address combination. However, if you would like to + | specify a custom rate limiter to call then you may specify it here. + | + */ + + 'limiters' => [ + 'login' => 'login', + 'two-factor' => 'two-factor', + ], + + /* + |-------------------------------------------------------------------------- + | Register View Routes + |-------------------------------------------------------------------------- + | + | Here you may specify if the routes returning views should be disabled as + | you may not need them when building your own application. This may be + | especially true if you're writing a custom single-page application. + | + */ + + 'views' => true, + + /* + |-------------------------------------------------------------------------- + | Features + |-------------------------------------------------------------------------- + | + | Some of the Fortify features are optional. You may disable the features + | by removing them from this array. You're free to only remove some of + | these features, or you can even remove all of these if you need to. + | + */ + + 'features' => [ + Features::registration(), + Features::resetPasswords(), + Features::emailVerification(), + Features::twoFactorAuthentication([ + 'confirm' => true, + 'confirmPassword' => true, + // 'window' => 0 + ]), + ], + +]; diff --git a/config/inertia.php b/config/inertia.php new file mode 100644 index 0000000..d15cad9 --- /dev/null +++ b/config/inertia.php @@ -0,0 +1,52 @@ + [ + 'enabled' => true, + 'url' => 'http://127.0.0.1:13714', + // 'bundle' => base_path('bootstrap/ssr/ssr.mjs'), + ], + + /* + |-------------------------------------------------------------------------- + | Testing + |-------------------------------------------------------------------------- + | + | The values described here are used to locate Inertia components on the + | filesystem. For instance, when using `assertInertia`, the assertion + | attempts to locate the component as a file relative to the paths. + | + */ + + 'testing' => [ + 'ensure_pages_exist' => true, + + 'page_paths' => [ + resource_path('js/pages'), + ], + + 'page_extensions' => [ + 'js', + 'jsx', + 'svelte', + 'ts', + 'tsx', + 'vue', + ], + ], + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..9e998a4 --- /dev/null +++ b/config/logging.php @@ -0,0 +1,132 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => env('LOG_DEPRECATIONS_TRACE', false), + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Laravel + | utilizes the Monolog PHP logging library, which includes a variety + | of powerful log handlers and formatters that you're free to use. + | + | Available drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", "custom", "stack" + | + */ + + 'channels' => [ + + 'stack' => [ + 'driver' => 'stack', + 'channels' => explode(',', (string) env('LOG_STACK', 'single')), + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => env('LOG_DAILY_DAYS', 14), + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), + 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'handler_with' => [ + 'stream' => 'php://stderr', + ], + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..522b284 --- /dev/null +++ b/config/mail.php @@ -0,0 +1,118 @@ + env('MAIL_MAILER', 'log'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" + | + */ + + 'mailers' => [ + + 'smtp' => [ + 'transport' => 'smtp', + 'scheme' => env('MAIL_SCHEME'), + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'resend' => [ + 'transport' => 'resend', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + 'retry_after' => 60, + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + 'retry_after' => 60, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + +]; diff --git a/config/movies.php b/config/movies.php new file mode 100644 index 0000000..01ce108 --- /dev/null +++ b/config/movies.php @@ -0,0 +1,13 @@ + 'omdb', + + 'omdb' => [ + 'base_url' => env('OMDB_BASE_URL', 'https://www.omdbapi.com/'), + 'api_key' => env('OMDB_API_KEY'), + 'language' => env('OMDB_LANGUAGE', 'en-US'), + // Cache duration in seconds + 'cache_ttl' => env('OMDB_CACHE_TTL', 3600), + ], +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..79c2c0a --- /dev/null +++ b/config/queue.php @@ -0,0 +1,129 @@ + env('QUEUE_CONNECTION', 'database'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Laravel. You're also free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", + | "deferred", "background", "failover", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), + 'block_for' => null, + 'after_commit' => false, + ], + + 'deferred' => [ + 'driver' => 'deferred', + ], + + 'background' => [ + 'driver' => 'background', + ], + + 'failover' => [ + 'driver' => 'failover', + 'connections' => [ + 'database', + 'deferred', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..6a90eb8 --- /dev/null +++ b/config/services.php @@ -0,0 +1,38 @@ + [ + 'key' => env('POSTMARK_API_KEY'), + ], + + 'resend' => [ + 'key' => env('RESEND_API_KEY'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..bc45901 --- /dev/null +++ b/config/session.php @@ -0,0 +1,217 @@ + env('SESSION_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. + | + */ + + 'lifetime' => (int) env('SESSION_LIFETIME', 120), + + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. + | + */ + + 'encrypt' => env('SESSION_ENCRYPT', false), + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. + | + */ + + 'table' => env('SESSION_TABLE', 'sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. + | + | Affects: "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug((string) env('APP_NAME', 'laravel')).'-session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application, but you're free to change this when necessary. + | + */ + + 'path' => env('SESSION_PATH', '/'), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | This value determines the domain and subdomains the session cookie is + | available to. By default, the cookie will be available to the root + | domain and all subdomains. Typically, this shouldn't be changed. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. It's unlikely you should disable this option. + | + */ + + 'http_only' => env('SESSION_HTTP_ONLY', true), + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" to permit secure cross-site requests. + | + | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => env('SESSION_SAME_SITE', 'lax'), + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/ActorFactory.php b/database/factories/ActorFactory.php new file mode 100644 index 0000000..1c79738 --- /dev/null +++ b/database/factories/ActorFactory.php @@ -0,0 +1,21 @@ + + */ +class ActorFactory extends Factory +{ + protected $model = Actor::class; + + public function definition(): array + { + return [ + 'name' => $this->faker->unique()->name(), + ]; + } +} diff --git a/database/factories/CountryFactory.php b/database/factories/CountryFactory.php new file mode 100644 index 0000000..ac74ede --- /dev/null +++ b/database/factories/CountryFactory.php @@ -0,0 +1,21 @@ + + */ +class CountryFactory extends Factory +{ + protected $model = Country::class; + + public function definition(): array + { + return [ + 'name' => $this->faker->unique()->country(), + ]; + } +} diff --git a/database/factories/DirectorFactory.php b/database/factories/DirectorFactory.php new file mode 100644 index 0000000..8907e49 --- /dev/null +++ b/database/factories/DirectorFactory.php @@ -0,0 +1,21 @@ + + */ +class DirectorFactory extends Factory +{ + protected $model = Director::class; + + public function definition(): array + { + return [ + 'name' => $this->faker->unique()->name(), + ]; + } +} diff --git a/database/factories/GenreFactory.php b/database/factories/GenreFactory.php new file mode 100644 index 0000000..ca0e7c3 --- /dev/null +++ b/database/factories/GenreFactory.php @@ -0,0 +1,21 @@ + + */ +class GenreFactory extends Factory +{ + protected $model = Genre::class; + + public function definition(): array + { + return [ + 'name' => $this->faker->unique()->word(), + ]; + } +} diff --git a/database/factories/LanguageFactory.php b/database/factories/LanguageFactory.php new file mode 100644 index 0000000..5d97acd --- /dev/null +++ b/database/factories/LanguageFactory.php @@ -0,0 +1,21 @@ + + */ +class LanguageFactory extends Factory +{ + protected $model = Language::class; + + public function definition(): array + { + return [ + 'name' => $this->faker->unique()->languageCode(), + ]; + } +} diff --git a/database/factories/MovieFactory.php b/database/factories/MovieFactory.php new file mode 100644 index 0000000..27f8d74 --- /dev/null +++ b/database/factories/MovieFactory.php @@ -0,0 +1,35 @@ + + */ +class MovieFactory extends Factory +{ + protected $model = Movie::class; + + public function definition(): array + { + return [ + 'provider' => 'omdb', + 'provider_id' => $this->faker->unique()->bothify('tt########'), + 'external_ids' => [ + 'imdb' => $this->faker->bothify('tt########'), + 'omdb' => $this->faker->bothify('tt########'), + ], + 'title' => $this->faker->sentence(3), + 'original_title' => $this->faker->sentence(3), + 'description' => $this->faker->paragraph(), + 'poster_url' => $this->faker->imageUrl(300, 450, 'movie', true), + 'backdrop_url' => $this->faker->imageUrl(1280, 720, 'movie', true), + 'rating' => $this->faker->randomElement(['G','PG','PG-13','R','NC-17']), + 'release_date' => $this->faker->date(), + 'year' => (int) $this->faker->year(), + 'runtime' => $this->faker->numberBetween(60, 180), + ]; + } +} diff --git a/database/factories/StudioFactory.php b/database/factories/StudioFactory.php new file mode 100644 index 0000000..beead19 --- /dev/null +++ b/database/factories/StudioFactory.php @@ -0,0 +1,21 @@ + + */ +class StudioFactory extends Factory +{ + protected $model = Studio::class; + + public function definition(): array + { + return [ + 'name' => $this->faker->unique()->company(), + ]; + } +} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..07af023 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,59 @@ + + */ +class UserFactory extends Factory +{ + /** + * The current password being used by the factory. + */ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => static::$password ??= Hash::make('password'), + 'remember_token' => Str::random(10), + 'two_factor_secret' => Str::random(10), + 'two_factor_recovery_codes' => Str::random(10), + 'two_factor_confirmed_at' => now(), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } + + /** + * Indicate that the model does not have two-factor authentication configured. + */ + public function withoutTwoFactor(): static + { + return $this->state(fn (array $attributes) => [ + 'two_factor_secret' => null, + 'two_factor_recovery_codes' => null, + 'two_factor_confirmed_at' => null, + ]); + } +} diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php new file mode 100644 index 0000000..05fb5d9 --- /dev/null +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -0,0 +1,49 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + + Schema::create('password_reset_tokens', function (Blueprint $table) { + $table->string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + + Schema::create('sessions', function (Blueprint $table) { + $table->string('id')->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->longText('payload'); + $table->integer('last_activity')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + Schema::dropIfExists('password_reset_tokens'); + Schema::dropIfExists('sessions'); + } +}; diff --git a/database/migrations/0001_01_01_000001_create_cache_table.php b/database/migrations/0001_01_01_000001_create_cache_table.php new file mode 100644 index 0000000..b9c106b --- /dev/null +++ b/database/migrations/0001_01_01_000001_create_cache_table.php @@ -0,0 +1,35 @@ +string('key')->primary(); + $table->mediumText('value'); + $table->integer('expiration'); + }); + + Schema::create('cache_locks', function (Blueprint $table) { + $table->string('key')->primary(); + $table->string('owner'); + $table->integer('expiration'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cache'); + Schema::dropIfExists('cache_locks'); + } +}; diff --git a/database/migrations/0001_01_01_000002_create_jobs_table.php b/database/migrations/0001_01_01_000002_create_jobs_table.php new file mode 100644 index 0000000..425e705 --- /dev/null +++ b/database/migrations/0001_01_01_000002_create_jobs_table.php @@ -0,0 +1,57 @@ +id(); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + + Schema::create('job_batches', function (Blueprint $table) { + $table->string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->longText('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + + Schema::create('failed_jobs', function (Blueprint $table) { + $table->id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + Schema::dropIfExists('job_batches'); + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php b/database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php new file mode 100644 index 0000000..187d974 --- /dev/null +++ b/database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php @@ -0,0 +1,34 @@ +text('two_factor_secret')->after('password')->nullable(); + $table->text('two_factor_recovery_codes')->after('two_factor_secret')->nullable(); + $table->timestamp('two_factor_confirmed_at')->after('two_factor_recovery_codes')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn([ + 'two_factor_secret', + 'two_factor_recovery_codes', + 'two_factor_confirmed_at', + ]); + }); + } +}; diff --git a/database/migrations/2025_12_05_000001_create_movies_tables.php b/database/migrations/2025_12_05_000001_create_movies_tables.php new file mode 100644 index 0000000..68764f9 --- /dev/null +++ b/database/migrations/2025_12_05_000001_create_movies_tables.php @@ -0,0 +1,116 @@ +id(); + $table->string('provider')->nullable(); + $table->string('provider_id')->nullable()->index(); + $table->json('external_ids')->nullable(); + $table->string('title'); + $table->string('original_title')->nullable(); + $table->text('description')->nullable(); + $table->string('poster_url')->nullable(); + $table->string('backdrop_url')->nullable(); + $table->string('rating', 20)->nullable(); + $table->date('release_date')->nullable(); + $table->unsignedSmallInteger('year')->nullable(); + $table->unsignedSmallInteger('runtime')->nullable(); // minutes + $table->timestamps(); + }); + + Schema::create('genres', function (Blueprint $table) { + $table->id(); + $table->string('name')->unique(); + $table->timestamps(); + }); + + Schema::create('actors', function (Blueprint $table) { + $table->id(); + $table->string('name')->unique(); + $table->timestamps(); + }); + + Schema::create('directors', function (Blueprint $table) { + $table->id(); + $table->string('name')->unique(); + $table->timestamps(); + }); + + Schema::create('studios', function (Blueprint $table) { + $table->id(); + $table->string('name')->unique(); + $table->timestamps(); + }); + + Schema::create('countries', function (Blueprint $table) { + $table->id(); + $table->string('name')->unique(); + $table->timestamps(); + }); + + Schema::create('languages', function (Blueprint $table) { + $table->id(); + $table->string('name')->unique(); + $table->timestamps(); + }); + + Schema::create('movie_genre', function (Blueprint $table) { + $table->foreignId('movie_id')->constrained('movies')->cascadeOnDelete(); + $table->foreignId('genre_id')->constrained('genres')->cascadeOnDelete(); + $table->primary(['movie_id','genre_id']); + }); + + Schema::create('movie_actor', function (Blueprint $table) { + $table->foreignId('movie_id')->constrained('movies')->cascadeOnDelete(); + $table->foreignId('actor_id')->constrained('actors')->cascadeOnDelete(); + $table->primary(['movie_id','actor_id']); + }); + + Schema::create('movie_director', function (Blueprint $table) { + $table->foreignId('movie_id')->constrained('movies')->cascadeOnDelete(); + $table->foreignId('director_id')->constrained('directors')->cascadeOnDelete(); + $table->primary(['movie_id','director_id']); + }); + + Schema::create('movie_studio', function (Blueprint $table) { + $table->foreignId('movie_id')->constrained('movies')->cascadeOnDelete(); + $table->foreignId('studio_id')->constrained('studios')->cascadeOnDelete(); + $table->primary(['movie_id','studio_id']); + }); + + Schema::create('movie_country', function (Blueprint $table) { + $table->foreignId('movie_id')->constrained('movies')->cascadeOnDelete(); + $table->foreignId('country_id')->constrained('countries')->cascadeOnDelete(); + $table->primary(['movie_id','country_id']); + }); + + Schema::create('movie_language', function (Blueprint $table) { + $table->foreignId('movie_id')->constrained('movies')->cascadeOnDelete(); + $table->foreignId('language_id')->constrained('languages')->cascadeOnDelete(); + $table->primary(['movie_id','language_id']); + }); + } + + public function down(): void + { + Schema::dropIfExists('movie_language'); + Schema::dropIfExists('movie_country'); + Schema::dropIfExists('movie_studio'); + Schema::dropIfExists('movie_director'); + Schema::dropIfExists('movie_actor'); + Schema::dropIfExists('movie_genre'); + Schema::dropIfExists('languages'); + Schema::dropIfExists('countries'); + Schema::dropIfExists('studios'); + Schema::dropIfExists('directors'); + Schema::dropIfExists('actors'); + Schema::dropIfExists('genres'); + Schema::dropIfExists('movies'); + } +}; diff --git a/database/migrations/2025_12_06_014900_make_supporting_names_case_insensitive_unique.php b/database/migrations/2025_12_06_014900_make_supporting_names_case_insensitive_unique.php new file mode 100644 index 0000000..7b0e20f --- /dev/null +++ b/database/migrations/2025_12_06_014900_make_supporting_names_case_insensitive_unique.php @@ -0,0 +1,54 @@ +getDriverName(); + + if ($driver === 'sqlite') { + // Drop existing unique indexes on name + DB::statement('DROP INDEX IF EXISTS genres_name_unique'); + DB::statement('DROP INDEX IF EXISTS actors_name_unique'); + DB::statement('DROP INDEX IF EXISTS directors_name_unique'); + DB::statement('DROP INDEX IF EXISTS studios_name_unique'); + DB::statement('DROP INDEX IF EXISTS countries_name_unique'); + DB::statement('DROP INDEX IF EXISTS languages_name_unique'); + + // Create case-insensitive unique indexes using COLLATE NOCASE + DB::statement('CREATE UNIQUE INDEX IF NOT EXISTS genres_name_unique_nocase ON genres(name COLLATE NOCASE)'); + DB::statement('CREATE UNIQUE INDEX IF NOT EXISTS actors_name_unique_nocase ON actors(name COLLATE NOCASE)'); + DB::statement('CREATE UNIQUE INDEX IF NOT EXISTS directors_name_unique_nocase ON directors(name COLLATE NOCASE)'); + DB::statement('CREATE UNIQUE INDEX IF NOT EXISTS studios_name_unique_nocase ON studios(name COLLATE NOCASE)'); + DB::statement('CREATE UNIQUE INDEX IF NOT EXISTS countries_name_unique_nocase ON countries(name COLLATE NOCASE)'); + DB::statement('CREATE UNIQUE INDEX IF NOT EXISTS languages_name_unique_nocase ON languages(name COLLATE NOCASE)'); + } + // For other drivers, we keep the existing unique indexes which are typically case-insensitive by default + } + + public function down(): void + { + $driver = Schema::getConnection()->getDriverName(); + + if ($driver === 'sqlite') { + // Drop NOCASE indexes + DB::statement('DROP INDEX IF EXISTS genres_name_unique_nocase'); + DB::statement('DROP INDEX IF EXISTS actors_name_unique_nocase'); + DB::statement('DROP INDEX IF EXISTS directors_name_unique_nocase'); + DB::statement('DROP INDEX IF EXISTS studios_name_unique_nocase'); + DB::statement('DROP INDEX IF EXISTS countries_name_unique_nocase'); + DB::statement('DROP INDEX IF EXISTS languages_name_unique_nocase'); + + // Recreate default unique indexes (case-sensitive in SQLite) + DB::statement('CREATE UNIQUE INDEX IF NOT EXISTS genres_name_unique ON genres(name)'); + DB::statement('CREATE UNIQUE INDEX IF NOT EXISTS actors_name_unique ON actors(name)'); + DB::statement('CREATE UNIQUE INDEX IF NOT EXISTS directors_name_unique ON directors(name)'); + DB::statement('CREATE UNIQUE INDEX IF NOT EXISTS studios_name_unique ON studios(name)'); + DB::statement('CREATE UNIQUE INDEX IF NOT EXISTS countries_name_unique ON countries(name)'); + DB::statement('CREATE UNIQUE INDEX IF NOT EXISTS languages_name_unique ON languages(name)'); + } + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..d01a0ef --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,23 @@ +create(); + + User::factory()->create([ + 'name' => 'Test User', + 'email' => 'test@example.com', + ]); + } +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..ea86a49 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,19 @@ +import prettier from 'eslint-config-prettier/flat'; +import vue from 'eslint-plugin-vue'; + +import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript'; + +export default defineConfigWithVueTs( + vue.configs['flat/essential'], + vueTsConfigs.recommended, + { + ignores: ['vendor', 'node_modules', 'public', 'bootstrap/ssr', 'tailwind.config.js', 'resources/js/components/ui/*'], + }, + { + rules: { + 'vue/multi-word-component-names': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, + }, + prettier, +); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6bbe588 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5205 @@ +{ + "name": "pims", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@inertiajs/vue3": "^2.1.0", + "@vueuse/core": "^12.8.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "laravel-vite-plugin": "^2.0.0", + "lucide-vue-next": "^0.468.0", + "reka-ui": "^2.4.1", + "tailwind-merge": "^3.2.0", + "tailwindcss": "^4.1.1", + "tw-animate-css": "^1.2.5", + "vue": "^3.5.13" + }, + "devDependencies": { + "@eslint/js": "^9.19.0", + "@laravel/vite-plugin-wayfinder": "^0.1.3", + "@tailwindcss/vite": "^4.1.11", + "@types/node": "^22.13.5", + "@vitejs/plugin-vue": "^6.0.0", + "@vue/eslint-config-typescript": "^14.3.0", + "concurrently": "^9.0.1", + "eslint": "^9.17.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-vue": "^9.32.0", + "prettier": "^3.4.2", + "prettier-plugin-organize-imports": "^4.1.0", + "prettier-plugin-tailwindcss": "^0.6.11", + "typescript": "^5.2.2", + "typescript-eslint": "^8.23.0", + "vite": "^7.0.4", + "vue-tsc": "^2.2.4" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.9.5", + "@rollup/rollup-win32-x64-msvc": "4.9.5", + "@tailwindcss/oxide-linux-x64-gnu": "^4.0.1", + "@tailwindcss/oxide-win32-x64-msvc": "^4.0.1", + "lightningcss-linux-x64-gnu": "^1.29.1", + "lightningcss-win32-x64-msvc": "^1.29.1" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@floating-ui/vue": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.1.9.tgz", + "integrity": "sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4", + "@floating-ui/utils": "^0.2.10", + "vue-demi": ">=0.13.0" + } + }, + "node_modules/@floating-ui/vue/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inertiajs/core": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-2.2.7.tgz", + "integrity": "sha512-0qU/2zdeO6veUD28MENfvwXzOl8SOY5IZgsfRObOUBl/+DHdNWdKLHSx6gAJsNN3OSl4zpb+eankX0rkNRHh+Q==", + "license": "MIT", + "dependencies": { + "@types/lodash-es": "^4.17.12", + "axios": "^1.12.2", + "lodash-es": "^4.17.21", + "qs": "^6.14.0" + } + }, + "node_modules/@inertiajs/vue3": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-2.2.7.tgz", + "integrity": "sha512-0DIcU5jKjiLh9B5KXffNmsl4V5Ci6VMmdYp/B06Ss6LfIRI6zqm68C2tcqig2EJALY7cZzqnsf4ULuSoJhUydw==", + "license": "MIT", + "dependencies": { + "@inertiajs/core": "2.2.7", + "@types/lodash-es": "^4.17.12", + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@internationalized/date": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.0.tgz", + "integrity": "sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.5.tgz", + "integrity": "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@laravel/vite-plugin-wayfinder": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@laravel/vite-plugin-wayfinder/-/vite-plugin-wayfinder-0.1.7.tgz", + "integrity": "sha512-yZYIr1iwuCQ7LFI+GsJk9vacw1HWMp3ZlDlW0pdfz3zXyKeu4US7oH79KmQQ031L0cYaSyaUMo/Ha1D4BosKqw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", + "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz", + "integrity": "sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz", + "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.0", + "lightningcss": "1.30.1", + "magic-string": "^0.30.19", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.14" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz", + "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.5.1" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-x64": "4.1.14", + "@tailwindcss/oxide-freebsd-x64": "4.1.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-x64-musl": "4.1.14", + "@tailwindcss/oxide-wasm32-wasi": "4.1.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.14" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz", + "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz", + "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz", + "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz", + "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz", + "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz", + "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz", + "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz", + "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz", + "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz", + "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.5", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz", + "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz", + "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.14.tgz", + "integrity": "sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.14", + "@tailwindcss/oxide": "4.1.14", + "tailwindcss": "4.1.14" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.13.12", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz", + "integrity": "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/vue-virtual": { + "version": "3.13.12", + "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.12.tgz", + "integrity": "sha512-vhF7kEU9EXWXh+HdAwKJ2m3xaOnTTmgcdXcF2pim8g4GvI7eRrk2YRuV5nUlZnd/NbCIX4/Ja2OZu5EjJL06Ww==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.13.12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.0.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "22.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.8.tgz", + "integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz", + "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/type-utils": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz", + "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz", + "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.0", + "@typescript-eslint/types": "^8.46.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz", + "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz", + "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz", + "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz", + "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz", + "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.0", + "@typescript-eslint/tsconfig-utils": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz", + "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz", + "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.29" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", + "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/compiler-core": "3.5.22", + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.19", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", + "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "14.6.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.6.0.tgz", + "integrity": "sha512-UpiRY/7go4Yps4mYCjkvlIbVWmn9YvPGQDxTAlcKLphyaD77LjIu3plH4Y9zNT0GB4f3K5tMmhhtRhPOgrQ/bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.35.1", + "fast-glob": "^3.3.3", + "typescript-eslint": "^8.35.1", + "vue-eslint-parser": "^10.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.10.0", + "eslint-plugin-vue": "^9.28.0 || ^10.0.0", + "typescript": ">=4.8.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.22.tgz", + "integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.22.tgz", + "integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz", + "integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.22", + "@vue/runtime-core": "3.5.22", + "@vue/shared": "3.5.22", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.22.tgz", + "integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22" + }, + "peerDependencies": { + "vue": "3.5.22" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", + "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "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, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz", + "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "vue-eslint-parser": "^9.4.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-vue/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-vue/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-vue/node_modules/vue-eslint-parser": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-2.0.1.tgz", + "integrity": "sha512-zQuvzWfUKQu9oNVi1o0RZAJCwhGsdhx4NEOyrVQwJHaWDseGP9tl7XUPLY2T8Cj6+IrZ6lmyxlR1KC8unf3RLA==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^7.0.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "devOptional": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lucide-vue-next": { + "version": "0.468.0", + "resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-0.468.0.tgz", + "integrity": "sha512-quV/6T8YB1XK0VOEnebg3Byd8Rsan5/m95cvjnuHV4vcS3qEnLAybkrSh0hk3ppavx+V7R1PjNW+mGDvcBdz4A==", + "license": "ISC", + "peerDependencies": { + "vue": ">=3.0.1" + } + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-organize-imports": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.3.0.tgz", + "integrity": "sha512-FxFz0qFhyBsGdIsb697f/EkvHzi5SZOhWAjxcx2dLt+Q532bAlhswcXGYB1yzjZ69kW8UoadFBw7TyNwlq96Iw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "prettier": ">=2.0", + "typescript": ">=2.9", + "vue-tsc": "^2.1.0 || 3" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.14.tgz", + "integrity": "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": 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==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/reka-ui": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.5.1.tgz", + "integrity": "sha512-QJGB3q21wQ1Kw28HhhNDpjfFe8qpePX1gK4FTBRd68XTh9aEnhR5bTJnlV0jxi8FBPh0xivZBeNFUc3jiGx7mQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.6.13", + "@floating-ui/vue": "^1.1.6", + "@internationalized/date": "^3.5.0", + "@internationalized/number": "^3.5.0", + "@tanstack/vue-virtual": "^3.12.0", + "@vueuse/core": "^12.5.0", + "@vueuse/shared": "^12.5.0", + "aria-hidden": "^1.2.4", + "defu": "^6.1.4", + "ohash": "^2.0.11" + }, + "peerDependencies": { + "vue": ">= 3.2.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tailwind-merge": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", + "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz", + "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.0.tgz", + "integrity": "sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.46.0", + "@typescript-eslint/parser": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.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, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.6.tgz", + "integrity": "sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", + "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.22.tgz", + "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-sfc": "3.5.22", + "@vue/runtime-dom": "3.5.22", + "@vue/server-renderer": "3.5.22", + "@vue/shared": "3.5.22" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz", + "integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "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, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "license": "MIT", + "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/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d81648f --- /dev/null +++ b/package.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://www.schemastore.org/package.json", + "private": true, + "type": "module", + "scripts": { + "build": "vite build", + "build:ssr": "vite build && vite build --ssr", + "dev": "vite", + "format": "prettier --write resources/", + "format:check": "prettier --check resources/", + "lint": "eslint . --fix" + }, + "devDependencies": { + "@eslint/js": "^9.19.0", + "@laravel/vite-plugin-wayfinder": "^0.1.3", + "@tailwindcss/vite": "^4.1.11", + "@types/node": "^22.13.5", + "@vitejs/plugin-vue": "^6.0.0", + "@vue/eslint-config-typescript": "^14.3.0", + "concurrently": "^9.0.1", + "eslint": "^9.17.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-vue": "^9.32.0", + "prettier": "^3.4.2", + "prettier-plugin-organize-imports": "^4.1.0", + "prettier-plugin-tailwindcss": "^0.6.11", + "typescript": "^5.2.2", + "typescript-eslint": "^8.23.0", + "vite": "^7.0.4", + "vue-tsc": "^2.2.4" + }, + "dependencies": { + "@inertiajs/vue3": "^2.1.0", + "@vueuse/core": "^12.8.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "laravel-vite-plugin": "^2.0.0", + "lucide-vue-next": "^0.468.0", + "reka-ui": "^2.4.1", + "tailwind-merge": "^3.2.0", + "tailwindcss": "^4.1.1", + "tw-animate-css": "^1.2.5", + "vue": "^3.5.13" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.9.5", + "@rollup/rollup-win32-x64-msvc": "4.9.5", + "@tailwindcss/oxide-linux-x64-gnu": "^4.0.1", + "@tailwindcss/oxide-win32-x64-msvc": "^4.0.1", + "lightningcss-linux-x64-gnu": "^1.29.1", + "lightningcss-win32-x64-msvc": "^1.29.1" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..d703241 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,35 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..b574a59 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,25 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Handle X-XSRF-Token Header + RewriteCond %{HTTP:x-xsrf-token} . + RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c2efef6de4482ad4ec770787891fb3ab7f7b1f58 GIT binary patch literal 1662 zcmV-^27&pBP)40{{R3XI2D70000&P)t-s00030 zFd+XeApb8Q|1BW@E+GFcApbBR|1Kc^Eg=6bApb5P|1Kc^EFk|aApa~N|1BW@Eg=6e zApb5P|1BW@Eg&n7Ql0<+02OpnPE!CNzd)dXU=ZKm?|<)rkZ`ZhFmF)fpgb%900q`b zL_t(|+U%Oqj+-zLMaMYBBrGf>;s1ZNY7`jIiI_O8!Rm4!Tgf`>xtSR*$bTdkB!69t zVK_O-TcI8P=u%70x?P5+&ZXoke;#Hk@~pfohJ~`UXs9Q;_B2)gTk?{cvbc)et1K<* zr+Qaj9xAKsDzB#eYQpr7r@Sm0>dVCQfKCB0Kf{y|EP9n~<+TZwVye09V$sm9n9{PSY^C}VzXiE}GC#|%c)PWA z!&5y>`JP4VkDV6b8$Z_jJJu@A$QeFse^IT?qj=G4l>4y#(Kj|Guiq{iFk{=Fwl*76 z)xQ4|>IRkjy#1lI8JM_!yJWG>8ZJNf8dXXx zrk~GbPG4tWE+u0Q(BCgl#w@cPJ5nx)T9MuG26Ggy6OkTfT zvPjI^>P)^G7FA5^`aMfVOxu)|x2A9549ulPjgm!RI{t-}!yN(BSbnfZ0rTAmB^Yxa z0ShsC{k=0v223kLF@%7Hn5rZ4wL=GnpitveraoqSfe(_EIcO5du!CjnDf@wtxv3e z-u^bn6xYI{>k~_4b4*0{)`LMCWEV`GECi(~y~rMz#`428YDY}1JOdWj&DW^?F-Ib; zJl{lRfw{1#A0resWj2_y2v`;oie!a3x9HrIxnXL+G9OMEVvZJ7Q)Y@O(#)P#Gsb*Y zz6+8!=6Lpjd0-xx2j+o!U>=wU<`2TWpY@?U`fOKhgXs$-hQ`^*57T3Y7GFKsXEUm) zBmpLJD?F4LXCptnrod!)-s4>q&NlMH1ep8=0k2DW_S$RM1ei2s8;}?pXCpsMfQj(j zNDOf{^1}p}D=)N>81ii9hY2uO&CkS;XEQ%chDr0UB!)N}`C$S~^BV*vhRd^&A11-1 z`R$K=!+176!AgetySX#KX&8o~XtND<+Gs@?_dhEVl?dUf^KAF4`3KmZ#1o5M$8F`` z3P!Tl&&CLr3Ul6+|GA>4A2dj*!Zf~z9YX~DLkTA3XY8i74zs-cJ)DTceLfYYA-}08 zCfNm;#x)M#D5naO^M{f7;@Z>}U}BCre7ypnoy1IDM_|xHKkNy25-bsNjhURKb+p6ga^RJ>eNU6hI2E^Ow5A+W|JeZDC8Wqj7Y8Fr9@Uvc=cY`i& zDS4WCQI*lV*os&Gro@tzcjHTqy#y%$-R|Mc0;Z=P9R-{!<>DZ*bg~pkU*-o&W#<07*qo IM6N<$f;hnhc>n+a literal 0 HcmV?d00001 diff --git a/public/build/assets/AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js b/public/build/assets/AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js new file mode 100644 index 0000000..2e281a1 --- /dev/null +++ b/public/build/assets/AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js @@ -0,0 +1 @@ +import{P as W,c as F,_ as so,b as io,t as lo,u as uo,a as co}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{c as D,r as P,p as qe,H as ae,R as ne,E as At,e as Ae,d as h,Q as Ie,G as _,u as r,k as b,w as m,B as A,o as v,S as ze,x as mn,U as et,f as O,i as Pe,V as fo,C as G,D as oe,q as po,L as mo,W as vn,a as R,X as vo,Y as go,Z as yo,_ as Me,$ as gn,y as yn,N as ho,z as _o,a0 as bo,a1 as wo,l as pe,t as he,I as tt,a2 as xo,b as V,K as z,F as _e,n as Et,g as kt,m as He,a3 as Co}from"./app-CClrM5Yi.js";import{d as hn,e as Oo,i as Ee,f as jt,g as Fe,h as _n,j as qo,u as bn,b as je,a as $,o as Do,k as So,l as Po,m as Bo,n as wn,r as nt,p as Ao}from"./useForwardExpose-BhawR5VU.js";import{i as Eo,g as te,c as ue,e as ot,a as xn,u as de,V as ko,d as at}from"./VisuallyHidden-Cu70tzB6.js";import{u as We,P as rt,R as Mo,a as $o}from"./RovingFocusGroup-CNFroA6Y.js";import{u as To}from"./useArrowNavigation-C6Y-ieo6.js";import{q as Mt,b as Ro,d as Ut}from"./index-C4J_hXM0.js";import{c as ve}from"./createLucideIcon-ZFd4jktC.js";function Cn(e,t,n){const o=n.originalEvent.target,a=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&o.addEventListener(e,t,{once:!0}),o.dispatchEvent(a)}function gt(e){if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)==="[object Module]":!0}function xt(e,t,n=".",o){if(!gt(t))return xt(e,{},n,o);const a=Object.assign({},t);for(const s in e){if(s==="__proto__"||s==="constructor")continue;const i=e[s];i!=null&&(o&&o(a,s,i,n)||(Array.isArray(i)&&Array.isArray(a[s])?a[s]=[...i,...a[s]]:gt(i)&>(a[s])?a[s]=xt(i,a[s],(n?`${n}.`:"")+s.toString(),o):a[s]=i))}return a}function Fo(e){return(...t)=>t.reduce((n,o)=>xt(n,o,"",e),{})}const Lo=Fo(),Io=hn(()=>{const e=P(new Map),t=P(),n=D(()=>{for(const i of e.value.values())if(i)return!0;return!1}),o=Eo({scrollBody:P(!0)});let a=null;const s=()=>{document.body.style.paddingRight="",document.body.style.marginRight="",document.body.style.pointerEvents="",document.documentElement.style.removeProperty("--scrollbar-width"),document.body.style.overflow=t.value??"",jt&&a?.(),t.value=void 0};return qe(n,(i,l)=>{if(!Ee)return;if(!i){l&&s();return}t.value===void 0&&(t.value=document.body.style.overflow);const d=window.innerWidth-document.documentElement.clientWidth,c={padding:d,margin:0},u=o.scrollBody?.value?typeof o.scrollBody.value=="object"?Lo({padding:o.scrollBody.value.padding===!0?d:o.scrollBody.value.padding,margin:o.scrollBody.value.margin===!0?d:o.scrollBody.value.margin},c):c:{padding:0,margin:0};d>0&&(document.body.style.paddingRight=typeof u.padding=="number"?`${u.padding}px`:String(u.padding),document.body.style.marginRight=typeof u.margin=="number"?`${u.margin}px`:String(u.margin),document.documentElement.style.setProperty("--scrollbar-width",`${d}px`),document.body.style.overflow="hidden"),jt&&(a=Fe(document,"touchmove",f=>No(f),{passive:!1})),ae(()=>{document.body.style.pointerEvents="none",document.body.style.overflow="hidden"})},{immediate:!0,flush:"sync"}),e});function On(e){const t=Math.random().toString(36).substring(2,7),n=Io();n.value.set(t,e??!1);const o=D({get:()=>n.value.get(t)??!1,set:a=>n.value.set(t,a)});return Oo(()=>{n.value.delete(t)}),o}function qn(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.cancelable&&t.preventDefault(),!1)}let yt=0;function zo(){ne(e=>{if(!Ee)return;const t=document.querySelectorAll("[data-reka-focus-guard]");document.body.insertAdjacentElement("afterbegin",t[0]??Gt()),document.body.insertAdjacentElement("beforeend",t[1]??Gt()),yt++,e(()=>{yt===1&&document.querySelectorAll("[data-reka-focus-guard]").forEach(n=>n.remove()),yt--})})}function Gt(){const e=document.createElement("span");return e.setAttribute("data-reka-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}function Ho(e,t){const n=_n(!1,300),o=P(null),a=qo();function s(){o.value=null,n.value=!1}function i(l,d){const c=l.currentTarget,u={x:l.clientX,y:l.clientY},f=Wo(u,c.getBoundingClientRect()),p=Ko(u,f),y=Vo(d.getBoundingClientRect()),g=Uo([...p,...y]);o.value=g,n.value=!0}return ne(l=>{if(e.value&&t.value){const d=u=>i(u,t.value),c=u=>i(u,e.value);e.value.addEventListener("pointerleave",d),t.value.addEventListener("pointerleave",c),l(()=>{e.value?.removeEventListener("pointerleave",d),t.value?.removeEventListener("pointerleave",c)})}}),ne(l=>{if(o.value){const d=c=>{if(!o.value||!(c.target instanceof HTMLElement))return;const u=c.target,f={x:c.clientX,y:c.clientY},p=e.value?.contains(u)||t.value?.contains(u),y=!jo(f,o.value),g=!!u.closest("[data-grace-area-trigger]");p?s():(y||g)&&(s(),a.trigger())};e.value?.ownerDocument.addEventListener("pointermove",d),l(()=>e.value?.ownerDocument.removeEventListener("pointermove",d))}}),{isPointerInTransit:n,onPointerExit:a.on}}function Wo(e,t){const n=Math.abs(t.top-e.y),o=Math.abs(t.bottom-e.y),a=Math.abs(t.right-e.x),s=Math.abs(t.left-e.x);switch(Math.min(n,o,a,s)){case s:return"left";case a:return"right";case n:return"top";case o:return"bottom";default:throw new Error("unreachable")}}function Ko(e,t,n=5){const o=[];switch(t){case"top":o.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":o.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":o.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":o.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return o}function Vo(e){const{top:t,right:n,bottom:o,left:a}=e;return[{x:a,y:t},{x:n,y:t},{x:n,y:o},{x:a,y:o}]}function jo(e,t){const{x:n,y:o}=e;let a=!1;for(let s=0,i=t.length-1;so!=u>o&&n<(c-l)*(o-d)/(u-d)+l&&(a=!a)}return a}function Uo(e){const t=e.slice();return t.sort((n,o)=>n.xo.x?1:n.yo.y?1:0),Go(t)}function Go(e){if(e.length<=1)return e.slice();const t=[];for(let o=0;o=2;){const s=t[t.length-1],i=t[t.length-2];if((s.x-i.x)*(a.y-i.y)>=(s.y-i.y)*(a.x-i.x))t.pop();else break}t.push(a)}t.pop();const n=[];for(let o=e.length-1;o>=0;o--){const a=e[o];for(;n.length>=2;){const s=n[n.length-1],i=n[n.length-2];if((s.x-i.x)*(a.y-i.y)>=(s.y-i.y)*(a.x-i.x))n.pop();else break}n.push(a)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}var Xo=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},$e=new WeakMap,Ge=new WeakMap,Xe={},ht=0,Dn=function(e){return e&&(e.host||Dn(e.parentNode))},Yo=function(e,t){return t.map(function(n){if(e.contains(n))return n;var o=Dn(n);return o&&e.contains(o)?o:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},Qo=function(e,t,n,o){var a=Yo(t,Array.isArray(e)?e:[e]);Xe[n]||(Xe[n]=new WeakMap);var s=Xe[n],i=[],l=new Set,d=new Set(a),c=function(f){!f||l.has(f)||(l.add(f),c(f.parentNode))};a.forEach(c);var u=function(f){!f||d.has(f)||Array.prototype.forEach.call(f.children,function(p){if(l.has(p))u(p);else try{var y=p.getAttribute(o),g=y!==null&&y!=="false",w=($e.get(p)||0)+1,x=(s.get(p)||0)+1;$e.set(p,w),s.set(p,x),i.push(p),w===1&&g&&Ge.set(p,!0),x===1&&p.setAttribute(n,"true"),g||p.setAttribute(o,"true")}catch(q){console.error("aria-hidden: cannot operate on ",p,q)}})};return u(t),l.clear(),ht++,function(){i.forEach(function(f){var p=$e.get(f)-1,y=s.get(f)-1;$e.set(f,p),s.set(f,y),p||(Ge.has(f)||f.removeAttribute(o),Ge.delete(f)),y||f.removeAttribute(n)}),ht--,ht||($e=new WeakMap,$e=new WeakMap,Ge=new WeakMap,Xe={})}},Zo=function(e,t,n){n===void 0&&(n="data-aria-hidden");var o=Array.from(Array.isArray(e)?e:[e]),a=Xo(e);return a?(o.push.apply(o,Array.from(a.querySelectorAll("[aria-live], script"))),Qo(o,a,n,"aria-hidden")):function(){return null}};function Sn(e){let t;qe(()=>bn(e),n=>{n?t=Zo(n):t&&t()}),At(()=>{t&&t()})}function Jo(e){const t=P(),n=D(()=>t.value?.width??0),o=D(()=>t.value?.height??0);return Ae(()=>{const a=bn(e);if(a){t.value={width:a.offsetWidth,height:a.offsetHeight};const s=new ResizeObserver(i=>{if(!Array.isArray(i)||!i.length)return;const l=i[0];let d,c;if("borderBoxSize"in l){const u=l.borderBoxSize,f=Array.isArray(u)?u[0]:u;d=f.inlineSize,c=f.blockSize}else d=a.offsetWidth,c=a.offsetHeight;t.value={width:d,height:c}});return s.observe(a,{box:"border-box"}),()=>s.unobserve(a)}else t.value=void 0}),{width:n,height:o}}function ea(e){const t=_n("",1e3);return{search:t,handleTypeaheadSearch:(a,s)=>{t.value=t.value+a;{const i=te(),l=s.map(p=>({...p,textValue:p.value?.textValue??p.ref.textContent?.trim()??""})),d=l.find(p=>p.ref===i),c=l.map(p=>p.textValue),u=na(c,t.value,d?.textValue),f=l.find(p=>p.textValue===u);return f&&f.ref.focus(),f?.ref}},resetTypeahead:()=>{t.value=""}}}function ta(e,t){return e.map((n,o)=>e[(t+o)%e.length])}function na(e,t,n){const a=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,s=n?e.indexOf(n):-1;let i=ta(e,Math.max(s,0));a.length===1&&(i=i.filter(c=>c!==n));const d=i.find(c=>c.toLowerCase().startsWith(a.toLowerCase()));return d!==n?d:void 0}const[xe,oa]=ue("DialogRoot");var aa=h({inheritAttrs:!1,__name:"DialogRoot",props:{open:{type:Boolean,required:!1,default:void 0},defaultOpen:{type:Boolean,required:!1,default:!1},modal:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(e,{emit:t}){const n=e,a=je(n,"open",t,{defaultValue:n.defaultOpen,passive:n.open===void 0}),s=P(),i=P(),{modal:l}=Ie(n);return oa({open:a,modal:l,openModal:()=>{a.value=!0},onOpenChange:d=>{a.value=d},onOpenToggle:()=>{a.value=!a.value},contentId:"",titleId:"",descriptionId:"",triggerElement:s,contentElement:i}),(d,c)=>_(d.$slots,"default",{open:r(a),close:()=>a.value=!1})}}),ra=aa,sa=h({__name:"DialogClose",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e;$();const n=xe();return(o,a)=>(v(),b(r(W),A(t,{type:o.as==="button"?"button":void 0,onClick:a[0]||(a[0]=s=>r(n).onOpenChange(!1))}),{default:m(()=>[_(o.$slots,"default")]),_:3},16,["type"]))}}),ia=sa;const la="dismissableLayer.pointerDownOutside",ua="dismissableLayer.focusOutside";function Pn(e,t){const n=t.closest("[data-dismissable-layer]"),o=e.dataset.dismissableLayer===""?e:e.querySelector("[data-dismissable-layer]"),a=Array.from(e.ownerDocument.querySelectorAll("[data-dismissable-layer]"));return!!(n&&(o===n||a.indexOf(o){});return ne(i=>{if(!Ee||!ze(n))return;const l=async c=>{const u=c.target;if(!(!t?.value||!u)){if(Pn(t.value,u)){a.value=!1;return}if(c.target&&!a.value){let p=function(){Cn(la,e,f)};const f={originalEvent:c};c.pointerType==="touch"?(o.removeEventListener("click",s.value),s.value=p,o.addEventListener("click",s.value,{once:!0})):p()}else o.removeEventListener("click",s.value);a.value=!1}},d=window.setTimeout(()=>{o.addEventListener("pointerdown",l)},0);i(()=>{window.clearTimeout(d),o.removeEventListener("pointerdown",l),o.removeEventListener("click",s.value)})}),{onPointerDownCapture:()=>{ze(n)&&(a.value=!0)}}}function ca(e,t,n=!0){const o=t?.value?.ownerDocument??globalThis?.document,a=P(!1);return ne(s=>{if(!Ee||!ze(n))return;const i=async l=>{if(!t?.value)return;await ae(),await ae();const d=l.target;!t.value||!d||Pn(t.value,d)||l.target&&!a.value&&Cn(ua,e,{originalEvent:l})};o.addEventListener("focusin",i),s(()=>o.removeEventListener("focusin",i))}),{onFocusCapture:()=>{ze(n)&&(a.value=!0)},onBlurCapture:()=>{ze(n)&&(a.value=!1)}}}const ye=mn({layersRoot:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set});var fa=h({__name:"DismissableLayer",props:{disableOutsidePointerEvents:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","dismiss"],setup(e,{emit:t}){const n=e,o=t,{forwardRef:a,currentElement:s}=$(),i=D(()=>s.value?.ownerDocument??globalThis.document),l=D(()=>ye.layersRoot),d=D(()=>s.value?Array.from(l.value).indexOf(s.value):-1),c=D(()=>ye.layersWithOutsidePointerEventsDisabled.size>0),u=D(()=>{const g=Array.from(l.value),[w]=[...ye.layersWithOutsidePointerEventsDisabled].slice(-1),x=g.indexOf(w);return d.value>=x}),f=da(async g=>{const w=[...ye.branches].some(x=>x?.contains(g.target));!u.value||w||(o("pointerDownOutside",g),o("interactOutside",g),await ae(),g.defaultPrevented||o("dismiss"))},s),p=ca(g=>{[...ye.branches].some(x=>x?.contains(g.target))||(o("focusOutside",g),o("interactOutside",g),g.defaultPrevented||o("dismiss"))},s);Do("Escape",g=>{d.value===l.value.size-1&&(o("escapeKeyDown",g),g.defaultPrevented||o("dismiss"))});let y;return ne(g=>{s.value&&(n.disableOutsidePointerEvents&&(ye.layersWithOutsidePointerEventsDisabled.size===0&&(y=i.value.body.style.pointerEvents,i.value.body.style.pointerEvents="none"),ye.layersWithOutsidePointerEventsDisabled.add(s.value)),l.value.add(s.value),g(()=>{n.disableOutsidePointerEvents&&ye.layersWithOutsidePointerEventsDisabled.size===1&&(i.value.body.style.pointerEvents=y)}))}),ne(g=>{g(()=>{s.value&&(l.value.delete(s.value),ye.layersWithOutsidePointerEventsDisabled.delete(s.value))})}),(g,w)=>(v(),b(r(W),{ref:r(a),"as-child":g.asChild,as:g.as,"data-dismissable-layer":"",style:et({pointerEvents:c.value?u.value?"auto":"none":void 0}),onFocusCapture:r(p).onFocusCapture,onBlurCapture:r(p).onBlurCapture,onPointerdownCapture:r(f).onPointerDownCapture},{default:m(()=>[_(g.$slots,"default")]),_:3},8,["as-child","as","style","onFocusCapture","onBlurCapture","onPointerdownCapture"]))}}),$t=fa;const pa=So(()=>P([]));function ma(){const e=pa();return{add(t){const n=e.value[0];t!==n&&n?.pause(),e.value=Xt(e.value,t),e.value.unshift(t)},remove(t){e.value=Xt(e.value,t),e.value[0]?.resume()}}}function Xt(e,t){const n=[...e],o=n.indexOf(t);return o!==-1&&n.splice(o,1),n}function va(e){return e.filter(t=>t.tagName!=="A")}const _t="focusScope.autoFocusOnMount",bt="focusScope.autoFocusOnUnmount",Yt={bubbles:!1,cancelable:!0};function ga(e,{select:t=!1}={}){const n=te();for(const o of e)if(Oe(o,{select:t}),te()!==n)return!0}function ya(e){const t=Bn(e),n=Qt(t,e),o=Qt(t.reverse(),e);return[n,o]}function Bn(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:o=>{const a=o.tagName==="INPUT"&&o.type==="hidden";return o.disabled||o.hidden||a?NodeFilter.FILTER_SKIP:o.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function Qt(e,t){for(const n of e)if(!ha(n,{upTo:t}))return n}function ha(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function _a(e){return e instanceof HTMLInputElement&&"select"in e}function Oe(e,{select:t=!1}={}){if(e&&e.focus){const n=te();e.focus({preventScroll:!0}),e!==n&&_a(e)&&t&&e.select()}}var ba=h({__name:"FocusScope",props:{loop:{type:Boolean,required:!1,default:!1},trapped:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["mountAutoFocus","unmountAutoFocus"],setup(e,{emit:t}){const n=e,o=t,{currentRef:a,currentElement:s}=$(),i=P(null),l=ma(),d=mn({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}});ne(u=>{if(!Ee)return;const f=s.value;if(!n.trapped)return;function p(x){if(d.paused||!f)return;const q=x.target;f.contains(q)?i.value=q:Oe(i.value,{select:!0})}function y(x){if(d.paused||!f)return;const q=x.relatedTarget;q!==null&&(f.contains(q)||Oe(i.value,{select:!0}))}function g(x){f.contains(i.value)||Oe(f)}document.addEventListener("focusin",p),document.addEventListener("focusout",y);const w=new MutationObserver(g);f&&w.observe(f,{childList:!0,subtree:!0}),u(()=>{document.removeEventListener("focusin",p),document.removeEventListener("focusout",y),w.disconnect()})}),ne(async u=>{const f=s.value;if(await ae(),!f)return;l.add(d);const p=te();if(!f.contains(p)){const g=new CustomEvent(_t,Yt);f.addEventListener(_t,w=>o("mountAutoFocus",w)),f.dispatchEvent(g),g.defaultPrevented||(ga(va(Bn(f)),{select:!0}),te()===p&&Oe(f))}u(()=>{f.removeEventListener(_t,x=>o("mountAutoFocus",x));const g=new CustomEvent(bt,Yt),w=x=>{o("unmountAutoFocus",x)};f.addEventListener(bt,w),f.dispatchEvent(g),setTimeout(()=>{g.defaultPrevented||Oe(p??document.body,{select:!0}),f.removeEventListener(bt,w),l.remove(d)},0)})});function c(u){if(!n.loop&&!n.trapped||d.paused)return;const f=u.key==="Tab"&&!u.altKey&&!u.ctrlKey&&!u.metaKey,p=te();if(f&&p){const y=u.currentTarget,[g,w]=ya(y);g&&w?!u.shiftKey&&p===w?(u.preventDefault(),n.loop&&Oe(g,{select:!0})):u.shiftKey&&p===g&&(u.preventDefault(),n.loop&&Oe(w,{select:!0})):p===y&&u.preventDefault()}}return(u,f)=>(v(),b(r(W),{ref_key:"currentRef",ref:a,tabindex:"-1","as-child":u.asChild,as:u.as,onKeydown:c},{default:m(()=>[_(u.$slots,"default")]),_:3},8,["as-child","as"]))}}),An=ba;const wa="menu.itemSelect",Ct=["Enter"," "],xa=["ArrowDown","PageUp","Home"],En=["ArrowUp","PageDown","End"],Ca=[...xa,...En];[...Ct],[...Ct];function kn(e){return e?"open":"closed"}function Oa(e){const t=te();for(const n of e)if(n===t||(n.focus(),te()!==t))return}function qa(e,t){const{x:n,y:o}=e;let a=!1;for(let s=0,i=t.length-1;so!=u>o&&n<(c-l)*(o-d)/(u-d)+l&&(a=!a)}return a}function Da(e,t){if(!t)return!1;const n={x:e.clientX,y:e.clientY};return qa(n,t)}function Ot(e){return e.pointerType==="mouse"}var Sa=h({__name:"DialogContentImpl",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,a=xe(),{forwardRef:s,currentElement:i}=$();return a.titleId||=We(void 0,"reka-dialog-title"),a.descriptionId||=We(void 0,"reka-dialog-description"),Ae(()=>{a.contentElement=i,te()!==document.body&&(a.triggerElement.value=te())}),(l,d)=>(v(),b(r(An),{"as-child":"",loop:"",trapped:n.trapFocus,onMountAutoFocus:d[5]||(d[5]=c=>o("openAutoFocus",c)),onUnmountAutoFocus:d[6]||(d[6]=c=>o("closeAutoFocus",c))},{default:m(()=>[O(r($t),A({id:r(a).contentId,ref:r(s),as:l.as,"as-child":l.asChild,"disable-outside-pointer-events":l.disableOutsidePointerEvents,role:"dialog","aria-describedby":r(a).descriptionId,"aria-labelledby":r(a).titleId,"data-state":r(kn)(r(a).open.value)},l.$attrs,{onDismiss:d[0]||(d[0]=c=>r(a).onOpenChange(!1)),onEscapeKeyDown:d[1]||(d[1]=c=>o("escapeKeyDown",c)),onFocusOutside:d[2]||(d[2]=c=>o("focusOutside",c)),onInteractOutside:d[3]||(d[3]=c=>o("interactOutside",c)),onPointerDownOutside:d[4]||(d[4]=c=>o("pointerDownOutside",c))}),{default:m(()=>[_(l.$slots,"default")]),_:3},16,["id","as","as-child","disable-outside-pointer-events","aria-describedby","aria-labelledby","data-state"])]),_:3},8,["trapped"]))}}),Mn=Sa,Pa=h({__name:"DialogContentModal",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,a=xe(),s=ot(o),{forwardRef:i,currentElement:l}=$();return Sn(l),(d,c)=>(v(),b(Mn,A({...n,...r(s)},{ref:r(i),"trap-focus":r(a).open.value,"disable-outside-pointer-events":!0,onCloseAutoFocus:c[0]||(c[0]=u=>{u.defaultPrevented||(u.preventDefault(),r(a).triggerElement.value?.focus())}),onPointerDownOutside:c[1]||(c[1]=u=>{const f=u.detail.originalEvent,p=f.button===0&&f.ctrlKey===!0;(f.button===2||p)&&u.preventDefault()}),onFocusOutside:c[2]||(c[2]=u=>{u.preventDefault()})}),{default:m(()=>[_(d.$slots,"default")]),_:3},16,["trap-focus"]))}}),Ba=Pa,Aa=h({__name:"DialogContentNonModal",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,a=ot(t);$();const s=xe(),i=P(!1),l=P(!1);return(d,c)=>(v(),b(Mn,A({...n,...r(a)},{"trap-focus":!1,"disable-outside-pointer-events":!1,onCloseAutoFocus:c[0]||(c[0]=u=>{u.defaultPrevented||(i.value||r(s).triggerElement.value?.focus(),u.preventDefault()),i.value=!1,l.value=!1}),onInteractOutside:c[1]||(c[1]=u=>{u.defaultPrevented||(i.value=!0,u.detail.originalEvent.type==="pointerdown"&&(l.value=!0));const f=u.target;r(s).triggerElement.value?.contains(f)&&u.preventDefault(),u.detail.originalEvent.type==="focusin"&&l.value&&u.preventDefault()})}),{default:m(()=>[_(d.$slots,"default")]),_:3},16))}}),Ea=Aa,ka=h({__name:"DialogContent",props:{forceMount:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,a=xe(),s=ot(o),{forwardRef:i}=$();return(l,d)=>(v(),b(r(rt),{present:l.forceMount||r(a).open.value},{default:m(()=>[r(a).modal.value?(v(),b(Ba,A({key:0,ref:r(i)},{...n,...r(s),...l.$attrs}),{default:m(()=>[_(l.$slots,"default")]),_:3},16)):(v(),b(Ea,A({key:1,ref:r(i)},{...n,...r(s),...l.$attrs}),{default:m(()=>[_(l.$slots,"default")]),_:3},16))]),_:3},8,["present"]))}}),Ma=ka,$a=h({__name:"DialogDescription",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"p"}},setup(e){const t=e;$();const n=xe();return(o,a)=>(v(),b(r(W),A(t,{id:r(n).descriptionId}),{default:m(()=>[_(o.$slots,"default")]),_:3},16,["id"]))}}),Ta=$a,Ra=h({__name:"DialogOverlayImpl",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=xe();return On(!0),$(),(n,o)=>(v(),b(r(W),{as:n.as,"as-child":n.asChild,"data-state":r(t).open.value?"open":"closed",style:{"pointer-events":"auto"}},{default:m(()=>[_(n.$slots,"default")]),_:3},8,["as","as-child","data-state"]))}}),Fa=Ra,La=h({__name:"DialogOverlay",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=xe(),{forwardRef:n}=$();return(o,a)=>r(t)?.modal.value?(v(),b(r(rt),{key:0,present:o.forceMount||r(t).open.value},{default:m(()=>[O(Fa,A(o.$attrs,{ref:r(n),as:o.as,"as-child":o.asChild}),{default:m(()=>[_(o.$slots,"default")]),_:3},16,["as","as-child"])]),_:3},8,["present"])):Pe("v-if",!0)}}),Ia=La,Na=h({__name:"Teleport",props:{to:{type:null,required:!1,default:"body"},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=Po();return(n,o)=>r(t)||n.forceMount?(v(),b(fo,{key:0,to:n.to,disabled:n.disabled,defer:n.defer},[_(n.$slots,"default")],8,["to","disabled","defer"])):Pe("v-if",!0)}}),Tt=Na,za=h({__name:"DialogPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(v(),b(r(Tt),G(oe(t)),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),Ha=za,Wa=h({__name:"DialogTitle",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"h2"}},setup(e){const t=e,n=xe();return $(),(o,a)=>(v(),b(r(W),A(t,{id:r(n).titleId}),{default:m(()=>[_(o.$slots,"default")]),_:3},16,["id"]))}}),Ka=Wa;const[$n,Va]=ue("AvatarRoot");var ja=h({__name:"AvatarRoot",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){return $(),Va({imageLoadingStatus:P("idle")}),(t,n)=>(v(),b(r(W),{"as-child":t.asChild,as:t.as},{default:m(()=>[_(t.$slots,"default")]),_:3},8,["as-child","as"]))}}),Ua=ja,Ga=h({__name:"AvatarFallback",props:{delayMs:{type:Number,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){const t=e,n=$n();$();const o=P(t.delayMs===void 0);return ne(a=>{if(t.delayMs&&Ee){const s=window.setTimeout(()=>{o.value=!0},t.delayMs);a(()=>{window.clearTimeout(s)})}}),(a,s)=>o.value&&r(n).imageLoadingStatus.value!=="loaded"?(v(),b(r(W),{key:0,"as-child":a.asChild,as:a.as},{default:m(()=>[_(a.$slots,"default")]),_:3},8,["as-child","as"])):Pe("v-if",!0)}}),Xa=Ga;function Zt(e,t){return e?t?(e.src!==t&&(e.src=t),e.complete&&e.naturalWidth>0?"loaded":"loading"):"error":"idle"}function Ya(e,{referrerPolicy:t,crossOrigin:n}={}){const o=P(!1),a=P(null),s=D(()=>o.value?(!a.value&&Ee&&(a.value=new window.Image),a.value):null),i=P(Zt(s.value,e.value)),l=d=>()=>{o.value&&(i.value=d)};return Ae(()=>{o.value=!0,ne(d=>{const c=s.value;if(!c)return;i.value=Zt(c,e.value);const u=l("loaded"),f=l("error");c.addEventListener("load",u),c.addEventListener("error",f),t?.value&&(c.referrerPolicy=t.value),typeof n?.value=="string"&&(c.crossOrigin=n.value),d(()=>{c.removeEventListener("load",u),c.removeEventListener("error",f)})})}),At(()=>{o.value=!1}),i}var Qa=h({__name:"AvatarImage",props:{src:{type:String,required:!0},referrerPolicy:{type:null,required:!1},crossOrigin:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"img"}},emits:["loadingStatusChange"],setup(e,{emit:t}){const n=e,o=t,{src:a,referrerPolicy:s,crossOrigin:i}=Ie(n);$();const l=$n(),d=Ya(a,{referrerPolicy:s,crossOrigin:i});return qe(d,c=>{o("loadingStatusChange",c),c!=="idle"&&(l.imageLoadingStatus.value=c)},{immediate:!0}),(c,u)=>po((v(),b(r(W),{role:"img","as-child":c.asChild,as:c.as,src:r(a),"referrer-policy":r(s)},{default:m(()=>[_(c.$slots,"default")]),_:3},8,["as-child","as","src","referrer-policy"])),[[mo,r(d)==="loaded"]])}}),Za=Qa;const[Tn,Ja]=ue("PopperRoot");var er=h({inheritAttrs:!1,__name:"PopperRoot",setup(e){const t=P();return Ja({anchor:t,onAnchorChange:n=>t.value=n}),(n,o)=>_(n.$slots,"default")}}),Rn=er,tr=h({__name:"PopperAnchor",props:{reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,{forwardRef:n,currentElement:o}=$(),a=Tn();return vn(()=>{a.onAnchorChange(t.reference??o.value)}),(s,i)=>(v(),b(r(W),{ref:r(n),as:s.as,"as-child":s.asChild},{default:m(()=>[_(s.$slots,"default")]),_:3},8,["as","as-child"]))}}),Fn=tr;const nr={key:0,d:"M0 0L6 6L12 0"},or={key:1,d:"M0 0L4.58579 4.58579C5.36683 5.36683 6.63316 5.36684 7.41421 4.58579L12 0"};var ar=h({__name:"Arrow",props:{width:{type:Number,required:!1,default:10},height:{type:Number,required:!1,default:5},rounded:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"svg"}},setup(e){const t=e;return $(),(n,o)=>(v(),b(r(W),A(t,{width:n.width,height:n.height,viewBox:n.asChild?void 0:"0 0 12 6",preserveAspectRatio:n.asChild?void 0:"none"}),{default:m(()=>[_(n.$slots,"default",{},()=>[n.rounded?(v(),R("path",or)):(v(),R("path",nr))])]),_:3},16,["width","height","viewBox","preserveAspectRatio"]))}}),rr=ar;function sr(e){return e!==null}function ir(e){return{name:"transformOrigin",options:e,fn(t){const{placement:n,rects:o,middlewareData:a}=t,i=a.arrow?.centerOffset!==0,l=i?0:e.arrowWidth,d=i?0:e.arrowHeight,[c,u]=qt(n),f={start:"0%",center:"50%",end:"100%"}[u],p=(a.arrow?.x??0)+l/2,y=(a.arrow?.y??0)+d/2;let g="",w="";return c==="bottom"?(g=i?f:`${p}px`,w=`${-d}px`):c==="top"?(g=i?f:`${p}px`,w=`${o.floating.height+d}px`):c==="right"?(g=`${-d}px`,w=i?f:`${y}px`):c==="left"&&(g=`${o.floating.width+d}px`,w=i?f:`${y}px`),{data:{x:g,y:w}}}}}function qt(e){const[t,n="center"]=e.split("-");return[t,n]}const lr=["top","right","bottom","left"],De=Math.min,Z=Math.max,Qe=Math.round,Ye=Math.floor,fe=e=>({x:e,y:e}),ur={left:"right",right:"left",bottom:"top",top:"bottom"},dr={start:"end",end:"start"};function Dt(e,t,n){return Z(e,De(t,n))}function be(e,t){return typeof e=="function"?e(t):e}function we(e){return e.split("-")[0]}function Ne(e){return e.split("-")[1]}function Rt(e){return e==="x"?"y":"x"}function Ft(e){return e==="y"?"height":"width"}const cr=new Set(["top","bottom"]);function ce(e){return cr.has(we(e))?"y":"x"}function Lt(e){return Rt(ce(e))}function fr(e,t,n){n===void 0&&(n=!1);const o=Ne(e),a=Lt(e),s=Ft(a);let i=a==="x"?o===(n?"end":"start")?"right":"left":o==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(i=Ze(i)),[i,Ze(i)]}function pr(e){const t=Ze(e);return[St(e),t,St(t)]}function St(e){return e.replace(/start|end/g,t=>dr[t])}const Jt=["left","right"],en=["right","left"],mr=["top","bottom"],vr=["bottom","top"];function gr(e,t,n){switch(e){case"top":case"bottom":return n?t?en:Jt:t?Jt:en;case"left":case"right":return t?mr:vr;default:return[]}}function yr(e,t,n,o){const a=Ne(e);let s=gr(we(e),n==="start",o);return a&&(s=s.map(i=>i+"-"+a),t&&(s=s.concat(s.map(St)))),s}function Ze(e){return e.replace(/left|right|bottom|top/g,t=>ur[t])}function hr(e){return{top:0,right:0,bottom:0,left:0,...e}}function Ln(e){return typeof e!="number"?hr(e):{top:e,right:e,bottom:e,left:e}}function Je(e){const{x:t,y:n,width:o,height:a}=e;return{width:o,height:a,top:n,left:t,right:t+o,bottom:n+a,x:t,y:n}}function tn(e,t,n){let{reference:o,floating:a}=e;const s=ce(t),i=Lt(t),l=Ft(i),d=we(t),c=s==="y",u=o.x+o.width/2-a.width/2,f=o.y+o.height/2-a.height/2,p=o[l]/2-a[l]/2;let y;switch(d){case"top":y={x:u,y:o.y-a.height};break;case"bottom":y={x:u,y:o.y+o.height};break;case"right":y={x:o.x+o.width,y:f};break;case"left":y={x:o.x-a.width,y:f};break;default:y={x:o.x,y:o.y}}switch(Ne(t)){case"start":y[i]-=p*(n&&c?-1:1);break;case"end":y[i]+=p*(n&&c?-1:1);break}return y}const _r=async(e,t,n)=>{const{placement:o="bottom",strategy:a="absolute",middleware:s=[],platform:i}=n,l=s.filter(Boolean),d=await(i.isRTL==null?void 0:i.isRTL(t));let c=await i.getElementRects({reference:e,floating:t,strategy:a}),{x:u,y:f}=tn(c,o,d),p=o,y={},g=0;for(let w=0;w({name:"arrow",options:e,async fn(t){const{x:n,y:o,placement:a,rects:s,platform:i,elements:l,middlewareData:d}=t,{element:c,padding:u=0}=be(e,t)||{};if(c==null)return{};const f=Ln(u),p={x:n,y:o},y=Lt(a),g=Ft(y),w=await i.getDimensions(c),x=y==="y",q=x?"top":"left",S=x?"bottom":"right",B=x?"clientHeight":"clientWidth",k=s.reference[g]+s.reference[y]-p[y]-s.floating[g],E=p[y]-s.reference[y],H=await(i.getOffsetParent==null?void 0:i.getOffsetParent(c));let M=H?H[B]:0;(!M||!await(i.isElement==null?void 0:i.isElement(H)))&&(M=l.floating[B]||s.floating[g]);const N=k/2-E/2,C=M/2-w[g]/2-1,T=De(f[q],C),L=De(f[S],C),I=T,Y=M-w[g]-L,K=M/2-w[g]/2+N,ee=Dt(I,K,Y),Q=!d.arrow&&Ne(a)!=null&&K!==ee&&s.reference[g]/2-(KK<=0)){var L,I;const K=(((L=s.flip)==null?void 0:L.index)||0)+1,ee=M[K];if(ee&&(!(f==="alignment"?S!==ce(ee):!1)||T.every(j=>ce(j.placement)===S?j.overflows[0]>0:!0)))return{data:{index:K,overflows:T},reset:{placement:ee}};let Q=(I=T.filter(U=>U.overflows[0]<=0).sort((U,j)=>U.overflows[1]-j.overflows[1])[0])==null?void 0:I.placement;if(!Q)switch(y){case"bestFit":{var Y;const U=(Y=T.filter(j=>{if(H){const Ce=ce(j.placement);return Ce===S||Ce==="y"}return!0}).map(j=>[j.placement,j.overflows.filter(Ce=>Ce>0).reduce((Ce,ro)=>Ce+ro,0)]).sort((j,Ce)=>j[1]-Ce[1])[0])==null?void 0:Y[0];U&&(Q=U);break}case"initialPlacement":Q=l;break}if(a!==Q)return{reset:{placement:Q}}}return{}}}};function nn(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function on(e){return lr.some(t=>e[t]>=0)}const xr=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n}=t,{strategy:o="referenceHidden",...a}=be(e,t);switch(o){case"referenceHidden":{const s=await Ke(t,{...a,elementContext:"reference"}),i=nn(s,n.reference);return{data:{referenceHiddenOffsets:i,referenceHidden:on(i)}}}case"escaped":{const s=await Ke(t,{...a,altBoundary:!0}),i=nn(s,n.floating);return{data:{escapedOffsets:i,escaped:on(i)}}}default:return{}}}}},In=new Set(["left","top"]);async function Cr(e,t){const{placement:n,platform:o,elements:a}=e,s=await(o.isRTL==null?void 0:o.isRTL(a.floating)),i=we(n),l=Ne(n),d=ce(n)==="y",c=In.has(i)?-1:1,u=s&&d?-1:1,f=be(t,e);let{mainAxis:p,crossAxis:y,alignmentAxis:g}=typeof f=="number"?{mainAxis:f,crossAxis:0,alignmentAxis:null}:{mainAxis:f.mainAxis||0,crossAxis:f.crossAxis||0,alignmentAxis:f.alignmentAxis};return l&&typeof g=="number"&&(y=l==="end"?g*-1:g),d?{x:y*u,y:p*c}:{x:p*c,y:y*u}}const Or=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var n,o;const{x:a,y:s,placement:i,middlewareData:l}=t,d=await Cr(t,e);return i===((n=l.offset)==null?void 0:n.placement)&&(o=l.arrow)!=null&&o.alignmentOffset?{}:{x:a+d.x,y:s+d.y,data:{...d,placement:i}}}}},qr=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:o,placement:a}=t,{mainAxis:s=!0,crossAxis:i=!1,limiter:l={fn:x=>{let{x:q,y:S}=x;return{x:q,y:S}}},...d}=be(e,t),c={x:n,y:o},u=await Ke(t,d),f=ce(we(a)),p=Rt(f);let y=c[p],g=c[f];if(s){const x=p==="y"?"top":"left",q=p==="y"?"bottom":"right",S=y+u[x],B=y-u[q];y=Dt(S,y,B)}if(i){const x=f==="y"?"top":"left",q=f==="y"?"bottom":"right",S=g+u[x],B=g-u[q];g=Dt(S,g,B)}const w=l.fn({...t,[p]:y,[f]:g});return{...w,data:{x:w.x-n,y:w.y-o,enabled:{[p]:s,[f]:i}}}}}},Dr=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:o,placement:a,rects:s,middlewareData:i}=t,{offset:l=0,mainAxis:d=!0,crossAxis:c=!0}=be(e,t),u={x:n,y:o},f=ce(a),p=Rt(f);let y=u[p],g=u[f];const w=be(l,t),x=typeof w=="number"?{mainAxis:w,crossAxis:0}:{mainAxis:0,crossAxis:0,...w};if(d){const B=p==="y"?"height":"width",k=s.reference[p]-s.floating[B]+x.mainAxis,E=s.reference[p]+s.reference[B]-x.mainAxis;yE&&(y=E)}if(c){var q,S;const B=p==="y"?"width":"height",k=In.has(we(a)),E=s.reference[f]-s.floating[B]+(k&&((q=i.offset)==null?void 0:q[f])||0)+(k?0:x.crossAxis),H=s.reference[f]+s.reference[B]+(k?0:((S=i.offset)==null?void 0:S[f])||0)-(k?x.crossAxis:0);gH&&(g=H)}return{[p]:y,[f]:g}}}},Sr=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){var n,o;const{placement:a,rects:s,platform:i,elements:l}=t,{apply:d=()=>{},...c}=be(e,t),u=await Ke(t,c),f=we(a),p=Ne(a),y=ce(a)==="y",{width:g,height:w}=s.floating;let x,q;f==="top"||f==="bottom"?(x=f,q=p===(await(i.isRTL==null?void 0:i.isRTL(l.floating))?"start":"end")?"left":"right"):(q=f,x=p==="end"?"top":"bottom");const S=w-u.top-u.bottom,B=g-u.left-u.right,k=De(w-u[x],S),E=De(g-u[q],B),H=!t.middlewareData.shift;let M=k,N=E;if((n=t.middlewareData.shift)!=null&&n.enabled.x&&(N=B),(o=t.middlewareData.shift)!=null&&o.enabled.y&&(M=S),H&&!p){const T=Z(u.left,0),L=Z(u.right,0),I=Z(u.top,0),Y=Z(u.bottom,0);y?N=g-2*(T!==0||L!==0?T+L:Z(u.left,u.right)):M=w-2*(I!==0||Y!==0?I+Y:Z(u.top,u.bottom))}await d({...t,availableWidth:N,availableHeight:M});const C=await i.getDimensions(l.floating);return g!==C.width||w!==C.height?{reset:{rects:!0}}:{}}}};function st(){return typeof window<"u"}function ke(e){return It(e)?(e.nodeName||"").toLowerCase():"#document"}function J(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function ge(e){var t;return(t=(It(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function It(e){return st()?e instanceof Node||e instanceof J(e).Node:!1}function re(e){return st()?e instanceof Element||e instanceof J(e).Element:!1}function me(e){return st()?e instanceof HTMLElement||e instanceof J(e).HTMLElement:!1}function an(e){return!st()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof J(e).ShadowRoot}const Pr=new Set(["inline","contents"]);function Ue(e){const{overflow:t,overflowX:n,overflowY:o,display:a}=se(e);return/auto|scroll|overlay|hidden|clip/.test(t+o+n)&&!Pr.has(a)}const Br=new Set(["table","td","th"]);function Ar(e){return Br.has(ke(e))}const Er=[":popover-open",":modal"];function it(e){return Er.some(t=>{try{return e.matches(t)}catch{return!1}})}const kr=["transform","translate","scale","rotate","perspective"],Mr=["transform","translate","scale","rotate","perspective","filter"],$r=["paint","layout","strict","content"];function Nt(e){const t=zt(),n=re(e)?se(e):e;return kr.some(o=>n[o]?n[o]!=="none":!1)||(n.containerType?n.containerType!=="normal":!1)||!t&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!t&&(n.filter?n.filter!=="none":!1)||Mr.some(o=>(n.willChange||"").includes(o))||$r.some(o=>(n.contain||"").includes(o))}function Tr(e){let t=Se(e);for(;me(t)&&!Le(t);){if(Nt(t))return t;if(it(t))return null;t=Se(t)}return null}function zt(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}const Rr=new Set(["html","body","#document"]);function Le(e){return Rr.has(ke(e))}function se(e){return J(e).getComputedStyle(e)}function lt(e){return re(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Se(e){if(ke(e)==="html")return e;const t=e.assignedSlot||e.parentNode||an(e)&&e.host||ge(e);return an(t)?t.host:t}function Nn(e){const t=Se(e);return Le(t)?e.ownerDocument?e.ownerDocument.body:e.body:me(t)&&Ue(t)?t:Nn(t)}function Ve(e,t,n){var o;t===void 0&&(t=[]),n===void 0&&(n=!0);const a=Nn(e),s=a===((o=e.ownerDocument)==null?void 0:o.body),i=J(a);if(s){const l=Pt(i);return t.concat(i,i.visualViewport||[],Ue(a)?a:[],l&&n?Ve(l):[])}return t.concat(a,Ve(a,[],n))}function Pt(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function zn(e){const t=se(e);let n=parseFloat(t.width)||0,o=parseFloat(t.height)||0;const a=me(e),s=a?e.offsetWidth:n,i=a?e.offsetHeight:o,l=Qe(n)!==s||Qe(o)!==i;return l&&(n=s,o=i),{width:n,height:o,$:l}}function Ht(e){return re(e)?e:e.contextElement}function Re(e){const t=Ht(e);if(!me(t))return fe(1);const n=t.getBoundingClientRect(),{width:o,height:a,$:s}=zn(t);let i=(s?Qe(n.width):n.width)/o,l=(s?Qe(n.height):n.height)/a;return(!i||!Number.isFinite(i))&&(i=1),(!l||!Number.isFinite(l))&&(l=1),{x:i,y:l}}const Fr=fe(0);function Hn(e){const t=J(e);return!zt()||!t.visualViewport?Fr:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Lr(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==J(e)?!1:t}function Be(e,t,n,o){t===void 0&&(t=!1),n===void 0&&(n=!1);const a=e.getBoundingClientRect(),s=Ht(e);let i=fe(1);t&&(o?re(o)&&(i=Re(o)):i=Re(e));const l=Lr(s,n,o)?Hn(s):fe(0);let d=(a.left+l.x)/i.x,c=(a.top+l.y)/i.y,u=a.width/i.x,f=a.height/i.y;if(s){const p=J(s),y=o&&re(o)?J(o):o;let g=p,w=Pt(g);for(;w&&o&&y!==g;){const x=Re(w),q=w.getBoundingClientRect(),S=se(w),B=q.left+(w.clientLeft+parseFloat(S.paddingLeft))*x.x,k=q.top+(w.clientTop+parseFloat(S.paddingTop))*x.y;d*=x.x,c*=x.y,u*=x.x,f*=x.y,d+=B,c+=k,g=J(w),w=Pt(g)}}return Je({width:u,height:f,x:d,y:c})}function ut(e,t){const n=lt(e).scrollLeft;return t?t.left+n:Be(ge(e)).left+n}function Wn(e,t){const n=e.getBoundingClientRect(),o=n.left+t.scrollLeft-ut(e,n),a=n.top+t.scrollTop;return{x:o,y:a}}function Ir(e){let{elements:t,rect:n,offsetParent:o,strategy:a}=e;const s=a==="fixed",i=ge(o),l=t?it(t.floating):!1;if(o===i||l&&s)return n;let d={scrollLeft:0,scrollTop:0},c=fe(1);const u=fe(0),f=me(o);if((f||!f&&!s)&&((ke(o)!=="body"||Ue(i))&&(d=lt(o)),me(o))){const y=Be(o);c=Re(o),u.x=y.x+o.clientLeft,u.y=y.y+o.clientTop}const p=i&&!f&&!s?Wn(i,d):fe(0);return{width:n.width*c.x,height:n.height*c.y,x:n.x*c.x-d.scrollLeft*c.x+u.x+p.x,y:n.y*c.y-d.scrollTop*c.y+u.y+p.y}}function Nr(e){return Array.from(e.getClientRects())}function zr(e){const t=ge(e),n=lt(e),o=e.ownerDocument.body,a=Z(t.scrollWidth,t.clientWidth,o.scrollWidth,o.clientWidth),s=Z(t.scrollHeight,t.clientHeight,o.scrollHeight,o.clientHeight);let i=-n.scrollLeft+ut(e);const l=-n.scrollTop;return se(o).direction==="rtl"&&(i+=Z(t.clientWidth,o.clientWidth)-a),{width:a,height:s,x:i,y:l}}const rn=25;function Hr(e,t){const n=J(e),o=ge(e),a=n.visualViewport;let s=o.clientWidth,i=o.clientHeight,l=0,d=0;if(a){s=a.width,i=a.height;const u=zt();(!u||u&&t==="fixed")&&(l=a.offsetLeft,d=a.offsetTop)}const c=ut(o);if(c<=0){const u=o.ownerDocument,f=u.body,p=getComputedStyle(f),y=u.compatMode==="CSS1Compat"&&parseFloat(p.marginLeft)+parseFloat(p.marginRight)||0,g=Math.abs(o.clientWidth-f.clientWidth-y);g<=rn&&(s-=g)}else c<=rn&&(s+=c);return{width:s,height:i,x:l,y:d}}const Wr=new Set(["absolute","fixed"]);function Kr(e,t){const n=Be(e,!0,t==="fixed"),o=n.top+e.clientTop,a=n.left+e.clientLeft,s=me(e)?Re(e):fe(1),i=e.clientWidth*s.x,l=e.clientHeight*s.y,d=a*s.x,c=o*s.y;return{width:i,height:l,x:d,y:c}}function sn(e,t,n){let o;if(t==="viewport")o=Hr(e,n);else if(t==="document")o=zr(ge(e));else if(re(t))o=Kr(t,n);else{const a=Hn(e);o={x:t.x-a.x,y:t.y-a.y,width:t.width,height:t.height}}return Je(o)}function Kn(e,t){const n=Se(e);return n===t||!re(n)||Le(n)?!1:se(n).position==="fixed"||Kn(n,t)}function Vr(e,t){const n=t.get(e);if(n)return n;let o=Ve(e,[],!1).filter(l=>re(l)&&ke(l)!=="body"),a=null;const s=se(e).position==="fixed";let i=s?Se(e):e;for(;re(i)&&!Le(i);){const l=se(i),d=Nt(i);!d&&l.position==="fixed"&&(a=null),(s?!d&&!a:!d&&l.position==="static"&&!!a&&Wr.has(a.position)||Ue(i)&&!d&&Kn(e,i))?o=o.filter(u=>u!==i):a=l,i=Se(i)}return t.set(e,o),o}function jr(e){let{element:t,boundary:n,rootBoundary:o,strategy:a}=e;const i=[...n==="clippingAncestors"?it(t)?[]:Vr(t,this._c):[].concat(n),o],l=i[0],d=i.reduce((c,u)=>{const f=sn(t,u,a);return c.top=Z(f.top,c.top),c.right=De(f.right,c.right),c.bottom=De(f.bottom,c.bottom),c.left=Z(f.left,c.left),c},sn(t,l,a));return{width:d.right-d.left,height:d.bottom-d.top,x:d.left,y:d.top}}function Ur(e){const{width:t,height:n}=zn(e);return{width:t,height:n}}function Gr(e,t,n){const o=me(t),a=ge(t),s=n==="fixed",i=Be(e,!0,s,t);let l={scrollLeft:0,scrollTop:0};const d=fe(0);function c(){d.x=ut(a)}if(o||!o&&!s)if((ke(t)!=="body"||Ue(a))&&(l=lt(t)),o){const y=Be(t,!0,s,t);d.x=y.x+t.clientLeft,d.y=y.y+t.clientTop}else a&&c();s&&!o&&a&&c();const u=a&&!o&&!s?Wn(a,l):fe(0),f=i.left+l.scrollLeft-d.x-u.x,p=i.top+l.scrollTop-d.y-u.y;return{x:f,y:p,width:i.width,height:i.height}}function wt(e){return se(e).position==="static"}function ln(e,t){if(!me(e)||se(e).position==="fixed")return null;if(t)return t(e);let n=e.offsetParent;return ge(e)===n&&(n=n.ownerDocument.body),n}function Vn(e,t){const n=J(e);if(it(e))return n;if(!me(e)){let a=Se(e);for(;a&&!Le(a);){if(re(a)&&!wt(a))return a;a=Se(a)}return n}let o=ln(e,t);for(;o&&Ar(o)&&wt(o);)o=ln(o,t);return o&&Le(o)&&wt(o)&&!Nt(o)?n:o||Tr(e)||n}const Xr=async function(e){const t=this.getOffsetParent||Vn,n=this.getDimensions,o=await n(e.floating);return{reference:Gr(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:o.width,height:o.height}}};function Yr(e){return se(e).direction==="rtl"}const Qr={convertOffsetParentRelativeRectToViewportRelativeRect:Ir,getDocumentElement:ge,getClippingRect:jr,getOffsetParent:Vn,getElementRects:Xr,getClientRects:Nr,getDimensions:Ur,getScale:Re,isElement:re,isRTL:Yr};function jn(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function Zr(e,t){let n=null,o;const a=ge(e);function s(){var l;clearTimeout(o),(l=n)==null||l.disconnect(),n=null}function i(l,d){l===void 0&&(l=!1),d===void 0&&(d=1),s();const c=e.getBoundingClientRect(),{left:u,top:f,width:p,height:y}=c;if(l||t(),!p||!y)return;const g=Ye(f),w=Ye(a.clientWidth-(u+p)),x=Ye(a.clientHeight-(f+y)),q=Ye(u),B={rootMargin:-g+"px "+-w+"px "+-x+"px "+-q+"px",threshold:Z(0,De(1,d))||1};let k=!0;function E(H){const M=H[0].intersectionRatio;if(M!==d){if(!k)return i();M?i(!1,M):o=setTimeout(()=>{i(!1,1e-7)},1e3)}M===1&&!jn(c,e.getBoundingClientRect())&&i(),k=!1}try{n=new IntersectionObserver(E,{...B,root:a.ownerDocument})}catch{n=new IntersectionObserver(E,B)}n.observe(e)}return i(!0),s}function Jr(e,t,n,o){o===void 0&&(o={});const{ancestorScroll:a=!0,ancestorResize:s=!0,elementResize:i=typeof ResizeObserver=="function",layoutShift:l=typeof IntersectionObserver=="function",animationFrame:d=!1}=o,c=Ht(e),u=a||s?[...c?Ve(c):[],...Ve(t)]:[];u.forEach(q=>{a&&q.addEventListener("scroll",n,{passive:!0}),s&&q.addEventListener("resize",n)});const f=c&&l?Zr(c,n):null;let p=-1,y=null;i&&(y=new ResizeObserver(q=>{let[S]=q;S&&S.target===c&&y&&(y.unobserve(t),cancelAnimationFrame(p),p=requestAnimationFrame(()=>{var B;(B=y)==null||B.observe(t)})),n()}),c&&!d&&y.observe(c),y.observe(t));let g,w=d?Be(e):null;d&&x();function x(){const q=Be(e);w&&!jn(w,q)&&n(),w=q,g=requestAnimationFrame(x)}return n(),()=>{var q;u.forEach(S=>{a&&S.removeEventListener("scroll",n),s&&S.removeEventListener("resize",n)}),f?.(),(q=y)==null||q.disconnect(),y=null,d&&cancelAnimationFrame(g)}}const es=Or,ts=qr,un=wr,ns=Sr,os=xr,as=br,rs=Dr,ss=(e,t,n)=>{const o=new Map,a={platform:Qr,...n},s={...a.platform,_c:o};return _r(e,t,{...a,platform:s})};function is(e){return e!=null&&typeof e=="object"&&"$el"in e}function Bt(e){if(is(e)){const t=e.$el;return It(t)&&ke(t)==="#comment"?null:t}return e}function Te(e){return typeof e=="function"?e():r(e)}function ls(e){return{name:"arrow",options:e,fn(t){const n=Bt(Te(e.element));return n==null?{}:as({element:n,padding:e.padding}).fn(t)}}}function Un(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function dn(e,t){const n=Un(e);return Math.round(t*n)/n}function us(e,t,n){n===void 0&&(n={});const o=n.whileElementsMounted,a=D(()=>{var M;return(M=Te(n.open))!=null?M:!0}),s=D(()=>Te(n.middleware)),i=D(()=>{var M;return(M=Te(n.placement))!=null?M:"bottom"}),l=D(()=>{var M;return(M=Te(n.strategy))!=null?M:"absolute"}),d=D(()=>{var M;return(M=Te(n.transform))!=null?M:!0}),c=D(()=>Bt(e.value)),u=D(()=>Bt(t.value)),f=P(0),p=P(0),y=P(l.value),g=P(i.value),w=vo({}),x=P(!1),q=D(()=>{const M={position:y.value,left:"0",top:"0"};if(!u.value)return M;const N=dn(u.value,f.value),C=dn(u.value,p.value);return d.value?{...M,transform:"translate("+N+"px, "+C+"px)",...Un(u.value)>=1.5&&{willChange:"transform"}}:{position:y.value,left:N+"px",top:C+"px"}});let S;function B(){if(c.value==null||u.value==null)return;const M=a.value;ss(c.value,u.value,{middleware:s.value,placement:i.value,strategy:l.value}).then(N=>{f.value=N.x,p.value=N.y,y.value=N.strategy,g.value=N.placement,w.value=N.middlewareData,x.value=M!==!1})}function k(){typeof S=="function"&&(S(),S=void 0)}function E(){if(k(),o===void 0){B();return}if(c.value!=null&&u.value!=null){S=o(c.value,u.value,B);return}}function H(){a.value||(x.value=!1)}return qe([s,i,l,a],B,{flush:"sync"}),qe([c,u],E,{flush:"sync"}),qe(a,H,{flush:"sync"}),go()&&yo(k),{x:Me(f),y:Me(p),strategy:Me(y),placement:Me(g),middlewareData:Me(w),isPositioned:Me(x),floatingStyles:q,update:B}}const Gn={side:"bottom",sideOffset:0,sideFlip:!0,align:"center",alignOffset:0,alignFlip:!0,arrowPadding:0,avoidCollisions:!0,collisionBoundary:()=>[],collisionPadding:0,sticky:"partial",hideWhenDetached:!1,positionStrategy:"fixed",updatePositionStrategy:"optimized",prioritizePosition:!1},[ds,cs]=ue("PopperContent");var fs=h({inheritAttrs:!1,__name:"PopperContent",props:gn({side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},{...Gn}),emits:["placed"],setup(e,{emit:t}){const n=e,o=t,a=Tn(),{forwardRef:s,currentElement:i}=$(),l=P(),d=P(),{width:c,height:u}=Jo(d),f=D(()=>n.side+(n.align!=="center"?`-${n.align}`:"")),p=D(()=>typeof n.collisionPadding=="number"?n.collisionPadding:{top:0,right:0,bottom:0,left:0,...n.collisionPadding}),y=D(()=>Array.isArray(n.collisionBoundary)?n.collisionBoundary:[n.collisionBoundary]),g=D(()=>({padding:p.value,boundary:y.value.filter(sr),altBoundary:y.value.length>0})),w=D(()=>({mainAxis:n.sideFlip,crossAxis:n.alignFlip})),x=Bo(()=>[es({mainAxis:n.sideOffset+u.value,alignmentAxis:n.alignOffset}),n.prioritizePosition&&n.avoidCollisions&&un({...g.value,...w.value}),n.avoidCollisions&&ts({mainAxis:!0,crossAxis:!!n.prioritizePosition,limiter:n.sticky==="partial"?rs():void 0,...g.value}),!n.prioritizePosition&&n.avoidCollisions&&un({...g.value,...w.value}),ns({...g.value,apply:({elements:I,rects:Y,availableWidth:K,availableHeight:ee})=>{const{width:Q,height:U}=Y.reference,j=I.floating.style;j.setProperty("--reka-popper-available-width",`${K}px`),j.setProperty("--reka-popper-available-height",`${ee}px`),j.setProperty("--reka-popper-anchor-width",`${Q}px`),j.setProperty("--reka-popper-anchor-height",`${U}px`)}}),d.value&&ls({element:d.value,padding:n.arrowPadding}),ir({arrowWidth:c.value,arrowHeight:u.value}),n.hideWhenDetached&&os({strategy:"referenceHidden",...g.value})]),q=D(()=>n.reference??a.anchor.value),{floatingStyles:S,placement:B,isPositioned:k,middlewareData:E}=us(q,l,{strategy:n.positionStrategy,placement:f,whileElementsMounted:(...I)=>Jr(...I,{layoutShift:!n.disableUpdateOnLayoutShift,animationFrame:n.updatePositionStrategy==="always"}),middleware:x}),H=D(()=>qt(B.value)[0]),M=D(()=>qt(B.value)[1]);vn(()=>{k.value&&o("placed")});const N=D(()=>E.value.arrow?.centerOffset!==0),C=P("");ne(()=>{i.value&&(C.value=window.getComputedStyle(i.value).zIndex)});const T=D(()=>E.value.arrow?.x??0),L=D(()=>E.value.arrow?.y??0);return cs({placedSide:H,onArrowChange:I=>d.value=I,arrowX:T,arrowY:L,shouldHideArrow:N}),(I,Y)=>(v(),R("div",{ref_key:"floatingRef",ref:l,"data-reka-popper-content-wrapper":"",style:et({...r(S),transform:r(k)?r(S).transform:"translate(0, -200%)",minWidth:"max-content",zIndex:C.value,"--reka-popper-transform-origin":[r(E).transformOrigin?.x,r(E).transformOrigin?.y].join(" "),...r(E).hide?.referenceHidden&&{visibility:"hidden",pointerEvents:"none"}})},[O(r(W),A({ref:r(s)},I.$attrs,{"as-child":n.asChild,as:I.as,"data-side":H.value,"data-align":M.value,style:{animation:r(k)?void 0:"none"}}),{default:m(()=>[_(I.$slots,"default")]),_:3},16,["as-child","as","data-side","data-align","style"])],4))}}),Xn=fs;const ps={top:"bottom",right:"left",bottom:"top",left:"right"};var ms=h({inheritAttrs:!1,__name:"PopperArrow",props:{width:{type:Number,required:!1},height:{type:Number,required:!1},rounded:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"svg"}},setup(e){const{forwardRef:t}=$(),n=ds(),o=D(()=>ps[n.placedSide.value]);return(a,s)=>(v(),R("span",{ref:i=>{r(n).onArrowChange(i)},style:et({position:"absolute",left:r(n).arrowX?.value?`${r(n).arrowX?.value}px`:void 0,top:r(n).arrowY?.value?`${r(n).arrowY?.value}px`:void 0,[o.value]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[r(n).placedSide.value],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[r(n).placedSide.value],visibility:r(n).shouldHideArrow.value?"hidden":void 0})},[O(rr,A(a.$attrs,{ref:r(t),style:{display:"block"},as:a.as,"as-child":a.asChild,rounded:a.rounded,width:a.width,height:a.height}),{default:m(()=>[_(a.$slots,"default")]),_:3},16,["as","as-child","rounded","width","height"])],4))}}),vs=ms,gs=h({__name:"MenuAnchor",props:{reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return(n,o)=>(v(),b(r(Fn),G(oe(t)),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),ys=gs;function hs(){const e=P(!1);return Ae(()=>{Fe("keydown",()=>{e.value=!0},{capture:!0,passive:!0}),Fe(["pointerdown","pointermove"],()=>{e.value=!1},{capture:!0,passive:!0})}),e}const _s=hn(hs),[dt,bs]=ue(["MenuRoot","MenuSub"],"MenuContext"),[Wt,ws]=ue("MenuRoot");var xs=h({__name:"MenuRoot",props:{open:{type:Boolean,required:!1,default:!1},dir:{type:String,required:!1},modal:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t,{modal:a,dir:s}=Ie(n),i=xn(s),l=je(n,"open",o),d=P(),c=_s();return bs({open:l,onOpenChange:u=>{l.value=u},content:d,onContentChange:u=>{d.value=u}}),ws({onClose:()=>{l.value=!1},isUsingKeyboardRef:c,dir:i,modal:a}),(u,f)=>(v(),b(r(Rn),null,{default:m(()=>[_(u.$slots,"default")]),_:3}))}}),Cs=xs;const[Yn,Os]=ue("MenuContent");var qs=h({__name:"MenuContentImpl",props:gn({loop:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},disableOutsideScroll:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},{...Gn}),emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","entryFocus","openAutoFocus","closeAutoFocus","dismiss"],setup(e,{emit:t}){const n=e,o=t,a=dt(),s=Wt(),{trapFocus:i,disableOutsidePointerEvents:l,loop:d}=Ie(n);zo(),On(l.value);const c=P(""),u=P(0),f=P(0),p=P(null),y=P("right"),g=P(0),w=P(null),x=P(),{forwardRef:q,currentElement:S}=$(),{handleTypeaheadSearch:B}=ea();qe(S,C=>{a.onContentChange(C)}),At(()=>{window.clearTimeout(u.value)});function k(C){return y.value===p.value?.side&&Da(C,p.value?.area)}async function E(C){o("openAutoFocus",C),!C.defaultPrevented&&(C.preventDefault(),S.value?.focus({preventScroll:!0}))}function H(C){if(C.defaultPrevented)return;const L=C.target.closest("[data-reka-menu-content]")===C.currentTarget,I=C.ctrlKey||C.altKey||C.metaKey,Y=C.key.length===1,K=To(C,te(),S.value,{loop:d.value,arrowKeyOptions:"vertical",dir:s?.dir.value,focus:!0,attributeName:"[data-reka-collection-item]:not([data-disabled])"});if(K)return K?.focus();if(C.code==="Space")return;const ee=x.value?.getItems()??[];if(L&&(C.key==="Tab"&&C.preventDefault(),!I&&Y&&B(C.key,ee)),C.target!==S.value||!Ca.includes(C.key))return;C.preventDefault();const Q=[...ee.map(U=>U.ref)];En.includes(C.key)&&Q.reverse(),Oa(Q)}function M(C){C?.currentTarget?.contains?.(C.target)||(window.clearTimeout(u.value),c.value="")}function N(C){if(!Ot(C))return;const T=C.target,L=g.value!==C.clientX;if(C?.currentTarget?.contains(T)&&L){const I=C.clientX>g.value?"right":"left";y.value=I,g.value=C.clientX}}return Os({onItemEnter:C=>!!k(C),onItemLeave:C=>{k(C)||(S.value?.focus(),w.value=null)},onTriggerLeave:C=>!!k(C),searchRef:c,pointerGraceTimerRef:f,onPointerGraceIntentChange:C=>{p.value=C}}),(C,T)=>(v(),b(r(An),{"as-child":"",trapped:r(i),onMountAutoFocus:E,onUnmountAutoFocus:T[7]||(T[7]=L=>o("closeAutoFocus",L))},{default:m(()=>[O(r($t),{"as-child":"","disable-outside-pointer-events":r(l),onEscapeKeyDown:T[2]||(T[2]=L=>o("escapeKeyDown",L)),onPointerDownOutside:T[3]||(T[3]=L=>o("pointerDownOutside",L)),onFocusOutside:T[4]||(T[4]=L=>o("focusOutside",L)),onInteractOutside:T[5]||(T[5]=L=>o("interactOutside",L)),onDismiss:T[6]||(T[6]=L=>o("dismiss"))},{default:m(()=>[O(r(Mo),{ref_key:"rovingFocusGroupRef",ref:x,"current-tab-stop-id":w.value,"onUpdate:currentTabStopId":T[0]||(T[0]=L=>w.value=L),"as-child":"",orientation:"vertical",dir:r(s).dir.value,loop:r(d),onEntryFocus:T[1]||(T[1]=L=>{o("entryFocus",L),r(s).isUsingKeyboardRef.value||L.preventDefault()})},{default:m(()=>[O(r(Xn),{ref:r(q),role:"menu",as:C.as,"as-child":C.asChild,"aria-orientation":"vertical","data-reka-menu-content":"","data-state":r(kn)(r(a).open.value),dir:r(s).dir.value,side:C.side,"side-offset":C.sideOffset,align:C.align,"align-offset":C.alignOffset,"avoid-collisions":C.avoidCollisions,"collision-boundary":C.collisionBoundary,"collision-padding":C.collisionPadding,"arrow-padding":C.arrowPadding,"prioritize-position":C.prioritizePosition,"position-strategy":C.positionStrategy,"update-position-strategy":C.updatePositionStrategy,sticky:C.sticky,"hide-when-detached":C.hideWhenDetached,reference:C.reference,onKeydown:H,onBlur:M,onPointermove:N},{default:m(()=>[_(C.$slots,"default")]),_:3},8,["as","as-child","data-state","dir","side","side-offset","align","align-offset","avoid-collisions","collision-boundary","collision-padding","arrow-padding","prioritize-position","position-strategy","update-position-strategy","sticky","hide-when-detached","reference"])]),_:3},8,["current-tab-stop-id","dir","loop"])]),_:3},8,["disable-outside-pointer-events"])]),_:3},8,["trapped"]))}}),Qn=qs,Ds=h({inheritAttrs:!1,__name:"MenuItemImpl",props:{disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,n=Yn(),{forwardRef:o}=$(),{CollectionItem:a}=$o(),s=P(!1);async function i(d){d.defaultPrevented||Ot(d)&&(t.disabled?n.onItemLeave(d):n.onItemEnter(d)||d.currentTarget?.focus({preventScroll:!0}))}async function l(d){await ae(),!d.defaultPrevented&&Ot(d)&&n.onItemLeave(d)}return(d,c)=>(v(),b(r(a),{value:{textValue:d.textValue}},{default:m(()=>[O(r(W),A({ref:r(o),role:"menuitem",tabindex:"-1"},d.$attrs,{as:d.as,"as-child":d.asChild,"aria-disabled":d.disabled||void 0,"data-disabled":d.disabled?"":void 0,"data-highlighted":s.value?"":void 0,onPointermove:i,onPointerleave:l,onFocus:c[0]||(c[0]=async u=>{await ae(),!(u.defaultPrevented||d.disabled)&&(s.value=!0)}),onBlur:c[1]||(c[1]=async u=>{await ae(),!u.defaultPrevented&&(s.value=!1)})}),{default:m(()=>[_(d.$slots,"default")]),_:3},16,["as","as-child","aria-disabled","data-disabled","data-highlighted"])]),_:3},8,["value"]))}}),Ss=Ds,Ps=h({__name:"MenuItem",props:{disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select"],setup(e,{emit:t}){const n=e,o=t,{forwardRef:a,currentElement:s}=$(),i=Wt(),l=Yn(),d=P(!1);async function c(){const u=s.value;if(!n.disabled&&u){const f=new CustomEvent(wa,{bubbles:!0,cancelable:!0});o("select",f),await ae(),f.defaultPrevented?d.value=!1:i.onClose()}}return(u,f)=>(v(),b(Ss,A(n,{ref:r(a),onClick:c,onPointerdown:f[0]||(f[0]=()=>{d.value=!0}),onPointerup:f[1]||(f[1]=async p=>{await ae(),!p.defaultPrevented&&(d.value||p.currentTarget?.click())}),onKeydown:f[2]||(f[2]=async p=>{const y=r(l).searchRef.value!=="";u.disabled||y&&p.key===" "||r(Ct).includes(p.key)&&(p.currentTarget.click(),p.preventDefault())})}),{default:m(()=>[_(u.$slots,"default")]),_:3},16))}}),Bs=Ps,As=h({__name:"MenuRootContentModal",props:{loop:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","entryFocus","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,a=de(n,o),s=dt(),{forwardRef:i,currentElement:l}=$();return Sn(l),(d,c)=>(v(),b(Qn,A(r(a),{ref:r(i),"trap-focus":r(s).open.value,"disable-outside-pointer-events":r(s).open.value,"disable-outside-scroll":!0,onDismiss:c[0]||(c[0]=u=>r(s).onOpenChange(!1)),onFocusOutside:c[1]||(c[1]=yn(u=>o("focusOutside",u),["prevent"]))}),{default:m(()=>[_(d.$slots,"default")]),_:3},16,["trap-focus","disable-outside-pointer-events"]))}}),Es=As,ks=h({__name:"MenuRootContentNonModal",props:{loop:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","entryFocus","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const a=de(e,t),s=dt();return(i,l)=>(v(),b(Qn,A(r(a),{"trap-focus":!1,"disable-outside-pointer-events":!1,"disable-outside-scroll":!1,onDismiss:l[0]||(l[0]=d=>r(s).onOpenChange(!1))}),{default:m(()=>[_(i.$slots,"default")]),_:3},16))}}),Ms=ks,$s=h({__name:"MenuContent",props:{forceMount:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","entryFocus","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const a=de(e,t),s=dt(),i=Wt();return(l,d)=>(v(),b(r(rt),{present:l.forceMount||r(s).open.value},{default:m(()=>[r(i).modal.value?(v(),b(Es,G(A({key:0},{...l.$attrs,...r(a)})),{default:m(()=>[_(l.$slots,"default")]),_:3},16)):(v(),b(Ms,G(A({key:1},{...l.$attrs,...r(a)})),{default:m(()=>[_(l.$slots,"default")]),_:3},16))]),_:3},8,["present"]))}}),Ts=$s,Rs=h({__name:"MenuGroup",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return(n,o)=>(v(),b(r(W),A({role:"group"},t),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),Fs=Rs,Ls=h({__name:"MenuLabel",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"div"}},setup(e){const t=e;return(n,o)=>(v(),b(r(W),G(oe(t)),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),Is=Ls,Ns=h({__name:"MenuPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(v(),b(r(Tt),G(oe(t)),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),zs=Ns,Hs=h({__name:"MenuSeparator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return(n,o)=>(v(),b(r(W),A(t,{role:"separator","aria-orientation":"horizontal"}),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),Ws=Hs;const[Zn,Ks]=ue("DropdownMenuRoot");var Vs=h({__name:"DropdownMenuRoot",props:{defaultOpen:{type:Boolean,required:!1},open:{type:Boolean,required:!1,default:void 0},dir:{type:String,required:!1},modal:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t;$();const a=je(n,"open",o,{defaultValue:n.defaultOpen,passive:n.open===void 0}),s=P(),{modal:i,dir:l}=Ie(n),d=xn(l);return Ks({open:a,onOpenChange:c=>{a.value=c},onOpenToggle:()=>{a.value=!a.value},triggerId:"",triggerElement:s,contentId:"",modal:i,dir:d}),(c,u)=>(v(),b(r(Cs),{open:r(a),"onUpdate:open":u[0]||(u[0]=f=>ho(a)?a.value=f:null),dir:r(d),modal:r(i)},{default:m(()=>[_(c.$slots,"default",{open:r(a)})]),_:3},8,["open","dir","modal"]))}}),js=Vs,Us=h({__name:"DropdownMenuContent",props:{forceMount:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","closeAutoFocus"],setup(e,{emit:t}){const a=de(e,t);$();const s=Zn(),i=P(!1);function l(d){d.defaultPrevented||(i.value||setTimeout(()=>{s.triggerElement.value?.focus()},0),i.value=!1,d.preventDefault())}return s.contentId||=We(void 0,"reka-dropdown-menu-content"),(d,c)=>(v(),b(r(Ts),A(r(a),{id:r(s).contentId,"aria-labelledby":r(s)?.triggerId,style:{"--reka-dropdown-menu-content-transform-origin":"var(--reka-popper-transform-origin)","--reka-dropdown-menu-content-available-width":"var(--reka-popper-available-width)","--reka-dropdown-menu-content-available-height":"var(--reka-popper-available-height)","--reka-dropdown-menu-trigger-width":"var(--reka-popper-anchor-width)","--reka-dropdown-menu-trigger-height":"var(--reka-popper-anchor-height)"},onCloseAutoFocus:l,onInteractOutside:c[0]||(c[0]=u=>{if(u.defaultPrevented)return;const f=u.detail.originalEvent,p=f.button===0&&f.ctrlKey===!0,y=f.button===2||p;(!r(s).modal.value||y)&&(i.value=!0),r(s).triggerElement.value?.contains(u.target)&&u.preventDefault()})}),{default:m(()=>[_(d.$slots,"default")]),_:3},16,["id","aria-labelledby"]))}}),Gs=Us,Xs=h({__name:"DropdownMenuGroup",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return $(),(n,o)=>(v(),b(r(Fs),G(oe(t)),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),Ys=Xs,Qs=h({__name:"DropdownMenuItem",props:{disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select"],setup(e,{emit:t}){const n=e,a=ot(t);return $(),(s,i)=>(v(),b(r(Bs),G(oe({...n,...r(a)})),{default:m(()=>[_(s.$slots,"default")]),_:3},16))}}),Zs=Qs,Js=h({__name:"DropdownMenuLabel",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return $(),(n,o)=>(v(),b(r(Is),G(oe(t)),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),ei=Js,ti=h({__name:"DropdownMenuPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(v(),b(r(zs),G(oe(t)),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),ni=ti,oi=h({__name:"DropdownMenuSeparator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e;return $(),(n,o)=>(v(),b(r(Ws),G(oe(t)),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),ai=oi,ri=h({__name:"DropdownMenuTrigger",props:{disabled:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e,n=Zn(),{forwardRef:o,currentElement:a}=$();return Ae(()=>{n.triggerElement=a}),n.triggerId||=We(void 0,"reka-dropdown-menu-trigger"),(s,i)=>(v(),b(r(ys),{"as-child":""},{default:m(()=>[O(r(W),{id:r(n).triggerId,ref:r(o),type:s.as==="button"?"button":void 0,"as-child":t.asChild,as:s.as,"aria-haspopup":"menu","aria-expanded":r(n).open.value,"aria-controls":r(n).open.value?r(n).contentId:void 0,"data-disabled":s.disabled?"":void 0,disabled:s.disabled,"data-state":r(n).open.value?"open":"closed",onClick:i[0]||(i[0]=async l=>{!s.disabled&&l.button===0&&l.ctrlKey===!1&&(r(n)?.onOpenToggle(),await ae(),r(n).open.value&&l.preventDefault())}),onKeydown:i[1]||(i[1]=_o(l=>{s.disabled||(["Enter"," "].includes(l.key)&&r(n).onOpenToggle(),l.key==="ArrowDown"&&r(n).onOpenChange(!0),["Enter"," ","ArrowDown"].includes(l.key)&&l.preventDefault())},["enter","space","arrow-down"]))},{default:m(()=>[_(s.$slots,"default")]),_:3},8,["id","type","as-child","as","aria-expanded","aria-controls","data-disabled","disabled","data-state"])]),_:3}))}}),si=ri,ii=h({__name:"TooltipArrow",props:{width:{type:Number,required:!1,default:10},height:{type:Number,required:!1,default:5},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"svg"}},setup(e){const t=e;return $(),(n,o)=>(v(),b(r(vs),G(oe(t)),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),li=ii;const[Kt,ui]=ue("TooltipProvider");var di=h({inheritAttrs:!1,__name:"TooltipProvider",props:{delayDuration:{type:Number,required:!1,default:700},skipDelayDuration:{type:Number,required:!1,default:300},disableHoverableContent:{type:Boolean,required:!1,default:!1},disableClosingTrigger:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},ignoreNonKeyboardFocus:{type:Boolean,required:!1,default:!1}},setup(e){const t=e,{delayDuration:n,skipDelayDuration:o,disableHoverableContent:a,disableClosingTrigger:s,ignoreNonKeyboardFocus:i,disabled:l}=Ie(t);$();const d=P(!0),c=P(!1),{start:u,stop:f}=wn(()=>{d.value=!0},o,{immediate:!1});return ui({isOpenDelayed:d,delayDuration:n,onOpen(){f(),d.value=!1},onClose(){u()},isPointerInTransitRef:c,disableHoverableContent:a,disableClosingTrigger:s,disabled:l,ignoreNonKeyboardFocus:i}),(p,y)=>_(p.$slots,"default")}}),ci=di;const Jn="tooltip.open",[ct,fi]=ue("TooltipRoot");var pi=h({__name:"TooltipRoot",props:{defaultOpen:{type:Boolean,required:!1,default:!1},open:{type:Boolean,required:!1,default:void 0},delayDuration:{type:Number,required:!1,default:void 0},disableHoverableContent:{type:Boolean,required:!1,default:void 0},disableClosingTrigger:{type:Boolean,required:!1,default:void 0},disabled:{type:Boolean,required:!1,default:void 0},ignoreNonKeyboardFocus:{type:Boolean,required:!1,default:void 0}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t;$();const a=Kt(),s=D(()=>n.disableHoverableContent??a.disableHoverableContent.value),i=D(()=>n.disableClosingTrigger??a.disableClosingTrigger.value),l=D(()=>n.disabled??a.disabled.value),d=D(()=>n.delayDuration??a.delayDuration.value),c=D(()=>n.ignoreNonKeyboardFocus??a.ignoreNonKeyboardFocus.value),u=je(n,"open",o,{defaultValue:n.defaultOpen,passive:n.open===void 0});qe(u,B=>{a.onClose&&(B?(a.onOpen(),document.dispatchEvent(new CustomEvent(Jn))):a.onClose())});const f=P(!1),p=P(),y=D(()=>u.value?f.value?"delayed-open":"instant-open":"closed"),{start:g,stop:w}=wn(()=>{f.value=!0,u.value=!0},d,{immediate:!1});function x(){w(),f.value=!1,u.value=!0}function q(){w(),u.value=!1}function S(){g()}return fi({contentId:"",open:u,stateAttribute:y,trigger:p,onTriggerChange(B){p.value=B},onTriggerEnter(){a.isOpenDelayed.value?S():x()},onTriggerLeave(){s.value?q():w()},onOpen:x,onClose:q,disableHoverableContent:s,disableClosingTrigger:i,disabled:l,ignoreNonKeyboardFocus:c}),(B,k)=>(v(),b(r(Rn),null,{default:m(()=>[_(B.$slots,"default",{open:r(u)})]),_:3}))}}),mi=pi,vi=h({__name:"TooltipContentImpl",props:{ariaLabel:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},side:{type:null,required:!1,default:"top"},sideOffset:{type:Number,required:!1,default:0},align:{type:null,required:!1,default:"center"},alignOffset:{type:Number,required:!1},avoidCollisions:{type:Boolean,required:!1,default:!0},collisionBoundary:{type:null,required:!1,default:()=>[]},collisionPadding:{type:[Number,Object],required:!1,default:0},arrowPadding:{type:Number,required:!1,default:0},sticky:{type:String,required:!1,default:"partial"},hideWhenDetached:{type:Boolean,required:!1,default:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1}},emits:["escapeKeyDown","pointerDownOutside"],setup(e,{emit:t}){const n=e,o=t,a=ct(),{forwardRef:s}=$(),i=bo(),l=D(()=>i.default?.({})),d=D(()=>{if(n.ariaLabel)return n.ariaLabel;let u="";function f(p){typeof p.children=="string"&&p.type!==wo?u+=p.children:Array.isArray(p.children)&&p.children.forEach(y=>f(y))}return l.value?.forEach(p=>f(p)),u}),c=D(()=>{const{ariaLabel:u,...f}=n;return f});return Ae(()=>{Fe(window,"scroll",u=>{u.target?.contains(a.trigger.value)&&a.onClose()}),Fe(window,Jn,a.onClose)}),(u,f)=>(v(),b(r($t),{"as-child":"","disable-outside-pointer-events":!1,onEscapeKeyDown:f[0]||(f[0]=p=>o("escapeKeyDown",p)),onPointerDownOutside:f[1]||(f[1]=p=>{r(a).disableClosingTrigger.value&&r(a).trigger.value?.contains(p.target)&&p.preventDefault(),o("pointerDownOutside",p)}),onFocusOutside:f[2]||(f[2]=yn(()=>{},["prevent"])),onDismiss:f[3]||(f[3]=p=>r(a).onClose())},{default:m(()=>[O(r(Xn),A({ref:r(s),"data-state":r(a).stateAttribute.value},{...u.$attrs,...c.value},{style:{"--reka-tooltip-content-transform-origin":"var(--reka-popper-transform-origin)","--reka-tooltip-content-available-width":"var(--reka-popper-available-width)","--reka-tooltip-content-available-height":"var(--reka-popper-available-height)","--reka-tooltip-trigger-width":"var(--reka-popper-anchor-width)","--reka-tooltip-trigger-height":"var(--reka-popper-anchor-height)"}}),{default:m(()=>[_(u.$slots,"default"),O(r(ko),{id:r(a).contentId,role:"tooltip"},{default:m(()=>[pe(he(d.value),1)]),_:1},8,["id"])]),_:3},16,["data-state"])]),_:3}))}}),eo=vi,gi=h({__name:"TooltipContentHoverable",props:{ariaLabel:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1}},setup(e){const n=at(e),{forwardRef:o,currentElement:a}=$(),{trigger:s,onClose:i}=ct(),l=Kt(),{isPointerInTransit:d,onPointerExit:c}=Ho(s,a);return l.isPointerInTransitRef=d,c(()=>{i()}),(u,f)=>(v(),b(eo,A({ref:r(o)},r(n)),{default:m(()=>[_(u.$slots,"default")]),_:3},16))}}),yi=gi,hi=h({__name:"TooltipContent",props:{forceMount:{type:Boolean,required:!1},ariaLabel:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},side:{type:null,required:!1,default:"top"},sideOffset:{type:Number,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1}},emits:["escapeKeyDown","pointerDownOutside"],setup(e,{emit:t}){const n=e,o=t,a=ct(),s=de(n,o),{forwardRef:i}=$();return(l,d)=>(v(),b(r(rt),{present:l.forceMount||r(a).open.value},{default:m(()=>[(v(),b(tt(r(a).disableHoverableContent.value?eo:yi),A({ref:r(i)},r(s)),{default:m(()=>[_(l.$slots,"default")]),_:3},16))]),_:3},8,["present"]))}}),_i=hi,bi=h({__name:"TooltipPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(v(),b(r(Tt),G(oe(t)),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),wi=bi,xi=h({__name:"TooltipTrigger",props:{reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e,n=ct(),o=Kt();n.contentId||=We(void 0,"reka-tooltip-content");const{forwardRef:a,currentElement:s}=$(),i=P(!1),l=P(!1),d=D(()=>n.disabled.value?{}:{click:w,focus:y,pointermove:f,pointerleave:p,pointerdown:u,blur:g});Ae(()=>{n.onTriggerChange(s.value)});function c(){setTimeout(()=>{i.value=!1},1)}function u(){n.open&&!n.disableClosingTrigger.value&&n.onClose(),i.value=!0,document.addEventListener("pointerup",c,{once:!0})}function f(x){x.pointerType!=="touch"&&!l.value&&!o.isPointerInTransitRef.value&&(n.onTriggerEnter(),l.value=!0)}function p(){n.onTriggerLeave(),l.value=!1}function y(x){i.value||n.ignoreNonKeyboardFocus.value&&!x.target.matches?.(":focus-visible")||n.onOpen()}function g(){n.onClose()}function w(){n.disableClosingTrigger.value||n.onClose()}return(x,q)=>(v(),b(r(Fn),{"as-child":"",reference:x.reference},{default:m(()=>[O(r(W),A({ref:r(a),"aria-describedby":r(n).open.value?r(n).contentId:void 0,"data-state":r(n).stateAttribute.value,as:x.as,"as-child":t.asChild,"data-grace-area-trigger":""},xo(d.value)),{default:m(()=>[_(x.$slots,"default")]),_:3},16,["aria-describedby","data-state","as","as-child"])]),_:3},8,["reference"]))}}),Ci=xi;const Oi=h({__name:"Sheet",props:{open:{type:Boolean},defaultOpen:{type:Boolean},modal:{type:Boolean}},emits:["update:open"],setup(e,{emit:t}){const a=de(e,t);return(s,i)=>(v(),b(r(ra),A({"data-slot":"sheet"},r(a)),{default:m(()=>[_(s.$slots,"default")]),_:3},16))}});const qi=ve("BookOpenIcon",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);const Di=ve("ChevronRightIcon",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);const Si=ve("ChevronsUpDownIcon",[["path",{d:"m7 15 5 5 5-5",key:"1hf1tw"}],["path",{d:"m7 9 5-5 5 5",key:"sgt6xg"}]]);const Pi=ve("FilmIcon",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M7 3v18",key:"bbkbws"}],["path",{d:"M3 7.5h4",key:"zfgn84"}],["path",{d:"M3 12h18",key:"1i2n21"}],["path",{d:"M3 16.5h4",key:"1230mu"}],["path",{d:"M17 3v18",key:"in4fa5"}],["path",{d:"M17 7.5h4",key:"myr1c1"}],["path",{d:"M17 16.5h4",key:"go4c1d"}]]);const Bi=ve("FolderIcon",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]);const Ai=ve("LayoutGridIcon",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]]);const Ei=ve("LogOutIcon",[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]]);const ki=ve("PanelLeftIcon",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}]]);const Mi=ve("SettingsIcon",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);const $i=ve("XIcon",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),Ti=h({__name:"SheetOverlay",props:{forceMount:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=D(()=>{const{class:o,...a}=t;return a});return(o,a)=>(v(),b(r(Ia),A({"data-slot":"sheet-overlay",class:r(F)("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80",t.class)},n.value),{default:m(()=>[_(o.$slots,"default")]),_:3},16,["class"]))}}),Ri=h({inheritAttrs:!1,__name:"SheetContent",props:{class:{},side:{default:"right"},forceMount:{type:Boolean},disableOutsidePointerEvents:{type:Boolean},asChild:{type:Boolean},as:{}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,a=nt(n,"class","side"),s=de(a,o);return(i,l)=>(v(),b(r(Ha),null,{default:m(()=>[O(Ti),O(r(Ma),A({"data-slot":"sheet-content",class:r(F)("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",e.side==="right"&&"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",e.side==="left"&&"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",e.side==="top"&&"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",e.side==="bottom"&&"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",n.class)},{...r(s),...i.$attrs}),{default:m(()=>[_(i.$slots,"default"),O(r(ia),{class:"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none"},{default:m(()=>[O(r($i),{class:"size-4"}),l[0]||(l[0]=V("span",{class:"sr-only"},"Close",-1))]),_:1})]),_:3},16,["class"])]),_:3}))}}),Fi=h({__name:"SheetDescription",props:{asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=D(()=>{const{class:o,...a}=t;return a});return(o,a)=>(v(),b(r(Ta),A({"data-slot":"sheet-description",class:r(F)("text-muted-foreground text-sm",t.class)},n.value),{default:m(()=>[_(o.$slots,"default")]),_:3},16,["class"]))}}),Li=h({__name:"SheetHeader",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("div",{"data-slot":"sheet-header",class:z(r(F)("flex flex-col gap-1.5 p-4",t.class))},[_(n.$slots,"default")],2))}}),Ii=h({__name:"SheetTitle",props:{asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=D(()=>{const{class:o,...a}=t;return a});return(o,a)=>(v(),b(r(Ka),A({"data-slot":"sheet-title",class:r(F)("text-foreground font-semibold",t.class)},n.value),{default:m(()=>[_(o.$slots,"default")]),_:3},16,["class"]))}}),Ni="sidebar_state",zi=3600*24*7,Hi="16rem",Wi="18rem",Ki="3rem",Vi="b",[ft,ji]=ue("Sidebar"),Ui={class:"flex h-full w-full flex-col"},Gi=["data-state","data-collapsible","data-variant","data-side"],Xi={"data-sidebar":"sidebar",class:"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm"},Yi=h({inheritAttrs:!1,__name:"Sidebar",props:{side:{default:"left"},variant:{default:"sidebar"},collapsible:{default:"offcanvas"},class:{}},setup(e){const t=e,{isMobile:n,state:o,openMobile:a,setOpenMobile:s}=ft();return(i,l)=>e.collapsible==="none"?(v(),R("div",A({key:0,"data-slot":"sidebar",class:r(F)("bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col",t.class)},i.$attrs),[_(i.$slots,"default")],16)):r(n)?(v(),b(r(Oi),A({key:1,open:r(a)},i.$attrs,{"onUpdate:open":r(s)}),{default:m(()=>[O(r(Ri),{"data-sidebar":"sidebar","data-slot":"sidebar","data-mobile":"true",side:e.side,class:"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden",style:et({"--sidebar-width":r(Wi)})},{default:m(()=>[O(Li,{class:"sr-only"},{default:m(()=>[O(Ii,null,{default:m(()=>[...l[0]||(l[0]=[pe("Sidebar",-1)])]),_:1}),O(Fi,null,{default:m(()=>[...l[1]||(l[1]=[pe("Displays the mobile sidebar.",-1)])]),_:1})]),_:1}),V("div",Ui,[_(i.$slots,"default")])]),_:3},8,["side","style"])]),_:3},16,["open","onUpdate:open"])):(v(),R("div",{key:2,class:"group peer text-sidebar-foreground hidden md:block","data-slot":"sidebar","data-state":r(o),"data-collapsible":r(o)==="collapsed"?e.collapsible:"","data-variant":e.variant,"data-side":e.side},[V("div",{class:z(r(F)("relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear","group-data-[collapsible=offcanvas]:w-0","group-data-[side=right]:rotate-180",e.variant==="floating"||e.variant==="inset"?"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]":"group-data-[collapsible=icon]:w-(--sidebar-width-icon)"))},null,2),V("div",A({class:r(F)("fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex",e.side==="left"?"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]":"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",e.variant==="floating"||e.variant==="inset"?"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]":"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",t.class)},i.$attrs),[V("div",Xi,[_(i.$slots,"default")])],16)],8,Gi))}}),Qi=h({__name:"SidebarContent",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("div",{"data-slot":"sidebar-content","data-sidebar":"content",class:z(r(F)("flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",t.class))},[_(n.$slots,"default")],2))}}),Zi=h({__name:"SidebarFooter",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("div",{"data-slot":"sidebar-footer","data-sidebar":"footer",class:z(r(F)("flex flex-col gap-2 p-2",t.class))},[_(n.$slots,"default")],2))}}),to=h({__name:"SidebarGroup",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("div",{"data-slot":"sidebar-group","data-sidebar":"group",class:z(r(F)("relative flex w-full min-w-0 flex-col p-2",t.class))},[_(n.$slots,"default")],2))}}),Ji=h({__name:"SidebarGroupContent",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("div",{"data-slot":"sidebar-group-content","data-sidebar":"group-content",class:z(r(F)("w-full text-sm",t.class))},[_(n.$slots,"default")],2))}}),el=h({__name:"SidebarGroupLabel",props:{asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e;return(n,o)=>(v(),b(r(W),{"data-slot":"sidebar-group-label","data-sidebar":"group-label",as:e.as,"as-child":e.asChild,class:z(r(F)("text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0","group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",t.class))},{default:m(()=>[_(n.$slots,"default")]),_:3},8,["as","as-child","class"]))}}),tl=h({__name:"SidebarHeader",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("div",{"data-slot":"sidebar-header","data-sidebar":"header",class:z(r(F)("flex flex-col gap-2 p-2",t.class))},[_(n.$slots,"default")],2))}}),nl=h({__name:"SidebarInset",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("main",{"data-slot":"sidebar-inset",class:z(r(F)("bg-background relative flex w-full flex-1 flex-col","md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-0",t.class))},[_(n.$slots,"default")],2))}}),pt=h({__name:"SidebarMenu",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("ul",{"data-slot":"sidebar-menu","data-sidebar":"menu",class:z(r(F)("flex w-full min-w-0 flex-col gap-1",t.class))},[_(n.$slots,"default")],2))}}),ol=h({__name:"Tooltip",props:{defaultOpen:{type:Boolean},open:{type:Boolean},delayDuration:{},disableHoverableContent:{type:Boolean},disableClosingTrigger:{type:Boolean},disabled:{type:Boolean},ignoreNonKeyboardFocus:{type:Boolean}},emits:["update:open"],setup(e,{emit:t}){const a=de(e,t);return(s,i)=>(v(),b(r(mi),A({"data-slot":"tooltip"},r(a)),{default:m(()=>[_(s.$slots,"default")]),_:3},16))}}),al=h({inheritAttrs:!1,__name:"TooltipContent",props:{forceMount:{type:Boolean},ariaLabel:{},asChild:{type:Boolean},as:{},side:{},sideOffset:{default:4},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},positionStrategy:{},updatePositionStrategy:{},class:{}},emits:["escapeKeyDown","pointerDownOutside"],setup(e,{emit:t}){const n=e,o=t,a=nt(n,"class"),s=de(a,o);return(i,l)=>(v(),b(r(wi),null,{default:m(()=>[O(r(_i),A({"data-slot":"tooltip-content"},{...r(s),...i.$attrs},{class:r(F)("bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit rounded-md px-3 py-1.5 text-xs text-balance",n.class)}),{default:m(()=>[_(i.$slots,"default"),O(r(li),{class:"bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]"})]),_:3},16,["class"])]),_:3}))}}),rl=h({__name:"TooltipTrigger",props:{reference:{},asChild:{type:Boolean},as:{}},setup(e){const t=e;return(n,o)=>(v(),b(r(Ci),A({"data-slot":"tooltip-trigger"},t),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),cn=h({__name:"SidebarMenuButtonChild",props:{variant:{default:"default"},size:{default:"default"},isActive:{type:Boolean},class:{},asChild:{type:Boolean},as:{default:"button"}},setup(e){const t=e;return(n,o)=>(v(),b(r(W),A({"data-slot":"sidebar-menu-button","data-sidebar":"menu-button","data-size":e.size,"data-active":e.isActive,class:r(F)(r(ll)({variant:e.variant,size:e.size}),t.class),as:e.as,"as-child":e.asChild},n.$attrs),{default:m(()=>[_(n.$slots,"default")]),_:3},16,["data-size","data-active","class","as","as-child"]))}}),mt=h({inheritAttrs:!1,__name:"SidebarMenuButton",props:{variant:{default:"default"},size:{default:"default"},isActive:{type:Boolean},class:{},asChild:{type:Boolean},as:{default:"button"},tooltip:{}},setup(e){const t=e,{isMobile:n,state:o}=ft(),a=D(()=>{const{tooltip:s,...i}=t;return i});return(s,i)=>e.tooltip?(v(),b(r(ol),{key:1},{default:m(()=>[O(r(rl),{"as-child":""},{default:m(()=>[O(cn,G(oe({...a.value,...s.$attrs})),{default:m(()=>[_(s.$slots,"default")]),_:3},16)]),_:3}),O(r(al),{side:"right",align:"center",hidden:r(o)!=="collapsed"||r(n)},{default:m(()=>[typeof e.tooltip=="string"?(v(),R(_e,{key:0},[pe(he(e.tooltip),1)],64)):(v(),b(tt(e.tooltip),{key:1}))]),_:1},8,["hidden"])]),_:3})):(v(),b(cn,G(A({key:0},{...a.value,...s.$attrs})),{default:m(()=>[_(s.$slots,"default")]),_:3},16))}}),vt=h({__name:"SidebarMenuItem",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("li",{"data-slot":"sidebar-menu-item","data-sidebar":"menu-item",class:z(r(F)("group/menu-item relative",t.class))},[_(n.$slots,"default")],2))}}),sl=h({__name:"SidebarProvider",props:{defaultOpen:{type:Boolean,default:!0},open:{type:Boolean,default:void 0},class:{}},emits:["update:open"],setup(e,{emit:t}){const n=e,o=t,a=Ao("(max-width: 768px)"),s=P(!1),i=je(n,"open",o,{defaultValue:n.defaultOpen??!1,passive:n.open===void 0});function l(f){i.value=f,document.cookie=`${Ni}=${i.value}; path=/; max-age=${zi}`}function d(f){s.value=f}function c(){return a.value?d(!s.value):l(!i.value)}Fe("keydown",f=>{f.key===Vi&&(f.metaKey||f.ctrlKey)&&(f.preventDefault(),c())});const u=D(()=>i.value?"expanded":"collapsed");return ji({state:u,open:i,setOpen:l,isMobile:a,openMobile:s,setOpenMobile:d,toggleSidebar:c}),(f,p)=>(v(),b(r(ci),{"delay-duration":0},{default:m(()=>[V("div",A({"data-slot":"sidebar-wrapper",style:{"--sidebar-width":r(Hi),"--sidebar-width-icon":r(Ki)},class:r(F)("group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full",n.class)},f.$attrs),[_(f.$slots,"default")],16)]),_:3}))}}),il=h({__name:"SidebarTrigger",props:{class:{}},setup(e){const t=e,{toggleSidebar:n}=ft();return(o,a)=>(v(),b(r(so),{"data-sidebar":"trigger","data-slot":"sidebar-trigger",variant:"ghost",size:"icon",class:z(r(F)("h-7 w-7",t.class)),onClick:r(n)},{default:m(()=>[O(r(ki)),a[0]||(a[0]=V("span",{class:"sr-only"},"Toggle Sidebar",-1))]),_:1},8,["class","onClick"]))}}),ll=io("peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:pr-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",{variants:{variant:{default:"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",outline:"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]"},size:{default:"h-8 text-sm",sm:"h-7 text-xs",lg:"h-12 text-sm group-data-[collapsible=icon]:p-0!"}},defaultVariants:{variant:"default",size:"default"}}),ul=h({__name:"AppContent",props:{variant:{},class:{}},setup(e){const t=e,n=D(()=>t.class);return(o,a)=>t.variant==="sidebar"?(v(),b(r(nl),{key:0,class:z(n.value)},{default:m(()=>[_(o.$slots,"default")]),_:3},8,["class"])):(v(),R("main",{key:1,class:z(["mx-auto flex h-full w-full max-w-7xl flex-1 flex-col gap-4 rounded-xl",n.value])},[_(o.$slots,"default")],2))}}),dl={key:0,class:"flex min-h-screen w-full flex-col"},cl=h({__name:"AppShell",props:{variant:{}},setup(e){const t=Et().props.sidebarOpen;return(n,o)=>e.variant==="header"?(v(),R("div",dl,[_(n.$slots,"default")])):(v(),b(r(sl),{key:1,"default-open":r(t)},{default:m(()=>[_(n.$slots,"default")]),_:3},8,["default-open"]))}}),fl=["href"],pl=h({__name:"NavFooter",props:{items:{},class:{}},setup(e){return(t,n)=>(v(),b(r(to),{class:z(`group-data-[collapsible=icon]:p-0 ${t.$props.class||""}`)},{default:m(()=>[O(r(Ji),null,{default:m(()=>[O(r(pt),null,{default:m(()=>[(v(!0),R(_e,null,kt(e.items,o=>(v(),b(r(vt),{key:o.title},{default:m(()=>[O(r(mt),{class:"text-neutral-600 hover:text-neutral-800 dark:text-neutral-300 dark:hover:text-neutral-100","as-child":""},{default:m(()=>[V("a",{href:r(lo)(o.href),target:"_blank",rel:"noopener noreferrer"},[(v(),b(tt(o.icon))),V("span",null,he(o.title),1)],8,fl)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})]),_:1},8,["class"]))}}),ml=h({__name:"NavMain",props:{items:{}},setup(e){const t=Et();return(n,o)=>(v(),b(r(to),{class:"px-2 py-0"},{default:m(()=>[O(r(el),null,{default:m(()=>[...o[0]||(o[0]=[pe("Platform",-1)])]),_:1}),O(r(pt),null,{default:m(()=>[(v(!0),R(_e,null,kt(e.items,a=>(v(),b(r(vt),{key:a.title},{default:m(()=>[O(r(mt),{"as-child":"","is-active":r(uo)(a.href,r(t).url),tooltip:a.title},{default:m(()=>[O(r(He),{href:a.href},{default:m(()=>[(v(),b(tt(a.icon))),V("span",null,he(a.title),1)]),_:2},1032,["href"])]),_:2},1032,["is-active","tooltip"])]),_:2},1024))),128))]),_:1})]),_:1}))}}),vl=h({__name:"Avatar",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),b(r(Ua),{"data-slot":"avatar",class:z(r(F)("relative flex size-8 shrink-0 overflow-hidden rounded-full",t.class))},{default:m(()=>[_(n.$slots,"default")]),_:3},8,["class"]))}}),gl=h({__name:"AvatarFallback",props:{delayMs:{},asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=D(()=>{const{class:o,...a}=t;return a});return(o,a)=>(v(),b(r(Xa),A({"data-slot":"avatar-fallback"},n.value,{class:r(F)("bg-muted flex size-full items-center justify-center rounded-full",t.class)}),{default:m(()=>[_(o.$slots,"default")]),_:3},16,["class"]))}}),yl=h({__name:"AvatarImage",props:{src:{},referrerPolicy:{},crossOrigin:{},asChild:{type:Boolean},as:{}},setup(e){const t=e;return(n,o)=>(v(),b(r(Za),A({"data-slot":"avatar-image"},t,{class:"aspect-square size-full"}),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}});function hl(e){if(!e)return"";const t=e.trim().split(" ");return t.length===0?"":t.length===1?t[0].charAt(0).toUpperCase():`${t[0].charAt(0)}${t[t.length-1].charAt(0)}`.toUpperCase()}function _l(){return{getInitials:hl}}const bl={class:"grid flex-1 text-left text-sm leading-tight"},wl={class:"truncate font-medium"},xl={key:0,class:"truncate text-xs text-muted-foreground"},no=h({__name:"UserInfo",props:{user:{},showEmail:{type:Boolean,default:!1}},setup(e){const t=e,{getInitials:n}=_l(),o=D(()=>t.user.avatar&&t.user.avatar!=="");return(a,s)=>(v(),R(_e,null,[O(r(vl),{class:"h-8 w-8 overflow-hidden rounded-lg"},{default:m(()=>[o.value?(v(),b(r(yl),{key:0,src:e.user.avatar,alt:e.user.name},null,8,["src","alt"])):Pe("",!0),O(r(gl),{class:"rounded-lg text-black dark:text-white"},{default:m(()=>[pe(he(r(n)(e.user.name)),1)]),_:1})]),_:1}),V("div",bl,[V("span",wl,he(e.user.name),1),e.showEmail?(v(),R("span",xl,he(e.user.email),1)):Pe("",!0)])],64))}}),Cl=h({__name:"DropdownMenu",props:{defaultOpen:{type:Boolean},open:{type:Boolean},dir:{},modal:{type:Boolean}},emits:["update:open"],setup(e,{emit:t}){const a=de(e,t);return(s,i)=>(v(),b(r(js),A({"data-slot":"dropdown-menu"},r(a)),{default:m(()=>[_(s.$slots,"default")]),_:3},16))}}),Ol=h({__name:"DropdownMenuContent",props:{forceMount:{type:Boolean},loop:{type:Boolean},side:{},sideOffset:{default:4},sideFlip:{type:Boolean},align:{},alignOffset:{},alignFlip:{type:Boolean},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},positionStrategy:{},updatePositionStrategy:{},disableUpdateOnLayoutShift:{type:Boolean},prioritizePosition:{type:Boolean},reference:{},asChild:{type:Boolean},as:{},class:{}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","closeAutoFocus"],setup(e,{emit:t}){const n=e,o=t,a=D(()=>{const{class:i,...l}=n;return l}),s=de(a,o);return(i,l)=>(v(),b(r(ni),null,{default:m(()=>[O(r(Gs),A({"data-slot":"dropdown-menu-content"},r(s),{class:r(F)("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--reka-dropdown-menu-content-available-height) min-w-[8rem] origin-(--reka-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",n.class)}),{default:m(()=>[_(i.$slots,"default")]),_:3},16,["class"])]),_:3}))}}),ql=h({__name:"DropdownMenuGroup",props:{asChild:{type:Boolean},as:{}},setup(e){const t=e;return(n,o)=>(v(),b(r(Ys),A({"data-slot":"dropdown-menu-group"},t),{default:m(()=>[_(n.$slots,"default")]),_:3},16))}}),fn=h({__name:"DropdownMenuItem",props:{disabled:{type:Boolean},textValue:{},asChild:{type:Boolean},as:{},class:{},inset:{type:Boolean},variant:{default:"default"}},setup(e){const t=e,n=nt(t,"inset","variant"),o=at(n);return(a,s)=>(v(),b(r(Zs),A({"data-slot":"dropdown-menu-item","data-inset":e.inset?"":void 0,"data-variant":e.variant},r(o),{class:r(F)("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",t.class)}),{default:m(()=>[_(a.$slots,"default")]),_:3},16,["data-inset","data-variant","class"]))}}),Dl=h({__name:"DropdownMenuLabel",props:{asChild:{type:Boolean},as:{},class:{},inset:{type:Boolean}},setup(e){const t=e,n=nt(t,"class","inset"),o=at(n);return(a,s)=>(v(),b(r(ei),A({"data-slot":"dropdown-menu-label","data-inset":e.inset?"":void 0},r(o),{class:r(F)("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",t.class)}),{default:m(()=>[_(a.$slots,"default")]),_:3},16,["data-inset","class"]))}}),pn=h({__name:"DropdownMenuSeparator",props:{asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=D(()=>{const{class:o,...a}=t;return a});return(o,a)=>(v(),b(r(ai),A({"data-slot":"dropdown-menu-separator"},n.value,{class:r(F)("bg-border -mx-1 my-1 h-px",t.class)}),null,16,["class"]))}}),Sl=h({__name:"DropdownMenuTrigger",props:{disabled:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){const n=at(e);return(o,a)=>(v(),b(r(si),A({"data-slot":"dropdown-menu-trigger"},r(n)),{default:m(()=>[_(o.$slots,"default")]),_:3},16))}}),X=e=>({url:X.url(e),method:"get"});X.definition={methods:["get","head"],url:"/settings/profile"};X.url=e=>X.definition.url+Mt(e);X.get=e=>({url:X.url(e),method:"get"});X.head=e=>({url:X.url(e),method:"head"});const Vt=e=>({action:X.url(e),method:"get"});Vt.get=e=>({action:X.url(e),method:"get"});Vt.head=e=>({action:X.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"HEAD",...e?.query??e?.mergeQuery??{}}}),method:"get"});X.form=Vt;const ie=e=>({url:ie.url(e),method:"patch"});ie.definition={methods:["patch"],url:"/settings/profile"};ie.url=e=>ie.definition.url+Mt(e);ie.patch=e=>({url:ie.url(e),method:"patch"});const oo=e=>({action:ie.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"PATCH",...e?.query??e?.mergeQuery??{}}}),method:"post"});oo.patch=e=>({action:ie.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"PATCH",...e?.query??e?.mergeQuery??{}}}),method:"post"});ie.form=oo;const le=e=>({url:le.url(e),method:"delete"});le.definition={methods:["delete"],url:"/settings/profile"};le.url=e=>le.definition.url+Mt(e);le.delete=e=>({url:le.url(e),method:"delete"});const ao=e=>({action:le.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"DELETE",...e?.query??e?.mergeQuery??{}}}),method:"post"});ao.delete=e=>({action:le.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"DELETE",...e?.query??e?.mergeQuery??{}}}),method:"post"});le.form=ao;Object.assign(X,X),Object.assign(ie,ie),Object.assign(le,le);const Pl={class:"flex items-center gap-2 px-1 py-1.5 text-left text-sm"},Bl=h({__name:"UserMenuContent",props:{user:{}},setup(e){const t=()=>{Co.flushAll()};return(n,o)=>(v(),R(_e,null,[O(r(Dl),{class:"p-0 font-normal"},{default:m(()=>[V("div",Pl,[O(no,{user:e.user,"show-email":!0},null,8,["user"])])]),_:1}),O(r(pn)),O(r(ql),null,{default:m(()=>[O(r(fn),{"as-child":!0},{default:m(()=>[O(r(He),{class:"block w-full",href:r(X)(),prefetch:"",as:"button"},{default:m(()=>[O(r(Mi),{class:"mr-2 h-4 w-4"}),o[0]||(o[0]=pe(" Settings ",-1))]),_:1},8,["href"])]),_:1})]),_:1}),O(r(pn)),O(r(fn),{"as-child":!0},{default:m(()=>[O(r(He),{class:"block w-full",href:r(Ro)(),onClick:t,as:"button","data-test":"logout-button"},{default:m(()=>[O(r(Ei),{class:"mr-2 h-4 w-4"}),o[1]||(o[1]=pe(" Log out ",-1))]),_:1},8,["href"])]),_:1})],64))}}),Al=h({__name:"NavUser",setup(e){const n=Et().props.auth.user,{isMobile:o,state:a}=ft();return(s,i)=>(v(),b(r(pt),null,{default:m(()=>[O(r(vt),null,{default:m(()=>[O(r(Cl),null,{default:m(()=>[O(r(Sl),{"as-child":""},{default:m(()=>[O(r(mt),{size:"lg",class:"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground","data-test":"sidebar-menu-button"},{default:m(()=>[O(no,{user:r(n)},null,8,["user"]),O(r(Si),{class:"ml-auto size-4"})]),_:1})]),_:1}),O(r(Ol),{class:"w-(--reka-dropdown-menu-trigger-width) min-w-56 rounded-lg",side:r(o)?"bottom":r(a)==="collapsed"?"left":"bottom",align:"end","side-offset":4},{default:m(()=>[O(Bl,{user:r(n)},null,8,["user"])]),_:1},8,["side"])]),_:1})]),_:1})]),_:1}))}}),El={class:"flex aspect-square size-8 items-center justify-center rounded-md bg-sidebar-primary text-sidebar-primary-foreground"},kl=h({__name:"AppLogo",setup(e){return(t,n)=>(v(),R(_e,null,[V("div",El,[O(co,{class:"size-5 fill-current text-white dark:text-black"})]),n[0]||(n[0]=V("div",{class:"ml-1 grid flex-1 text-left text-sm"},[V("span",{class:"mb-0.5 truncate leading-tight font-semibold"},"P.I.M.S.")],-1))],64))}}),Ml=h({__name:"AppSidebar",setup(e){const t=[{title:"Dashboard",href:Ut(),icon:Ai},{title:"Movies",href:"/admin/movies",icon:Pi}],n=[{title:"Github Repo",href:"https://github.com/laravel/vue-starter-kit",icon:Bi},{title:"Documentation",href:"https://laravel.com/docs/starter-kits#vue",icon:qi}];return(o,a)=>(v(),R(_e,null,[O(r(Yi),{collapsible:"icon",variant:"inset"},{default:m(()=>[O(r(tl),null,{default:m(()=>[O(r(pt),null,{default:m(()=>[O(r(vt),null,{default:m(()=>[O(r(mt),{size:"lg","as-child":""},{default:m(()=>[O(r(He),{href:r(Ut)()},{default:m(()=>[O(kl)]),_:1},8,["href"])]),_:1})]),_:1})]),_:1})]),_:1}),O(r(Qi),null,{default:m(()=>[O(ml,{items:t})]),_:1}),O(r(Zi),null,{default:m(()=>[O(pl,{items:n}),O(Al)]),_:1})]),_:1}),_(o.$slots,"default")],64))}}),$l=h({__name:"Breadcrumb",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("nav",{"aria-label":"breadcrumb","data-slot":"breadcrumb",class:z(t.class)},[_(n.$slots,"default")],2))}}),Tl=h({__name:"BreadcrumbItem",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("li",{"data-slot":"breadcrumb-item",class:z(r(F)("inline-flex items-center gap-1.5",t.class))},[_(n.$slots,"default")],2))}}),Rl=h({__name:"BreadcrumbLink",props:{asChild:{type:Boolean},as:{default:"a"},class:{}},setup(e){const t=e;return(n,o)=>(v(),b(r(W),{"data-slot":"breadcrumb-link",as:e.as,"as-child":e.asChild,class:z(r(F)("hover:text-foreground transition-colors",t.class))},{default:m(()=>[_(n.$slots,"default")]),_:3},8,["as","as-child","class"]))}}),Fl=h({__name:"BreadcrumbList",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("ol",{"data-slot":"breadcrumb-list",class:z(r(F)("text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5",t.class))},[_(n.$slots,"default")],2))}}),Ll=h({__name:"BreadcrumbPage",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("span",{"data-slot":"breadcrumb-page",role:"link","aria-disabled":"true","aria-current":"page",class:z(r(F)("text-foreground font-normal",t.class))},[_(n.$slots,"default")],2))}}),Il=h({__name:"BreadcrumbSeparator",props:{class:{}},setup(e){const t=e;return(n,o)=>(v(),R("li",{"data-slot":"breadcrumb-separator",role:"presentation","aria-hidden":"true",class:z(r(F)("[&>svg]:size-3.5",t.class))},[_(n.$slots,"default",{},()=>[O(r(Di))])],2))}}),Nl=h({__name:"Breadcrumbs",props:{breadcrumbs:{}},setup(e){return(t,n)=>(v(),b(r($l),null,{default:m(()=>[O(r(Fl),null,{default:m(()=>[(v(!0),R(_e,null,kt(e.breadcrumbs,(o,a)=>(v(),R(_e,{key:a},[O(r(Tl),null,{default:m(()=>[a===e.breadcrumbs.length-1?(v(),b(r(Ll),{key:0},{default:m(()=>[pe(he(o.title),1)]),_:2},1024)):(v(),b(r(Rl),{key:1,"as-child":""},{default:m(()=>[O(r(He),{href:o.href??"#"},{default:m(()=>[pe(he(o.title),1)]),_:2},1032,["href"])]),_:2},1024))]),_:2},1024),a!==e.breadcrumbs.length-1?(v(),b(r(Il),{key:0})):Pe("",!0)],64))),128))]),_:1})]),_:1}))}}),zl={class:"flex h-16 shrink-0 items-center gap-2 border-b border-sidebar-border/70 px-6 transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12 md:px-4"},Hl={class:"flex items-center gap-2"},Wl=h({__name:"AppSidebarHeader",props:{breadcrumbs:{default:()=>[]}},setup(e){return(t,n)=>(v(),R("header",zl,[V("div",Hl,[O(r(il),{class:"-ml-1"}),e.breadcrumbs&&e.breadcrumbs.length>0?(v(),b(Nl,{key:0,breadcrumbs:e.breadcrumbs},null,8,["breadcrumbs"])):Pe("",!0)])]))}}),Kl=h({__name:"AppSidebarLayout",props:{breadcrumbs:{default:()=>[]}},setup(e){return(t,n)=>(v(),b(cl,{variant:"sidebar"},{default:m(()=>[O(Ml),O(ul,{variant:"sidebar",class:"overflow-x-hidden"},{default:m(()=>[O(Wl,{breadcrumbs:e.breadcrumbs},null,8,["breadcrumbs"]),_(t.$slots,"default")]),_:3})]),_:3}))}}),Jl=h({__name:"AppLayout",props:{breadcrumbs:{default:()=>[]}},setup(e){return(t,n)=>(v(),b(Kl,{breadcrumbs:e.breadcrumbs},{default:m(()=>[_(t.$slots,"default")]),_:3},8,["breadcrumbs"]))}});export{ia as D,$i as X,Jl as _,ra as a,Ia as b,Ha as c,Ma as d,X as e,Ta as f,Ka as g,xe as i}; diff --git a/public/build/assets/AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js b/public/build/assets/AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js new file mode 100644 index 0000000..31f675b --- /dev/null +++ b/public/build/assets/AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js @@ -0,0 +1 @@ +import{F as _e,d as D,a1 as Be,B as ze,aj as Oe,a6 as re,k as Fe,u as oe,K as $e,w as We,G as Ze,o as Ce,a as Ue,b as qe}from"./app-CClrM5Yi.js";function Se(e){var t,r,o="";if(typeof e=="string"||typeof e=="number")o+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;ttypeof e=="boolean"?`${e}`:e===0?"0":e,ve=Ae,Ke=(e,t)=>r=>{var o;if(t?.variants==null)return ve(e,r?.class,r?.className);const{variants:a,defaultVariants:i}=t,c=Object.keys(a).map(f=>{const g=r?.[f],x=i?.[f];if(g===null)return null;const z=he(g)||he(x);return a[f][z]}),p=r&&Object.entries(r).reduce((f,g)=>{let[x,z]=g;return z===void 0||(f[x]=z),f},{}),m=t==null||(o=t.compoundVariants)===null||o===void 0?void 0:o.reduce((f,g)=>{let{class:x,className:z,...I}=g;return Object.entries(I).every(y=>{let[w,C]=y;return Array.isArray(C)?C.includes({...i,...p}[w]):{...i,...p}[w]===C})?[...f,x,z]:f},[]);return ve(e,c,m,r?.class,r?.className)},le="-",He=e=>{const t=Xe(e),{conflictingClassGroups:r,conflictingClassGroupModifiers:o}=e;return{getClassGroupId:c=>{const p=c.split(le);return p[0]===""&&p.length!==1&&p.shift(),Me(p,t)||Je(c)},getConflictingClassGroupIds:(c,p)=>{const m=r[c]||[];return p&&o[c]?[...m,...o[c]]:m}}},Me=(e,t)=>{if(e.length===0)return t.classGroupId;const r=e[0],o=t.nextPart.get(r),a=o?Me(e.slice(1),o):void 0;if(a)return a;if(t.validators.length===0)return;const i=e.join(le);return t.validators.find(({validator:c})=>c(i))?.classGroupId},xe=/^\[(.+)\]$/,Je=e=>{if(xe.test(e)){const t=xe.exec(e)[1],r=t?.substring(0,t.indexOf(":"));if(r)return"arbitrary.."+r}},Xe=e=>{const{theme:t,classGroups:r}=e,o={nextPart:new Map,validators:[]};for(const a in r)ne(r[a],o,a,t);return o},ne=(e,t,r,o)=>{e.forEach(a=>{if(typeof a=="string"){const i=a===""?t:ye(t,a);i.classGroupId=r;return}if(typeof a=="function"){if(De(a)){ne(a(o),t,r,o);return}t.validators.push({validator:a,classGroupId:r});return}Object.entries(a).forEach(([i,c])=>{ne(c,ye(t,i),r,o)})})},ye=(e,t)=>{let r=e;return t.split(le).forEach(o=>{r.nextPart.has(o)||r.nextPart.set(o,{nextPart:new Map,validators:[]}),r=r.nextPart.get(o)}),r},De=e=>e.isThemeGetter,Qe=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,r=new Map,o=new Map;const a=(i,c)=>{r.set(i,c),t++,t>e&&(t=0,o=r,r=new Map)};return{get(i){let c=r.get(i);if(c!==void 0)return c;if((c=o.get(i))!==void 0)return a(i,c),c},set(i,c){r.has(i)?r.set(i,c):a(i,c)}}},ae="!",ie=":",Ye=ie.length,er=e=>{const{prefix:t,experimentalParseClassName:r}=e;let o=a=>{const i=[];let c=0,p=0,m=0,f;for(let y=0;ym?f-m:void 0;return{modifiers:i,hasImportantModifier:z,baseClassName:x,maybePostfixModifierPosition:I}};if(t){const a=t+ie,i=o;o=c=>c.startsWith(a)?i(c.substring(a.length)):{isExternal:!0,modifiers:[],hasImportantModifier:!1,baseClassName:c,maybePostfixModifierPosition:void 0}}if(r){const a=o;o=i=>r({className:i,parseClassName:a})}return o},rr=e=>e.endsWith(ae)?e.substring(0,e.length-1):e.startsWith(ae)?e.substring(1):e,or=e=>{const t=Object.fromEntries(e.orderSensitiveModifiers.map(o=>[o,!0]));return o=>{if(o.length<=1)return o;const a=[];let i=[];return o.forEach(c=>{c[0]==="["||t[c]?(a.push(...i.sort(),c),i=[]):i.push(c)}),a.push(...i.sort()),a}},tr=e=>({cache:Qe(e.cacheSize),parseClassName:er(e),sortModifiers:or(e),...He(e)}),sr=/\s+/,nr=(e,t)=>{const{parseClassName:r,getClassGroupId:o,getConflictingClassGroupIds:a,sortModifiers:i}=t,c=[],p=e.trim().split(sr);let m="";for(let f=p.length-1;f>=0;f-=1){const g=p[f],{isExternal:x,modifiers:z,hasImportantModifier:I,baseClassName:y,maybePostfixModifierPosition:w}=r(g);if(x){m=g+(m.length>0?" "+m:m);continue}let C=!!w,G=o(C?y.substring(0,w):y);if(!G){if(!C){m=g+(m.length>0?" "+m:m);continue}if(G=o(y),!G){m=g+(m.length>0?" "+m:m);continue}C=!1}const W=i(z).join(":"),O=I?W+ae:W,T=O+G;if(c.includes(T))continue;c.push(T);const E=a(G,C);for(let R=0;R0?" "+m:m)}return m};function ar(){let e=0,t,r,o="";for(;e{if(typeof e=="string")return e;let t,r="";for(let o=0;ox(g),e());return r=tr(f),o=r.cache.get,a=r.cache.set,i=p,p(m)}function p(m){const f=o(m);if(f)return f;const g=nr(m,r);return a(m,g),g}return function(){return i(ar.apply(null,arguments))}}const b=e=>{const t=r=>r[e]||[];return t.isThemeGetter=!0,t},Ie=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,Ge=/^\((?:(\w[\w-]*):)?(.+)\)$/i,lr=/^\d+\/\d+$/,cr=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,dr=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,mr=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,ur=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,pr=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,j=e=>lr.test(e),u=e=>!!e&&!Number.isNaN(Number(e)),P=e=>!!e&&Number.isInteger(Number(e)),te=e=>e.endsWith("%")&&u(e.slice(0,-1)),M=e=>cr.test(e),fr=()=>!0,gr=e=>dr.test(e)&&!mr.test(e),Re=()=>!1,br=e=>ur.test(e),hr=e=>pr.test(e),vr=e=>!s(e)&&!n(e),xr=e=>_(e,Te,Re),s=e=>Ie.test(e),N=e=>_(e,Ee,gr),se=e=>_(e,Cr,u),we=e=>_(e,Ve,Re),yr=e=>_(e,Ne,hr),J=e=>_(e,Le,br),n=e=>Ge.test(e),$=e=>B(e,Ee),wr=e=>B(e,Sr),ke=e=>B(e,Ve),kr=e=>B(e,Te),zr=e=>B(e,Ne),X=e=>B(e,Le,!0),_=(e,t,r)=>{const o=Ie.exec(e);return o?o[1]?t(o[1]):r(o[2]):!1},B=(e,t,r=!1)=>{const o=Ge.exec(e);return o?o[1]?t(o[1]):r:!1},Ve=e=>e==="position"||e==="percentage",Ne=e=>e==="image"||e==="url",Te=e=>e==="length"||e==="size"||e==="bg-size",Ee=e=>e==="length",Cr=e=>e==="number",Sr=e=>e==="family-name",Le=e=>e==="shadow",Ar=()=>{const e=b("color"),t=b("font"),r=b("text"),o=b("font-weight"),a=b("tracking"),i=b("leading"),c=b("breakpoint"),p=b("container"),m=b("spacing"),f=b("radius"),g=b("shadow"),x=b("inset-shadow"),z=b("text-shadow"),I=b("drop-shadow"),y=b("blur"),w=b("perspective"),C=b("aspect"),G=b("ease"),W=b("animate"),O=()=>["auto","avoid","all","avoid-page","page","left","right","column"],T=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],E=()=>[...T(),n,s],R=()=>["auto","hidden","clip","visible","scroll"],F=()=>["auto","contain","none"],d=()=>[n,s,m],S=()=>[j,"full","auto",...d()],ce=()=>[P,"none","subgrid",n,s],de=()=>["auto",{span:["full",P,n,s]},P,n,s],Z=()=>[P,"auto",n,s],me=()=>["auto","min","max","fr",n,s],Q=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],L=()=>["start","end","center","stretch","center-safe","end-safe"],A=()=>["auto",...d()],V=()=>[j,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...d()],l=()=>[e,n,s],ue=()=>[...T(),ke,we,{position:[n,s]}],pe=()=>["no-repeat",{repeat:["","x","y","space","round"]}],fe=()=>["auto","cover","contain",kr,xr,{size:[n,s]}],Y=()=>[te,$,N],v=()=>["","none","full",f,n,s],k=()=>["",u,$,N],U=()=>["solid","dashed","dotted","double"],ge=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],h=()=>[u,te,ke,we],be=()=>["","none",y,n,s],q=()=>["none",u,n,s],K=()=>["none",u,n,s],ee=()=>[u,n,s],H=()=>[j,"full",...d()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[M],breakpoint:[M],color:[fr],container:[M],"drop-shadow":[M],ease:["in","out","in-out"],font:[vr],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[M],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[M],shadow:[M],spacing:["px",u],text:[M],"text-shadow":[M],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",j,s,n,C]}],container:["container"],columns:[{columns:[u,s,n,p]}],"break-after":[{"break-after":O()}],"break-before":[{"break-before":O()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:E()}],overflow:[{overflow:R()}],"overflow-x":[{"overflow-x":R()}],"overflow-y":[{"overflow-y":R()}],overscroll:[{overscroll:F()}],"overscroll-x":[{"overscroll-x":F()}],"overscroll-y":[{"overscroll-y":F()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:S()}],"inset-x":[{"inset-x":S()}],"inset-y":[{"inset-y":S()}],start:[{start:S()}],end:[{end:S()}],top:[{top:S()}],right:[{right:S()}],bottom:[{bottom:S()}],left:[{left:S()}],visibility:["visible","invisible","collapse"],z:[{z:[P,"auto",n,s]}],basis:[{basis:[j,"full","auto",p,...d()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[u,j,"auto","initial","none",s]}],grow:[{grow:["",u,n,s]}],shrink:[{shrink:["",u,n,s]}],order:[{order:[P,"first","last","none",n,s]}],"grid-cols":[{"grid-cols":ce()}],"col-start-end":[{col:de()}],"col-start":[{"col-start":Z()}],"col-end":[{"col-end":Z()}],"grid-rows":[{"grid-rows":ce()}],"row-start-end":[{row:de()}],"row-start":[{"row-start":Z()}],"row-end":[{"row-end":Z()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":me()}],"auto-rows":[{"auto-rows":me()}],gap:[{gap:d()}],"gap-x":[{"gap-x":d()}],"gap-y":[{"gap-y":d()}],"justify-content":[{justify:[...Q(),"normal"]}],"justify-items":[{"justify-items":[...L(),"normal"]}],"justify-self":[{"justify-self":["auto",...L()]}],"align-content":[{content:["normal",...Q()]}],"align-items":[{items:[...L(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...L(),{baseline:["","last"]}]}],"place-content":[{"place-content":Q()}],"place-items":[{"place-items":[...L(),"baseline"]}],"place-self":[{"place-self":["auto",...L()]}],p:[{p:d()}],px:[{px:d()}],py:[{py:d()}],ps:[{ps:d()}],pe:[{pe:d()}],pt:[{pt:d()}],pr:[{pr:d()}],pb:[{pb:d()}],pl:[{pl:d()}],m:[{m:A()}],mx:[{mx:A()}],my:[{my:A()}],ms:[{ms:A()}],me:[{me:A()}],mt:[{mt:A()}],mr:[{mr:A()}],mb:[{mb:A()}],ml:[{ml:A()}],"space-x":[{"space-x":d()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":d()}],"space-y-reverse":["space-y-reverse"],size:[{size:V()}],w:[{w:[p,"screen",...V()]}],"min-w":[{"min-w":[p,"screen","none",...V()]}],"max-w":[{"max-w":[p,"screen","none","prose",{screen:[c]},...V()]}],h:[{h:["screen","lh",...V()]}],"min-h":[{"min-h":["screen","lh","none",...V()]}],"max-h":[{"max-h":["screen","lh",...V()]}],"font-size":[{text:["base",r,$,N]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[o,n,se]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",te,s]}],"font-family":[{font:[wr,s,t]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[a,n,s]}],"line-clamp":[{"line-clamp":[u,"none",n,se]}],leading:[{leading:[i,...d()]}],"list-image":[{"list-image":["none",n,s]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",n,s]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:l()}],"text-color":[{text:l()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...U(),"wavy"]}],"text-decoration-thickness":[{decoration:[u,"from-font","auto",n,N]}],"text-decoration-color":[{decoration:l()}],"underline-offset":[{"underline-offset":[u,"auto",n,s]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:d()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",n,s]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",n,s]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:ue()}],"bg-repeat":[{bg:pe()}],"bg-size":[{bg:fe()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},P,n,s],radial:["",n,s],conic:[P,n,s]},zr,yr]}],"bg-color":[{bg:l()}],"gradient-from-pos":[{from:Y()}],"gradient-via-pos":[{via:Y()}],"gradient-to-pos":[{to:Y()}],"gradient-from":[{from:l()}],"gradient-via":[{via:l()}],"gradient-to":[{to:l()}],rounded:[{rounded:v()}],"rounded-s":[{"rounded-s":v()}],"rounded-e":[{"rounded-e":v()}],"rounded-t":[{"rounded-t":v()}],"rounded-r":[{"rounded-r":v()}],"rounded-b":[{"rounded-b":v()}],"rounded-l":[{"rounded-l":v()}],"rounded-ss":[{"rounded-ss":v()}],"rounded-se":[{"rounded-se":v()}],"rounded-ee":[{"rounded-ee":v()}],"rounded-es":[{"rounded-es":v()}],"rounded-tl":[{"rounded-tl":v()}],"rounded-tr":[{"rounded-tr":v()}],"rounded-br":[{"rounded-br":v()}],"rounded-bl":[{"rounded-bl":v()}],"border-w":[{border:k()}],"border-w-x":[{"border-x":k()}],"border-w-y":[{"border-y":k()}],"border-w-s":[{"border-s":k()}],"border-w-e":[{"border-e":k()}],"border-w-t":[{"border-t":k()}],"border-w-r":[{"border-r":k()}],"border-w-b":[{"border-b":k()}],"border-w-l":[{"border-l":k()}],"divide-x":[{"divide-x":k()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":k()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...U(),"hidden","none"]}],"divide-style":[{divide:[...U(),"hidden","none"]}],"border-color":[{border:l()}],"border-color-x":[{"border-x":l()}],"border-color-y":[{"border-y":l()}],"border-color-s":[{"border-s":l()}],"border-color-e":[{"border-e":l()}],"border-color-t":[{"border-t":l()}],"border-color-r":[{"border-r":l()}],"border-color-b":[{"border-b":l()}],"border-color-l":[{"border-l":l()}],"divide-color":[{divide:l()}],"outline-style":[{outline:[...U(),"none","hidden"]}],"outline-offset":[{"outline-offset":[u,n,s]}],"outline-w":[{outline:["",u,$,N]}],"outline-color":[{outline:l()}],shadow:[{shadow:["","none",g,X,J]}],"shadow-color":[{shadow:l()}],"inset-shadow":[{"inset-shadow":["none",x,X,J]}],"inset-shadow-color":[{"inset-shadow":l()}],"ring-w":[{ring:k()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:l()}],"ring-offset-w":[{"ring-offset":[u,N]}],"ring-offset-color":[{"ring-offset":l()}],"inset-ring-w":[{"inset-ring":k()}],"inset-ring-color":[{"inset-ring":l()}],"text-shadow":[{"text-shadow":["none",z,X,J]}],"text-shadow-color":[{"text-shadow":l()}],opacity:[{opacity:[u,n,s]}],"mix-blend":[{"mix-blend":[...ge(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":ge()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[u]}],"mask-image-linear-from-pos":[{"mask-linear-from":h()}],"mask-image-linear-to-pos":[{"mask-linear-to":h()}],"mask-image-linear-from-color":[{"mask-linear-from":l()}],"mask-image-linear-to-color":[{"mask-linear-to":l()}],"mask-image-t-from-pos":[{"mask-t-from":h()}],"mask-image-t-to-pos":[{"mask-t-to":h()}],"mask-image-t-from-color":[{"mask-t-from":l()}],"mask-image-t-to-color":[{"mask-t-to":l()}],"mask-image-r-from-pos":[{"mask-r-from":h()}],"mask-image-r-to-pos":[{"mask-r-to":h()}],"mask-image-r-from-color":[{"mask-r-from":l()}],"mask-image-r-to-color":[{"mask-r-to":l()}],"mask-image-b-from-pos":[{"mask-b-from":h()}],"mask-image-b-to-pos":[{"mask-b-to":h()}],"mask-image-b-from-color":[{"mask-b-from":l()}],"mask-image-b-to-color":[{"mask-b-to":l()}],"mask-image-l-from-pos":[{"mask-l-from":h()}],"mask-image-l-to-pos":[{"mask-l-to":h()}],"mask-image-l-from-color":[{"mask-l-from":l()}],"mask-image-l-to-color":[{"mask-l-to":l()}],"mask-image-x-from-pos":[{"mask-x-from":h()}],"mask-image-x-to-pos":[{"mask-x-to":h()}],"mask-image-x-from-color":[{"mask-x-from":l()}],"mask-image-x-to-color":[{"mask-x-to":l()}],"mask-image-y-from-pos":[{"mask-y-from":h()}],"mask-image-y-to-pos":[{"mask-y-to":h()}],"mask-image-y-from-color":[{"mask-y-from":l()}],"mask-image-y-to-color":[{"mask-y-to":l()}],"mask-image-radial":[{"mask-radial":[n,s]}],"mask-image-radial-from-pos":[{"mask-radial-from":h()}],"mask-image-radial-to-pos":[{"mask-radial-to":h()}],"mask-image-radial-from-color":[{"mask-radial-from":l()}],"mask-image-radial-to-color":[{"mask-radial-to":l()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":T()}],"mask-image-conic-pos":[{"mask-conic":[u]}],"mask-image-conic-from-pos":[{"mask-conic-from":h()}],"mask-image-conic-to-pos":[{"mask-conic-to":h()}],"mask-image-conic-from-color":[{"mask-conic-from":l()}],"mask-image-conic-to-color":[{"mask-conic-to":l()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:ue()}],"mask-repeat":[{mask:pe()}],"mask-size":[{mask:fe()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",n,s]}],filter:[{filter:["","none",n,s]}],blur:[{blur:be()}],brightness:[{brightness:[u,n,s]}],contrast:[{contrast:[u,n,s]}],"drop-shadow":[{"drop-shadow":["","none",I,X,J]}],"drop-shadow-color":[{"drop-shadow":l()}],grayscale:[{grayscale:["",u,n,s]}],"hue-rotate":[{"hue-rotate":[u,n,s]}],invert:[{invert:["",u,n,s]}],saturate:[{saturate:[u,n,s]}],sepia:[{sepia:["",u,n,s]}],"backdrop-filter":[{"backdrop-filter":["","none",n,s]}],"backdrop-blur":[{"backdrop-blur":be()}],"backdrop-brightness":[{"backdrop-brightness":[u,n,s]}],"backdrop-contrast":[{"backdrop-contrast":[u,n,s]}],"backdrop-grayscale":[{"backdrop-grayscale":["",u,n,s]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[u,n,s]}],"backdrop-invert":[{"backdrop-invert":["",u,n,s]}],"backdrop-opacity":[{"backdrop-opacity":[u,n,s]}],"backdrop-saturate":[{"backdrop-saturate":[u,n,s]}],"backdrop-sepia":[{"backdrop-sepia":["",u,n,s]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":d()}],"border-spacing-x":[{"border-spacing-x":d()}],"border-spacing-y":[{"border-spacing-y":d()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",n,s]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[u,"initial",n,s]}],ease:[{ease:["linear","initial",G,n,s]}],delay:[{delay:[u,n,s]}],animate:[{animate:["none",W,n,s]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[w,n,s]}],"perspective-origin":[{"perspective-origin":E()}],rotate:[{rotate:q()}],"rotate-x":[{"rotate-x":q()}],"rotate-y":[{"rotate-y":q()}],"rotate-z":[{"rotate-z":q()}],scale:[{scale:K()}],"scale-x":[{"scale-x":K()}],"scale-y":[{"scale-y":K()}],"scale-z":[{"scale-z":K()}],"scale-3d":["scale-3d"],skew:[{skew:ee()}],"skew-x":[{"skew-x":ee()}],"skew-y":[{"skew-y":ee()}],transform:[{transform:[n,s,"","none","gpu","cpu"]}],"transform-origin":[{origin:E()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:H()}],"translate-x":[{"translate-x":H()}],"translate-y":[{"translate-y":H()}],"translate-z":[{"translate-z":H()}],"translate-none":["translate-none"],accent:[{accent:l()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:l()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",n,s]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":d()}],"scroll-mx":[{"scroll-mx":d()}],"scroll-my":[{"scroll-my":d()}],"scroll-ms":[{"scroll-ms":d()}],"scroll-me":[{"scroll-me":d()}],"scroll-mt":[{"scroll-mt":d()}],"scroll-mr":[{"scroll-mr":d()}],"scroll-mb":[{"scroll-mb":d()}],"scroll-ml":[{"scroll-ml":d()}],"scroll-p":[{"scroll-p":d()}],"scroll-px":[{"scroll-px":d()}],"scroll-py":[{"scroll-py":d()}],"scroll-ps":[{"scroll-ps":d()}],"scroll-pe":[{"scroll-pe":d()}],"scroll-pt":[{"scroll-pt":d()}],"scroll-pr":[{"scroll-pr":d()}],"scroll-pb":[{"scroll-pb":d()}],"scroll-pl":[{"scroll-pl":d()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",n,s]}],fill:[{fill:["none",...l()]}],"stroke-w":[{stroke:[u,$,N,se]}],stroke:[{stroke:["none",...l()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},Mr=ir(Ar);function Pr(...e){return Mr(Ae(e))}function Er(e,t){return Ir(e)===t}function Ir(e){return typeof e=="string"?e:e?.url}function je(e){return e?e.flatMap(t=>t.type===_e?je(t.children):[t]):[]}const Gr=D({name:"PrimitiveSlot",inheritAttrs:!1,setup(e,{attrs:t,slots:r}){return()=>{if(!r.default)return null;const o=je(r.default()),a=o.findIndex(m=>m.type!==Be);if(a===-1)return o;const i=o[a];delete i.props?.ref;const c=i.props?ze(t,i.props):t,p=Oe({...i,props:{}},c);return o.length===1?p:(o[a]=p,o)}}}),Rr=["area","img","input"],Vr=D({name:"Primitive",inheritAttrs:!1,props:{asChild:{type:Boolean,default:!1},as:{type:[String,Object],default:"div"}},setup(e,{attrs:t,slots:r}){const o=e.asChild?"template":e.as;return typeof o=="string"&&Rr.includes(o)?()=>re(o,t):o!=="template"?()=>re(e.as,t,{default:r.default}):()=>re(Gr,t,{default:r.default})}}),Lr=D({__name:"Button",props:{variant:{},size:{},class:{},asChild:{type:Boolean},as:{default:"button"}},setup(e){const t=e;return(r,o)=>(Ce(),Fe(oe(Vr),{"data-slot":"button",as:e.as,"as-child":e.asChild,class:$e(oe(Pr)(oe(Nr)({variant:e.variant,size:e.size}),t.class))},{default:We(()=>[Ze(r.$slots,"default")]),_:3},8,["as","as-child","class"]))}}),Nr=Ke("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}}),jr=D({inheritAttrs:!1,__name:"AppLogoIcon",props:{className:{}},setup(e){return(t,r)=>(Ce(),Ue("svg",ze({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 40 42",class:e.className},t.$attrs),[...r[0]||(r[0]=[qe("path",{fill:"currentColor","fill-rule":"evenodd","clip-rule":"evenodd",d:"M17.2 5.633 8.6.855 0 5.633v26.51l16.2 9 16.2-9v-8.442l7.6-4.223V9.856l-8.6-4.777-8.6 4.777V18.3l-5.6 3.111V5.633ZM38 18.301l-5.6 3.11v-6.157l5.6-3.11V18.3Zm-1.06-7.856-5.54 3.078-5.54-3.079 5.54-3.078 5.54 3.079ZM24.8 18.3v-6.157l5.6 3.111v6.158L24.8 18.3Zm-1 1.732 5.54 3.078-13.14 7.302-5.54-3.078 13.14-7.3v-.002Zm-16.2 7.89 7.6 4.222V38.3L2 30.966V7.92l5.6 3.111v16.892ZM8.6 9.3 3.06 6.222 8.6 3.143l5.54 3.08L8.6 9.3Zm21.8 15.51-13.2 7.334V38.3l13.2-7.334v-6.156ZM9.6 11.034l5.6-3.11v14.6l-5.6 3.11v-14.6Z"},null,-1)])],16))}});export{Vr as P,Gr as S,Lr as _,jr as a,Ke as b,Pr as c,je as r,Ir as t,Er as u}; diff --git a/public/build/assets/Appearance-x5-Kktlh.js b/public/build/assets/Appearance-x5-Kktlh.js new file mode 100644 index 0000000..26c4f88 --- /dev/null +++ b/public/build/assets/Appearance-x5-Kktlh.js @@ -0,0 +1 @@ +import{d as m,J as k,a as i,F as y,g as x,b as n,k as d,I as f,t as g,K as b,u as r,o as t,w as l,f as e,h as v}from"./app-CClrM5Yi.js";import{c as o}from"./createLucideIcon-ZFd4jktC.js";import{e as I,_ as M,a as w}from"./Layout.vue_vue_type_script_setup_true_lang-ROf3tZlv.js";import{_ as A}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./index-C4J_hXM0.js";import"./index--H2rh_A_.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";const C=o("MonitorIcon",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]);const $=o("MoonIcon",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]]);const B=o("SunIcon",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]),S={class:"inline-flex gap-1 rounded-lg bg-neutral-100 p-1 dark:bg-neutral-800"},z=["onClick"],D={class:"ml-1.5 text-sm"},L=m({__name:"AppearanceTabs",setup(u){const{appearance:a,updateAppearance:c}=k(),p=[{value:"light",Icon:B,label:"Light"},{value:"dark",Icon:$,label:"Dark"},{value:"system",Icon:C,label:"System"}];return(q,F)=>(t(),i("div",S,[(t(),i(y,null,x(p,({value:s,Icon:h,label:_})=>n("button",{key:s,onClick:N=>r(c)(s),class:b(["flex items-center rounded-md px-3.5 py-1.5 transition-colors",r(a)===s?"bg-white shadow-xs dark:bg-neutral-700 dark:text-neutral-100":"text-neutral-500 hover:bg-neutral-200/60 hover:text-black dark:text-neutral-400 dark:hover:bg-neutral-700/60"])},[(t(),d(f(h),{class:"-ml-1 h-4 w-4"})),n("span",D,g(_),1)],10,z)),64))]))}}),j={class:"space-y-6"},Q=m({__name:"Appearance",setup(u){const a=[{title:"Appearance settings",href:I().url}];return(c,p)=>(t(),d(A,{breadcrumbs:a},{default:l(()=>[e(r(v),{title:"Appearance settings"}),e(M,null,{default:l(()=>[n("div",j,[e(w,{title:"Appearance settings",description:"Update your account's appearance settings"}),e(L)])]),_:1})]),_:1}))}});export{Q as default}; diff --git a/public/build/assets/AuthLayout.vue_vue_type_script_setup_true_lang-B14CUTB5.js b/public/build/assets/AuthLayout.vue_vue_type_script_setup_true_lang-B14CUTB5.js new file mode 100644 index 0000000..d43b361 --- /dev/null +++ b/public/build/assets/AuthLayout.vue_vue_type_script_setup_true_lang-B14CUTB5.js @@ -0,0 +1 @@ +import{a as f}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{h as m}from"./index-C4J_hXM0.js";import{d as c,a as u,b as e,G as n,f as i,w as l,t as o,u as a,m as _,o as r,k as h}from"./app-CClrM5Yi.js";const p={class:"flex min-h-svh flex-col items-center justify-center gap-6 bg-background p-6 md:p-10"},x={class:"w-full max-w-sm"},g={class:"flex flex-col gap-8"},v={class:"flex flex-col items-center gap-4"},k={class:"mb-1 flex h-9 w-9 items-center justify-center rounded-md"},y={class:"sr-only"},w={class:"space-y-2 text-center"},b={class:"text-xl font-medium"},B={class:"text-center text-sm text-muted-foreground"},$=c({__name:"AuthSimpleLayout",props:{title:{},description:{}},setup(t){return(s,d)=>(r(),u("div",p,[e("div",x,[e("div",g,[e("div",v,[i(a(_),{href:a(m)(),class:"flex flex-col items-center gap-2 font-medium"},{default:l(()=>[e("div",k,[i(f,{class:"size-9 fill-current text-[var(--foreground)] dark:text-white"})]),e("span",y,o(t.title),1)]),_:1},8,["href"]),e("div",w,[e("h1",b,o(t.title),1),e("p",B,o(t.description),1)])]),n(s.$slots,"default")])])]))}}),C=c({__name:"AuthLayout",props:{title:{},description:{}},setup(t){return(s,d)=>(r(),h($,{title:t.title,description:t.description},{default:l(()=>[n(s.$slots,"default")]),_:3},8,["title","description"]))}});export{C as _}; diff --git a/public/build/assets/ConfirmPassword-wh4eUhzq.js b/public/build/assets/ConfirmPassword-wh4eUhzq.js new file mode 100644 index 0000000..b3647cb --- /dev/null +++ b/public/build/assets/ConfirmPassword-wh4eUhzq.js @@ -0,0 +1 @@ +import{_ as n}from"./InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js";import{_ as p}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{_}from"./Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js";import{_ as c}from"./Label.vue_vue_type_script_setup_true_lang-Dbqibcwo.js";import{_ as l}from"./Spinner.vue_vue_type_script_setup_true_lang-BPOcqWqa.js";import{_ as u}from"./AuthLayout.vue_vue_type_script_setup_true_lang-B14CUTB5.js";import{s as w}from"./index-BCC4ahRc.js";import{d as C,k as i,w as e,f as o,u as s,h as b,A as h,B as $,b as r,l as m,i as g,o as d}from"./app-CClrM5Yi.js";import"./useForwardExpose-BhawR5VU.js";import"./createLucideIcon-ZFd4jktC.js";import"./index-C4J_hXM0.js";const k={class:"space-y-6"},x={class:"grid gap-2"},y={class:"flex items-center"},G=C({__name:"ConfirmPassword",setup(P){return(B,a)=>(d(),i(u,{title:"Confirm your password",description:"This is a secure area of the application. Please confirm your password before continuing."},{default:e(()=>[o(s(b),{title:"Confirm password"}),o(s(h),$(s(w).form(),{"reset-on-success":""}),{default:e(({errors:f,processing:t})=>[r("div",k,[r("div",x,[o(s(c),{htmlFor:"password"},{default:e(()=>[...a[0]||(a[0]=[m("Password",-1)])]),_:1}),o(s(_),{id:"password",type:"password",name:"password",class:"mt-1 block w-full",required:"",autocomplete:"current-password",autofocus:""}),o(n,{message:f.password},null,8,["message"])]),r("div",y,[o(s(p),{class:"w-full",disabled:t,"data-test":"confirm-password-button"},{default:e(()=>[t?(d(),i(s(l),{key:0})):g("",!0),a[1]||(a[1]=m(" Confirm Password ",-1))]),_:2},1032,["disabled"])])])]),_:1},16)]),_:1}))}});export{G as default}; diff --git a/public/build/assets/Dashboard-BZ90YdF3.js b/public/build/assets/Dashboard-BZ90YdF3.js new file mode 100644 index 0000000..38be0ad --- /dev/null +++ b/public/build/assets/Dashboard-BZ90YdF3.js @@ -0,0 +1 @@ +import{_ as y}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{d as k}from"./index-C4J_hXM0.js";import{d as v,c as w,a as s,b as e,o as r,r as _,e as $,f as l,u as M,h as j,w as L,t as n,F as f,g as m,i as c}from"./app-CClrM5Yi.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./createLucideIcon-ZFd4jktC.js";const D={class:"absolute inset-0 size-full stroke-neutral-900/20 dark:stroke-neutral-100/20",fill:"none"},N=["id"],V=["fill"],p=v({__name:"PlaceholderPattern",setup(b){const u=w(()=>`pattern-${Math.random().toString(36).substring(2,9)}`);return(i,o)=>(r(),s("svg",D,[e("defs",null,[e("pattern",{id:u.value,x:"0",y:"0",width:"8",height:"8",patternUnits:"userSpaceOnUse"},[...o[0]||(o[0]=[e("path",{d:"M-1 5L5 -1M3 9L8.5 3.5","stroke-width":"0.5"},null,-1)])],8,N)]),e("rect",{stroke:"none",fill:`url(#${u.value})`,width:"100%",height:"100%"},null,8,V)]))}}),A={class:"flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4"},B={class:"grid auto-rows-min gap-4 md:grid-cols-3"},C={class:"relative overflow-hidden rounded-xl border border-sidebar-border/70 dark:border-sidebar-border"},F={class:"p-4"},P={key:0,class:"rounded-md border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200"},S={key:1},U={key:0,class:"space-y-3"},q=["aria-busy"],z=["href"],E={class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted"},R=["src","alt"],X={class:"flex min-w-0 flex-1 flex-col"},H={class:"flex items-center justify-between gap-2"},I={class:"truncate font-medium"},O={class:"text-xs text-muted-foreground"},W={class:"mt-1 text-xs text-muted-foreground"},G={key:0,class:"mr-2 rounded border px-1 py-0.5"},J={key:1},K={key:0,class:"px-2 py-2 text-sm text-muted-foreground"},Q={class:"relative aspect-video overflow-hidden rounded-xl border border-sidebar-border/70 dark:border-sidebar-border"},T={class:"relative aspect-video overflow-hidden rounded-xl border border-sidebar-border/70 dark:border-sidebar-border"},Y={class:"relative min-h-[100vh] flex-1 rounded-xl border border-sidebar-border/70 md:min-h-min dark:border-sidebar-border"},le=v({__name:"Dashboard",setup(b){const u=[{title:"Dashboard",href:k().url}],i=_(!1),o=_(null),h=_([]);async function x(){i.value=!0,o.value=null;try{const d=await fetch("/api/movies?sort=newest&per_page=3",{headers:{Accept:"application/json","X-Requested-With":"XMLHttpRequest"},credentials:"same-origin"});if(!d.ok)throw new Error(`Failed: ${d.status}`);const a=await d.json();h.value=a.data}catch(d){o.value=d?.message??"Unexpected error"}finally{i.value=!1}}return $(x),(d,a)=>(r(),s(f,null,[l(M(j),{title:"Dashboard"}),l(y,{breadcrumbs:u},{default:L(()=>[e("div",A,[e("div",B,[e("div",C,[e("div",F,[a[1]||(a[1]=e("div",{class:"mb-3 flex items-center justify-between gap-2"},[e("h2",{class:"text-sm font-semibold"},"Last Movies Added"),e("a",{href:"/movies",class:"text-xs text-primary underline-offset-2 hover:underline"},"View all")],-1)),o.value?(r(),s("div",P,n(o.value),1)):(r(),s("div",S,[i.value?(r(),s("div",U,[(r(),s(f,null,m(3,t=>e("div",{key:t,class:"flex gap-3"},[...a[0]||(a[0]=[e("div",{class:"h-20 w-14 shrink-0 rounded bg-muted animate-pulse"},null,-1),e("div",{class:"flex min-w-0 flex-1 flex-col gap-2"},[e("div",{class:"h-4 w-1/2 rounded bg-muted animate-pulse"}),e("div",{class:"h-3 w-2/3 rounded bg-muted animate-pulse"}),e("div",{class:"h-3 w-1/3 rounded bg-muted animate-pulse"})],-1)])])),64))])):(r(),s("ul",{key:1,class:"divide-y divide-muted-foreground/20","aria-busy":i.value?"true":"false"},[(r(!0),s(f,null,m(h.value,t=>(r(),s("li",{key:t.id,class:"py-2"},[e("a",{href:`/movies/${t.id}`,class:"flex gap-3 rounded px-2 py-2 hover:bg-muted/40 focus:bg-muted/40 focus:outline-none"},[e("div",E,[t.poster_url?(r(),s("img",{key:0,src:t.poster_url,alt:`Poster for ${t.title}`,loading:"lazy",class:"h-full w-full object-cover"},null,8,R)):c("",!0)]),e("div",X,[e("div",H,[e("div",I,n(t.title),1),e("div",O,n(t.year??""),1)]),e("div",W,[t.rating?(r(),s("span",G,n(t.rating),1)):c("",!0),t.genres?.length?(r(),s("span",J,n(t.genres.map(g=>g.name).join(", ")),1)):c("",!0)])])],8,z)]))),128)),h.value.length?c("",!0):(r(),s("li",K,"No movies yet — add some from Admin → Movies."))],8,q))]))])]),e("div",Q,[l(p)]),e("div",T,[l(p)])]),e("div",Y,[l(p)])])]),_:1})],64))}});export{le as default}; diff --git a/public/build/assets/DialogTitle.vue_vue_type_script_setup_true_lang-Dg2xd9QK.js b/public/build/assets/DialogTitle.vue_vue_type_script_setup_true_lang-Dg2xd9QK.js new file mode 100644 index 0000000..beeeca0 --- /dev/null +++ b/public/build/assets/DialogTitle.vue_vue_type_script_setup_true_lang-Dg2xd9QK.js @@ -0,0 +1 @@ +import{u as D,d as x}from"./VisuallyHidden-Cu70tzB6.js";import{a as h,b as B,c as b,d as w,D as v,X as C,f as P,g as $}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{d as r,k as p,u as e,B as u,w as d,G as c,o as i,c as m,f as _,b as k,a as z,K as O}from"./app-CClrM5Yi.js";import{c as f}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";const N=r({__name:"Dialog",props:{open:{type:Boolean},defaultOpen:{type:Boolean},modal:{type:Boolean}},emits:["update:open"],setup(s,{emit:a}){const t=D(s,a);return(n,y)=>(i(),p(e(h),u({"data-slot":"dialog"},e(t)),{default:d(()=>[c(n.$slots,"default")]),_:3},16))}}),F=r({__name:"DialogOverlay",props:{forceMount:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},setup(s){const a=s,o=m(()=>{const{class:l,...t}=a;return t});return(l,t)=>(i(),p(e(B),u({"data-slot":"dialog-overlay"},o.value,{class:e(f)("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80",a.class)}),{default:d(()=>[c(l.$slots,"default")]),_:3},16,["class"]))}}),T=r({__name:"DialogContent",props:{forceMount:{type:Boolean},disableOutsidePointerEvents:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(s,{emit:a}){const o=s,l=a,t=m(()=>{const{class:y,...g}=o;return g}),n=D(t,l);return(y,g)=>(i(),p(e(b),null,{default:d(()=>[_(F),_(e(w),u({"data-slot":"dialog-content"},e(n),{class:e(f)("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",o.class)}),{default:d(()=>[c(y.$slots,"default"),_(e(v),{class:"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"},{default:d(()=>[_(e(C)),g[0]||(g[0]=k("span",{class:"sr-only"},"Close",-1))]),_:1})]),_:3},16,["class"])]),_:3}))}}),V=r({__name:"DialogDescription",props:{asChild:{type:Boolean},as:{},class:{}},setup(s){const a=s,o=m(()=>{const{class:t,...n}=a;return n}),l=x(o);return(t,n)=>(i(),p(e(P),u({"data-slot":"dialog-description"},e(l),{class:e(f)("text-muted-foreground text-sm",a.class)}),{default:d(()=>[c(t.$slots,"default")]),_:3},16,["class"]))}}),G=r({__name:"DialogHeader",props:{class:{}},setup(s){const a=s;return(o,l)=>(i(),z("div",{"data-slot":"dialog-header",class:O(e(f)("flex flex-col gap-2 text-center sm:text-left",a.class))},[c(o.$slots,"default")],2))}}),H=r({__name:"DialogTitle",props:{asChild:{type:Boolean},as:{},class:{}},setup(s){const a=s,o=m(()=>{const{class:t,...n}=a;return n}),l=x(o);return(t,n)=>(i(),p(e($),u({"data-slot":"dialog-title"},e(l),{class:e(f)("text-lg leading-none font-semibold",a.class)}),{default:d(()=>[c(t.$slots,"default")]),_:3},16,["class"]))}});export{T as _,G as a,H as b,V as c,N as d}; diff --git a/public/build/assets/Edit-CBkUZj2d.css b/public/build/assets/Edit-CBkUZj2d.css new file mode 100644 index 0000000..94aaa58 --- /dev/null +++ b/public/build/assets/Edit-CBkUZj2d.css @@ -0,0 +1 @@ +.fade-enter-active[data-v-ffff8818],.fade-leave-active[data-v-ffff8818]{transition:opacity .2s}.fade-enter-from[data-v-ffff8818],.fade-leave-to[data-v-ffff8818]{opacity:0} diff --git a/public/build/assets/Edit-CORuyxK8.js b/public/build/assets/Edit-CORuyxK8.js new file mode 100644 index 0000000..78b9746 --- /dev/null +++ b/public/build/assets/Edit-CORuyxK8.js @@ -0,0 +1 @@ +import{d as R,n as M,c as N,r as f,x as U,e as D,a as r,f as _,u as $,h as q,w as S,b as s,o as n,t as i,y as L,q as u,i as d,v as m,T as B,F as O}from"./app-CClrM5Yi.js";import{_ as X}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{_ as Y}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./index-C4J_hXM0.js";import"./createLucideIcon-ZFd4jktC.js";const A={class:"flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4"},F={key:0,class:"text-sm text-muted-foreground"},H={key:1,class:"rounded-md border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200"},I={class:"grid gap-4 md:grid-cols-2"},P={key:0,class:"mt-1 text-xs text-red-600"},W={key:0,class:"mt-1 text-xs text-red-600"},z={class:"md:col-span-2"},G={key:0,class:"mt-1 text-xs text-red-600"},J={key:0,class:"mt-1 text-xs text-red-600"},K={key:0,class:"mt-1 text-xs text-red-600"},Q={key:0,class:"mt-1 text-xs text-red-600"},Z={key:0,class:"mt-1 text-xs text-red-600"},h={key:0,class:"mt-1 text-xs text-red-600"},tt={key:0,class:"mt-1 text-xs text-red-600"},et={class:"grid gap-4 md:grid-cols-2"},st={key:0,class:"mt-1 text-xs text-red-600"},lt={key:0,class:"mt-1 text-xs text-red-600"},ot={key:0,class:"mt-1 text-xs text-red-600"},rt={key:0,class:"mt-1 text-xs text-red-600"},nt={key:0,class:"mt-1 text-xs text-red-600"},at={key:0,class:"mt-1 text-xs text-red-600"},it={class:"flex items-center gap-2"},dt=["disabled"],ut={key:0},mt={key:1},pt={key:0,class:"fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded bg-foreground px-3 py-2 text-sm text-background shadow-lg"},xt=R({__name:"Edit",setup(ct){const T=M(),g=N(()=>T.props.movieId),v=f(!1),y=f(!1),b=f(null),l=U({}),k=f(!1),w=f(""),p=f(null),e=U({title:"",original_title:"",description:"",poster_url:"",backdrop_url:"",rating:"",release_date:"",year:"",runtime:"",genres:"",actors:"",directors:"",studios:"",countries:"",languages:""});function x(a){return(a??[]).map(t=>t.name).join(", ")}function c(a){return a.split(",").map(t=>t.trim()).filter(Boolean)}async function j(){v.value=!0,b.value=null;try{const a=await fetch(`/api/movies/${g.value}`,{headers:{Accept:"application/json","X-Requested-With":"XMLHttpRequest"},credentials:"same-origin"});if(!a.ok)throw new Error(`Failed: ${a.status}`);const t=await a.json();p.value=t,e.title=t.title??"",e.original_title=t.original_title??"",e.description=t.description??"",e.poster_url=t.poster_url??"",e.backdrop_url=t.backdrop_url??"",e.rating=t.rating??"",e.release_date=t.release_date??"",e.year=t.year??"",e.runtime=t.runtime??"",e.genres=x(t.genres),e.actors=x(t.actors),e.directors=x(t.directors),e.studios=x(t.studios),e.countries=x(t.countries),e.languages=x(t.languages)}catch(a){b.value=a?.message??"Unexpected error"}finally{v.value=!1}}function V(a){w.value=a,k.value=!0,setTimeout(()=>k.value=!1,2500)}async function E(){if(p.value){y.value=!0,b.value=null,Object.keys(l).forEach(a=>delete l[a]);try{const a={title:e.title,original_title:e.original_title||null,description:e.description||null,poster_url:e.poster_url||null,backdrop_url:e.backdrop_url||null,rating:e.rating||null,release_date:e.release_date||null,year:e.year===""?null:Number(e.year),runtime:e.runtime===""?null:Number(e.runtime),genres:c(e.genres),actors:c(e.actors),directors:c(e.directors),studios:c(e.studios),countries:c(e.countries),languages:c(e.languages)},t=await fetch(`/admin/movies/${p.value.id}`,{method:"PATCH",headers:{Accept:"application/json","Content-Type":"application/json","X-Requested-With":"XMLHttpRequest","X-CSRF-TOKEN":document.querySelector('meta[name="csrf-token"]')?.content??""},body:JSON.stringify(a),credentials:"same-origin"});if(t.status===422){const o=await t.json();throw Object.assign(l,o.errors||{}),new Error("Validation failed")}if(!t.ok)throw new Error(`Save failed: ${t.status}`);V("Saved"),await j()}catch(a){"errors"in l||V(a?.message??"Save failed")}finally{y.value=!1}}}function C(){const a=g.value;window.location.href=`/movies/${a}`}return D(j),(a,t)=>(n(),r(O,null,[_($(q),{title:p.value?.title?`Edit · ${p.value.title}`:"Edit Movie"},null,8,["title"]),_(X,{breadcrumbs:[{title:"Dashboard",href:"/dashboard"},{title:"Movies",href:"/admin/movies"},{title:p.value?.title??"Edit",href:`/admin/movies/${g.value}/edit`}]},{default:S(()=>[s("div",A,[v.value?(n(),r("div",F,"Loading…")):b.value?(n(),r("div",H,i(b.value),1)):(n(),r("form",{key:2,onSubmit:L(E,["prevent"]),class:"space-y-4"},[s("div",I,[s("div",null,[t[15]||(t[15]=s("label",{class:"block text-xs font-medium"},"Title",-1)),u(s("input",{"onUpdate:modelValue":t[0]||(t[0]=o=>e.title=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"text",required:""},null,512),[[m,e.title]]),l.title?(n(),r("p",P,i(l.title.join(", ")),1)):d("",!0)]),s("div",null,[t[16]||(t[16]=s("label",{class:"block text-xs font-medium"},"Original Title",-1)),u(s("input",{"onUpdate:modelValue":t[1]||(t[1]=o=>e.original_title=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"text"},null,512),[[m,e.original_title]]),l.original_title?(n(),r("p",W,i(l.original_title.join(", ")),1)):d("",!0)]),s("div",z,[t[17]||(t[17]=s("label",{class:"block text-xs font-medium"},"Description",-1)),u(s("textarea",{"onUpdate:modelValue":t[2]||(t[2]=o=>e.description=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",rows:"5"},null,512),[[m,e.description]]),l.description?(n(),r("p",G,i(l.description.join(", ")),1)):d("",!0)]),s("div",null,[t[18]||(t[18]=s("label",{class:"block text-xs font-medium"},"Poster URL",-1)),u(s("input",{"onUpdate:modelValue":t[3]||(t[3]=o=>e.poster_url=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"url"},null,512),[[m,e.poster_url]]),l.poster_url?(n(),r("p",J,i(l.poster_url.join(", ")),1)):d("",!0)]),s("div",null,[t[19]||(t[19]=s("label",{class:"block text-xs font-medium"},"Backdrop URL",-1)),u(s("input",{"onUpdate:modelValue":t[4]||(t[4]=o=>e.backdrop_url=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"url"},null,512),[[m,e.backdrop_url]]),l.backdrop_url?(n(),r("p",K,i(l.backdrop_url.join(", ")),1)):d("",!0)]),s("div",null,[t[20]||(t[20]=s("label",{class:"block text-xs font-medium"},"Rating",-1)),u(s("input",{"onUpdate:modelValue":t[5]||(t[5]=o=>e.rating=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"text"},null,512),[[m,e.rating]]),l.rating?(n(),r("p",Q,i(l.rating.join(", ")),1)):d("",!0)]),s("div",null,[t[21]||(t[21]=s("label",{class:"block text-xs font-medium"},"Release Date (YYYY-MM-DD)",-1)),u(s("input",{"onUpdate:modelValue":t[6]||(t[6]=o=>e.release_date=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"date"},null,512),[[m,e.release_date]]),l.release_date?(n(),r("p",Z,i(l.release_date.join(", ")),1)):d("",!0)]),s("div",null,[t[22]||(t[22]=s("label",{class:"block text-xs font-medium"},"Year",-1)),u(s("input",{"onUpdate:modelValue":t[7]||(t[7]=o=>e.year=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"number",min:"1800",max:"3000"},null,512),[[m,e.year]]),l.year?(n(),r("p",h,i(l.year.join(", ")),1)):d("",!0)]),s("div",null,[t[23]||(t[23]=s("label",{class:"block text-xs font-medium"},"Runtime (minutes)",-1)),u(s("input",{"onUpdate:modelValue":t[8]||(t[8]=o=>e.runtime=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"number",min:"1",max:"10000"},null,512),[[m,e.runtime]]),l.runtime?(n(),r("p",tt,i(l.runtime.join(", ")),1)):d("",!0)])]),s("div",et,[s("div",null,[t[24]||(t[24]=s("label",{class:"block text-xs font-medium"},"Genres (comma separated)",-1)),u(s("input",{"onUpdate:modelValue":t[9]||(t[9]=o=>e.genres=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"text"},null,512),[[m,e.genres]]),l.genres?(n(),r("p",st,i(l.genres.join(", ")),1)):d("",!0)]),s("div",null,[t[25]||(t[25]=s("label",{class:"block text-xs font-medium"},"Actors (comma separated)",-1)),u(s("input",{"onUpdate:modelValue":t[10]||(t[10]=o=>e.actors=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"text"},null,512),[[m,e.actors]]),l.actors?(n(),r("p",lt,i(l.actors.join(", ")),1)):d("",!0)]),s("div",null,[t[26]||(t[26]=s("label",{class:"block text-xs font-medium"},"Directors (comma separated)",-1)),u(s("input",{"onUpdate:modelValue":t[11]||(t[11]=o=>e.directors=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"text"},null,512),[[m,e.directors]]),l.directors?(n(),r("p",ot,i(l.directors.join(", ")),1)):d("",!0)]),s("div",null,[t[27]||(t[27]=s("label",{class:"block text-xs font-medium"},"Studios (comma separated)",-1)),u(s("input",{"onUpdate:modelValue":t[12]||(t[12]=o=>e.studios=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"text"},null,512),[[m,e.studios]]),l.studios?(n(),r("p",rt,i(l.studios.join(", ")),1)):d("",!0)]),s("div",null,[t[28]||(t[28]=s("label",{class:"block text-xs font-medium"},"Countries (comma separated)",-1)),u(s("input",{"onUpdate:modelValue":t[13]||(t[13]=o=>e.countries=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"text"},null,512),[[m,e.countries]]),l.countries?(n(),r("p",nt,i(l.countries.join(", ")),1)):d("",!0)]),s("div",null,[t[29]||(t[29]=s("label",{class:"block text-xs font-medium"},"Languages (comma separated)",-1)),u(s("input",{"onUpdate:modelValue":t[14]||(t[14]=o=>e.languages=o),class:"mt-1 w-full rounded border px-3 py-2 text-sm",type:"text"},null,512),[[m,e.languages]]),l.languages?(n(),r("p",at,i(l.languages.join(", ")),1)):d("",!0)])]),s("div",it,[s("button",{type:"submit",disabled:y.value,class:"rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:opacity-90 disabled:opacity-60"},[y.value?(n(),r("span",ut,"Saving…")):(n(),r("span",mt,"Save"))],8,dt),s("button",{type:"button",onClick:C,class:"rounded-md border px-3 py-2 text-sm hover:bg-muted"}," Cancel ")])],32)),_(B,{name:"fade"},{default:S(()=>[k.value?(n(),r("div",pt,i(w.value),1)):d("",!0)]),_:1})])]),_:1},8,["breadcrumbs"])],64))}}),Ut=Y(xt,[["__scopeId","data-v-ffff8818"]]);export{Ut as default}; diff --git a/public/build/assets/ForgotPassword-BI_N76PO.js b/public/build/assets/ForgotPassword-BI_N76PO.js new file mode 100644 index 0000000..5cfd75e --- /dev/null +++ b/public/build/assets/ForgotPassword-BI_N76PO.js @@ -0,0 +1 @@ +import{_}from"./InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js";import{_ as p}from"./TextLink.vue_vue_type_script_setup_true_lang-JYycsYY3.js";import{_ as u}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{_ as c}from"./Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js";import{_ as x}from"./Label.vue_vue_type_script_setup_true_lang-Dbqibcwo.js";import{_ as g}from"./Spinner.vue_vue_type_script_setup_true_lang-BPOcqWqa.js";import{_ as k}from"./AuthLayout.vue_vue_type_script_setup_true_lang-B14CUTB5.js";import{l as w}from"./index-C4J_hXM0.js";import{e as y}from"./index-vZYIBGLo.js";import{d as v,k as d,w as a,f as s,a as $,i as n,b as o,u as t,h as b,o as r,t as h,A as B,C,D as E,l as i}from"./app-CClrM5Yi.js";import"./useForwardExpose-BhawR5VU.js";import"./createLucideIcon-ZFd4jktC.js";import"./index-BCC4ahRc.js";const N={key:0,class:"mb-4 text-center text-sm font-medium text-green-600"},V={class:"space-y-6"},F={class:"grid gap-2"},P={class:"my-6 flex items-center justify-start"},D={class:"space-x-1 text-center text-sm text-muted-foreground"},M=v({__name:"ForgotPassword",props:{status:{}},setup(m){return(j,e)=>(r(),d(k,{title:"Forgot password",description:"Enter your email to receive a password reset link"},{default:a(()=>[s(t(b),{title:"Forgot password"}),m.status?(r(),$("div",N,h(m.status),1)):n("",!0),o("div",V,[s(t(B),C(E(t(y).form())),{default:a(({errors:f,processing:l})=>[o("div",F,[s(t(x),{for:"email"},{default:a(()=>[...e[0]||(e[0]=[i("Email address",-1)])]),_:1}),s(t(c),{id:"email",type:"email",name:"email",autocomplete:"off",autofocus:"",placeholder:"email@example.com"}),s(_,{message:f.email},null,8,["message"])]),o("div",P,[s(t(u),{class:"w-full",disabled:l,"data-test":"email-password-reset-link-button"},{default:a(()=>[l?(r(),d(t(g),{key:0})):n("",!0),e[1]||(e[1]=i(" Email password reset link ",-1))]),_:2},1032,["disabled"])])]),_:1},16),o("div",D,[e[3]||(e[3]=o("span",null,"Or, return to",-1)),s(p,{href:t(w)()},{default:a(()=>[...e[2]||(e[2]=[i("log in",-1)])]),_:1},8,["href"])])])]),_:1}))}});export{M as default}; diff --git a/public/build/assets/Index-BJjYncZL.css b/public/build/assets/Index-BJjYncZL.css new file mode 100644 index 0000000..901be9e --- /dev/null +++ b/public/build/assets/Index-BJjYncZL.css @@ -0,0 +1 @@ +.fade-enter-active[data-v-b2cf9ca5],.fade-leave-active[data-v-b2cf9ca5]{transition:opacity .2s}.fade-enter-from[data-v-b2cf9ca5],.fade-leave-to[data-v-b2cf9ca5]{opacity:0} diff --git a/public/build/assets/Index-BrX3yilR.css b/public/build/assets/Index-BrX3yilR.css new file mode 100644 index 0000000..1f42c36 --- /dev/null +++ b/public/build/assets/Index-BrX3yilR.css @@ -0,0 +1 @@ +.fade-enter-active[data-v-e85a9790],.fade-leave-active[data-v-e85a9790]{transition:opacity .2s}.fade-enter-from[data-v-e85a9790],.fade-leave-to[data-v-e85a9790]{opacity:0} diff --git a/public/build/assets/Index-CYUFIW2Y.js b/public/build/assets/Index-CYUFIW2Y.js new file mode 100644 index 0000000..ca332d9 --- /dev/null +++ b/public/build/assets/Index-CYUFIW2Y.js @@ -0,0 +1 @@ +import{d as Y,r,c as A,e as B,p as E,a as l,f as T,u as z,h as D,w as I,b as s,i as _,q as x,v as w,s as O,o,t as p,F as P,g as X,l as C,T as Z}from"./app-CClrM5Yi.js";import{_ as G}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{_ as H}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./index-C4J_hXM0.js";import"./createLucideIcon-ZFd4jktC.js";const W={class:"flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4"},J={class:"grid grid-cols-1 gap-2 md:grid-cols-12"},K={class:"md:col-span-4"},Q={class:"md:col-span-3"},ee={class:"md:col-span-2"},ae={class:"md:col-span-3"},te={class:"flex gap-2"},se={class:"md:col-span-2"},re={key:0,class:"rounded-md border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200"},le=["aria-busy"],oe=["href"],ne={class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted"},ie=["src","alt"],ue={class:"flex min-w-0 flex-1 flex-col"},de={class:"flex items-center justify-between gap-2"},ce={class:"truncate font-medium"},ve={class:"text-xs text-muted-foreground"},me={class:"mt-1 text-xs text-muted-foreground"},pe={key:0,class:"mr-2 rounded border px-1 py-0.5"},fe={key:1},ge={class:"mt-2 text-sm text-foreground/90"},he={key:0,class:"fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded bg-foreground px-3 py-2 text-sm text-background shadow-lg"},_e=Y({__name:"Index",setup(xe){const n=r(""),i=r("title_asc"),u=r(""),d=r(""),c=r(""),v=r(""),y=r(1),f=r([]),j=r(0),U=r(1),m=r(!1),k=r(null),L=r(!1),N=r("");let V=null;const q=A(()=>y.value{y.value=1,S(!0)},300)}function b(){const t=new URL(window.location.href);n.value?t.searchParams.set("q",n.value):t.searchParams.delete("q"),i.value?t.searchParams.set("sort",i.value):t.searchParams.delete("sort"),u.value?t.searchParams.set("genre",u.value):t.searchParams.delete("genre"),d.value?t.searchParams.set("rating",d.value):t.searchParams.delete("rating"),c.value!==""?t.searchParams.set("year_min",String(c.value)):t.searchParams.delete("year_min"),v.value!==""?t.searchParams.set("year_max",String(v.value)):t.searchParams.delete("year_max"),window.history.replaceState({},"",t.toString()),y.value=1,S(!0)}async function $(){q.value&&(y.value+=1,await S(!1))}const M=r(null);let g=null;return B(()=>{const t=new URL(window.location.href);n.value=t.searchParams.get("q")??"",i.value=t.searchParams.get("sort")??"title_asc",u.value=t.searchParams.get("genre")??"",d.value=t.searchParams.get("rating")??"",c.value=t.searchParams.get("year_min")??"",v.value=t.searchParams.get("year_max")??"",S(!0),g=new IntersectionObserver(e=>{for(const a of e)a.isIntersecting&&$()},{root:null,rootMargin:"200px",threshold:0}),M.value&&g.observe(M.value)}),E(M,(t,e)=>{e&&g&&g.unobserve(e),t&&g&&g.observe(t)}),(t,e)=>(o(),l(P,null,[T(z(D),{title:"Movies"}),T(G,{breadcrumbs:[{title:"Movies",href:"/movies"}]},{default:I(()=>[s("div",W,[s("div",J,[s("div",K,[x(s("input",{class:"w-full rounded-md border border-gray-300 bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-primary",type:"text",placeholder:"Search movies…","aria-label":"Search movies","onUpdate:modelValue":e[0]||(e[0]=a=>n.value=a),onInput:F},null,544),[[w,n.value]])]),s("div",Q,[x(s("select",{"onUpdate:modelValue":e[1]||(e[1]=a=>i.value=a),onChange:b,class:"w-full rounded-md border px-3 py-2 text-sm","aria-label":"Sort movies"},[...e[6]||(e[6]=[s("option",{value:"title_asc"},"Title A → Z",-1),s("option",{value:"title_desc"},"Title Z → A",-1),s("option",{value:"newest"},"Newest",-1),s("option",{value:"oldest"},"Oldest",-1),s("option",{value:"year_asc"},"Year ↑",-1),s("option",{value:"year_desc"},"Year ↓",-1)])],544),[[O,i.value]])]),s("div",ee,[x(s("input",{"onUpdate:modelValue":e[2]||(e[2]=a=>u.value=a),onChange:b,class:"w-full rounded-md border px-3 py-2 text-sm",type:"text",placeholder:"Genre","aria-label":"Filter by genre"},null,544),[[w,u.value]])]),s("div",ae,[s("div",te,[x(s("input",{"onUpdate:modelValue":e[3]||(e[3]=a=>c.value=a),onChange:b,class:"w-full rounded-md border px-3 py-2 text-sm",type:"number",placeholder:"Year min","aria-label":"Minimum year"},null,544),[[w,c.value]]),x(s("input",{"onUpdate:modelValue":e[4]||(e[4]=a=>v.value=a),onChange:b,class:"w-full rounded-md border px-3 py-2 text-sm",type:"number",placeholder:"Year max","aria-label":"Maximum year"},null,544),[[w,v.value]])])]),s("div",se,[x(s("input",{"onUpdate:modelValue":e[5]||(e[5]=a=>d.value=a),onChange:b,class:"w-full rounded-md border px-3 py-2 text-sm",type:"text",placeholder:"Rating","aria-label":"Filter by rating"},null,544),[[w,d.value]])])]),k.value?(o(),l("div",re,p(k.value),1)):_("",!0),s("ul",{class:"divide-y divide-muted-foreground/20","aria-busy":m.value?"true":"false"},[(o(!0),l(P,null,X(f.value,a=>(o(),l("li",{key:a.id,class:"py-1"},[s("a",{href:`/movies/${a.id}`,class:"flex gap-3 rounded px-2 py-2 hover:bg-muted/40 focus:bg-muted/40 focus:outline-none"},[s("div",ne,[a.poster_url?(o(),l("img",{key:0,src:a.poster_url,alt:`Poster for ${a.title}`,loading:"lazy",class:"h-full w-full object-cover"},null,8,ie)):_("",!0)]),s("div",ue,[s("div",de,[s("div",ce,p(a.title),1),s("div",ve,p(a.year??""),1)]),s("div",me,[a.rating?(o(),l("span",pe,p(a.rating),1)):_("",!0),a.genres?.length?(o(),l("span",fe,p(a.genres.map(h=>h.name).join(", ")),1)):_("",!0)]),s("div",ge,p(R(a.description)),1)])],8,oe)]))),128))],8,le),s("div",{ref_key:"sentinel",ref:M,class:"py-6 text-center text-sm text-muted-foreground"},[m.value?(o(),l(P,{key:0},[C("Loading…")],64)):!q.value&&f.value.length>0?(o(),l(P,{key:1},[C("End of results")],64)):!f.value.length&&!m.value?(o(),l(P,{key:2},[C("No results")],64)):_("",!0)],512),T(Z,{name:"fade"},{default:I(()=>[L.value?(o(),l("div",he,p(N.value),1)):_("",!0)]),_:1})])]),_:1})],64))}}),Ve=H(_e,[["__scopeId","data-v-b2cf9ca5"]]);export{Ve as default}; diff --git a/public/build/assets/Index-Dc3cIue4.js b/public/build/assets/Index-Dc3cIue4.js new file mode 100644 index 0000000..7cd8142 --- /dev/null +++ b/public/build/assets/Index-Dc3cIue4.js @@ -0,0 +1 @@ +import{d as $,r as o,c as H,e as U,p as z,a as r,f as C,u as B,h as F,w as A,b as s,i as v,q as K,z as J,v as G,o as n,t as m,F as h,g as Q,l as j,T as Y}from"./app-CClrM5Yi.js";import{_ as Z}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{_ as ee}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./index-C4J_hXM0.js";import"./createLucideIcon-ZFd4jktC.js";const te={class:"flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4"},ae={class:"flex items-center gap-2"},se={key:0,class:"rounded-md border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200"},oe={class:"divide-y divide-muted-foreground/20"},re={class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted"},ne=["src"],ie={class:"flex min-w-0 flex-1 flex-col"},le={class:"flex items-center justify-between gap-2"},ce={class:"truncate font-medium"},de={class:"text-xs text-muted-foreground"},ue={class:"mt-2"},fe={key:0,class:"inline-flex items-center rounded-md border px-3 py-1.5 text-xs"},pe=["disabled","aria-busy","onClick"],ve={key:0},me={key:1},he={key:0,class:"fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded bg-foreground px-3 py-2 text-sm text-background shadow-lg"},_e={key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/50"},xe={class:"w-full max-w-md rounded-lg bg-background p-5 shadow-lg"},ge={class:"text-base font-semibold"},ye=$({__name:"Index",setup(be){const _=o(""),x=o(1),i=o([]),D=o(0),w=o(!1),d=o(!1),g=o(null),c=o(!1),y=o(""),u=o(new Set),p=o(!1),q=o(""),k=o("");let S=null;const E=H(()=>w.value&&!d.value);async function T(e=!1){if(!d.value){d.value=!0,g.value=null;try{const a=new URLSearchParams;a.set("q",_.value),a.set("page",String(x.value));const t=await fetch(`/admin/movies/search?${a.toString()}`,{headers:{Accept:"application/json","X-Requested-With":"XMLHttpRequest"},credentials:"same-origin"});if(!t.ok)throw new Error(`Search failed: ${t.status}`);const l=await t.json();D.value=l.total,w.value=l.has_more,e?i.value=l.results:i.value=i.value.concat(l.results)}catch(a){g.value=a?.message??"Unexpected error"}finally{d.value=!1}}}function L(){clearTimeout(S);const e=_.value.trim().length;e>=3&&e%3===0&&(S=setTimeout(()=>{x.value=1,T(!0)},300))}function N(){clearTimeout(S),x.value=1,T(!0)}async function X(){E.value&&(x.value+=1,await T(!1))}const b=o(null);let f=null;U(()=>{f=new IntersectionObserver(e=>{for(const a of e)a.isIntersecting&&X()},{root:null,rootMargin:"200px",threshold:0}),b.value&&f.observe(b.value)}),z(b,(e,a)=>{a&&f&&f.unobserve(a),e&&f&&f.observe(e)});async function I(e){try{if(u.value.has(e.provider_id))return;const a=new URLSearchParams({provider_id:e.provider_id}),t=await fetch(`/admin/movies/exists?${a.toString()}`,{headers:{Accept:"application/json","X-Requested-With":"XMLHttpRequest"},credentials:"same-origin"});if(!t.ok)throw new Error("Duplicate check failed");if((await t.json()).exists){q.value=e.title??"This movie",k.value=e.provider_id,p.value=!0;return}await M(e.provider_id,"overwrite")}catch(a){console.error(a),y.value=a instanceof Error?a.message:"Something went wrong",c.value=!0,setTimeout(()=>c.value=!1,2500)}}async function M(e,a){try{u.value.add(e);const t=await fetch("/admin/movies/accept",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","X-Requested-With":"XMLHttpRequest","X-CSRF-TOKEN":document.querySelector('meta[name="csrf-token"]')?.content??""},body:JSON.stringify({provider_id:e,mode:a}),credentials:"same-origin"});if(!t.ok)throw new Error("Accept failed");try{const l=await t.json(),R=i.value.findIndex(W=>W.provider_id===e);R!==-1&&(i.value[R]._accepted=!0),y.value=a==="duplicate"?"Saved as duplicate":"Accepted (overwrote if existed)",c.value=!0,setTimeout(()=>c.value=!1,2e3)}catch{}}catch(t){throw console.error(t),y.value=t instanceof Error?t.message:"Accept failed",c.value=!0,setTimeout(()=>c.value=!1,2500),t}finally{u.value.delete(e)}}function O(){const e=k.value;p.value=!1,e&&M(e,"overwrite")}function P(){const e=k.value;p.value=!1,e&&M(e,"duplicate")}function V(){p.value=!1}return(e,a)=>(n(),r(h,null,[C(B(F),{title:"Movies"}),C(Z,{breadcrumbs:[{title:"Dashboard",href:"/dashboard"},{title:"Movies",href:"/admin/movies"}]},{default:A(()=>[s("div",te,[s("div",ae,[K(s("input",{class:"w-full rounded-md border border-gray-300 bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-primary",type:"text",placeholder:"Search movies by title…","onUpdate:modelValue":a[0]||(a[0]=t=>_.value=t),onInput:L,onKeyup:J(N,["enter"])},null,544),[[G,_.value]])]),g.value?(n(),r("div",se,m(g.value),1)):v("",!0),s("ul",oe,[(n(!0),r(h,null,Q(i.value,t=>(n(),r("li",{key:t.provider_id,class:"flex gap-3 py-3"},[s("div",re,[t.poster_url?(n(),r("img",{key:0,src:t.poster_url,alt:"Poster",class:"h-full w-full object-cover"},null,8,ne)):v("",!0)]),s("div",ie,[s("div",le,[s("div",ce,m(t.title),1),s("div",de,m(t.year),1)]),s("div",ue,[t._accepted?(n(),r("span",fe,"Accepted")):(n(),r("button",{key:1,class:"inline-flex items-center rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:opacity-90",disabled:u.value.has(t.provider_id),"aria-busy":u.value.has(t.provider_id)?"true":"false",onClick:l=>I(t)},[u.value.has(t.provider_id)?(n(),r("span",ve,"Working…")):(n(),r("span",me,"Accept"))],8,pe))])])]))),128))]),s("div",{ref_key:"sentinel",ref:b,class:"py-6 text-center text-sm text-muted-foreground"},[d.value?(n(),r(h,{key:0},[j("Loading…")],64)):!w.value&&i.value.length>0?(n(),r(h,{key:1},[j("End of results")],64)):!i.value.length&&!d.value?(n(),r(h,{key:2},[j("No results")],64)):v("",!0)],512),C(Y,{name:"fade"},{default:A(()=>[c.value?(n(),r("div",he,m(y.value),1)):v("",!0)]),_:1})]),p.value?(n(),r("div",_e,[s("div",xe,[s("h3",ge,m(q.value)+" is already in our list. How should we proceed?",1),s("div",{class:"mt-4 flex justify-end gap-2"},[s("button",{class:"rounded-md border px-3 py-1.5 text-sm",onClick:V},"Cancel"),s("button",{class:"rounded-md border px-3 py-1.5 text-sm",onClick:P},"Save as Duplicate"),s("button",{class:"rounded-md bg-primary px-3 py-1.5 text-sm text-primary-foreground",onClick:O},"Overwrite")])])])):v("",!0)]),_:1})],64))}}),De=ee(ye,[["__scopeId","data-v-e85a9790"]]);export{De as default}; diff --git a/public/build/assets/Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js b/public/build/assets/Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js new file mode 100644 index 0000000..1bdc334 --- /dev/null +++ b/public/build/assets/Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js @@ -0,0 +1 @@ +import{d as s,q as n,v as d,u as a,a as u,K as m,N as p,o as f}from"./app-CClrM5Yi.js";import{c}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{b}from"./useForwardExpose-BhawR5VU.js";const h=s({__name:"Input",props:{defaultValue:{},modelValue:{},class:{}},emits:["update:modelValue"],setup(r,{emit:o}){const e=r,t=b(e,"modelValue",o,{passive:!0,defaultValue:e.defaultValue});return(x,i)=>n((f(),u("input",{"onUpdate:modelValue":i[0]||(i[0]=l=>p(t)?t.value=l:null),"data-slot":"input",class:m(a(c)("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",e.class))},null,2)),[[d,a(t)]])}});export{h as _}; diff --git a/public/build/assets/InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js b/public/build/assets/InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js new file mode 100644 index 0000000..a306f2e --- /dev/null +++ b/public/build/assets/InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js @@ -0,0 +1 @@ +import{d as s,q as t,L as a,a as r,b as o,t as n,o as c}from"./app-CClrM5Yi.js";const i={class:"text-sm text-red-600 dark:text-red-500"},l=s({__name:"InputError",props:{message:{}},setup(e){return(m,d)=>t((c(),r("div",null,[o("p",i,n(e.message),1)],512)),[[a,e.message]])}});export{l as _}; diff --git a/public/build/assets/Label.vue_vue_type_script_setup_true_lang-Dbqibcwo.js b/public/build/assets/Label.vue_vue_type_script_setup_true_lang-Dbqibcwo.js new file mode 100644 index 0000000..793c519 --- /dev/null +++ b/public/build/assets/Label.vue_vue_type_script_setup_true_lang-Dbqibcwo.js @@ -0,0 +1 @@ +import{P as c,c as f}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{a as _}from"./useForwardExpose-BhawR5VU.js";import{d as l,k as d,w as n,G as p,B as u,u as o,o as i,c as m}from"./app-CClrM5Yi.js";var b=l({__name:"Label",props:{for:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"label"}},setup(s){const t=s;return _(),(r,a)=>(i(),d(o(c),u(t,{onMousedown:a[0]||(a[0]=e=>{!e.defaultPrevented&&e.detail>1&&e.preventDefault()})}),{default:n(()=>[p(r.$slots,"default")]),_:3},16))}}),g=b;const x=l({__name:"Label",props:{for:{},asChild:{type:Boolean},as:{},class:{}},setup(s){const t=s,r=m(()=>{const{class:a,...e}=t;return e});return(a,e)=>(i(),d(o(g),u({"data-slot":"label"},r.value,{class:o(f)("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",t.class)}),{default:n(()=>[p(a.$slots,"default")]),_:3},16,["class"]))}});export{x as _}; diff --git a/public/build/assets/Layout.vue_vue_type_script_setup_true_lang-ROf3tZlv.js b/public/build/assets/Layout.vue_vue_type_script_setup_true_lang-ROf3tZlv.js new file mode 100644 index 0000000..8b481b9 --- /dev/null +++ b/public/build/assets/Layout.vue_vue_type_script_setup_true_lang-ROf3tZlv.js @@ -0,0 +1 @@ +import{d as Q,c as F,k as E,o as p,w as $,G as B,B as H,u as f,C as U,D as G,a as q,b as v,i as T,t as x,f as O,F as M,g as J,m as W,l as X,I as Y,K as Z}from"./app-CClrM5Yi.js";import{P as ee,c as te,u as re,t as oe,_ as ae}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{r as se}from"./useForwardExpose-BhawR5VU.js";import{q as i}from"./index-C4J_hXM0.js";import{e as ue}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{l as le}from"./index--H2rh_A_.js";var ne=Q({__name:"BaseSeparator",props:{orientation:{type:String,required:!1,default:"horizontal"},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const l=e,y=["horizontal","vertical"];function w(b){return y.includes(b)}const C=F(()=>w(l.orientation)?l.orientation:"horizontal"),_=F(()=>C.value==="vertical"?l.orientation:void 0),L=F(()=>l.decorative?{role:"none"}:{"aria-orientation":_.value,role:"separator"});return(b,Ce)=>(p(),E(f(ee),H({as:b.as,"as-child":b.asChild,"data-orientation":C.value},L.value),{default:$(()=>[B(b.$slots,"default")]),_:3},16,["as","as-child","data-orientation"]))}}),ie=ne,de=Q({__name:"Separator",props:{orientation:{type:String,required:!1,default:"horizontal"},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const l=e;return(y,w)=>(p(),E(ie,U(G(l)),{default:$(()=>[B(y.$slots,"default")]),_:3},16))}}),ce=de;const me=Q({__name:"Separator",props:{orientation:{default:"horizontal"},decorative:{type:Boolean,default:!0},asChild:{type:Boolean},as:{},class:{}},setup(e){const l=e,y=se(l,"class");return(w,C)=>(p(),E(f(ce),H({"data-slot":"separator-root"},f(y),{class:f(te)("bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",l.class)}),null,16,["class"]))}}),he={class:"mb-0.5 text-base font-medium"},ge={key:0,class:"text-sm text-muted-foreground"},je=Q({__name:"HeadingSmall",props:{title:{},description:{}},setup(e){return(l,y)=>(p(),q("header",null,[v("h3",he,x(e.title),1),e.description?(p(),q("p",ge,x(e.description),1)):T("",!0)]))}}),fe={class:"mb-8 space-y-0.5"},pe={class:"text-xl font-semibold tracking-tight"},ye={key:0,class:"text-sm text-muted-foreground"},_e=Q({__name:"Heading",props:{title:{},description:{}},setup(e){return(l,y)=>(p(),q("div",fe,[v("h2",pe,x(e.title),1),e.description?(p(),q("p",ye,x(e.description),1)):T("",!0)]))}}),t=e=>({url:t.url(e),method:"get"});t.definition={methods:["get","head"],url:"/settings/appearance"};t.url=e=>t.definition.url+i(e);t.get=e=>({url:t.url(e),method:"get"});t.head=e=>({url:t.url(e),method:"head"});const S=e=>({action:t.url(e),method:"get"});S.get=e=>({action:t.url(e),method:"get"});S.head=e=>({action:t.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"HEAD",...e?.query??e?.mergeQuery??{}}}),method:"get"});t.form=S;Object.assign(t,t);const n=e=>({url:n.url(e),method:"get"});n.definition={methods:["get","head"],url:"/two-factor-challenge"};n.url=e=>n.definition.url+i(e);n.get=e=>({url:n.url(e),method:"get"});n.head=e=>({url:n.url(e),method:"head"});const j=e=>({action:n.url(e),method:"get"});j.get=e=>({action:n.url(e),method:"get"});j.head=e=>({action:n.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"HEAD",...e?.query??e?.mergeQuery??{}}}),method:"get"});n.form=j;const d=e=>({url:d.url(e),method:"post"});d.definition={methods:["post"],url:"/user/two-factor-authentication"};d.url=e=>d.definition.url+i(e);d.post=e=>({url:d.url(e),method:"post"});const N=e=>({action:d.url(e),method:"post"});N.post=e=>({action:d.url(e),method:"post"});d.form=N;const c=e=>({url:c.url(e),method:"post"});c.definition={methods:["post"],url:"/user/confirmed-two-factor-authentication"};c.url=e=>c.definition.url+i(e);c.post=e=>({url:c.url(e),method:"post"});const I=e=>({action:c.url(e),method:"post"});I.post=e=>({action:c.url(e),method:"post"});c.form=I;const m=e=>({url:m.url(e),method:"delete"});m.definition={methods:["delete"],url:"/user/two-factor-authentication"};m.url=e=>m.definition.url+i(e);m.delete=e=>({url:m.url(e),method:"delete"});const R=e=>({action:m.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"DELETE",...e?.query??e?.mergeQuery??{}}}),method:"post"});R.delete=e=>({action:m.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"DELETE",...e?.query??e?.mergeQuery??{}}}),method:"post"});m.form=R;const a=e=>({url:a.url(e),method:"get"});a.definition={methods:["get","head"],url:"/user/two-factor-qr-code"};a.url=e=>a.definition.url+i(e);a.get=e=>({url:a.url(e),method:"get"});a.head=e=>({url:a.url(e),method:"head"});const P=e=>({action:a.url(e),method:"get"});P.get=e=>({action:a.url(e),method:"get"});P.head=e=>({action:a.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"HEAD",...e?.query??e?.mergeQuery??{}}}),method:"get"});a.form=P;const s=e=>({url:s.url(e),method:"get"});s.definition={methods:["get","head"],url:"/user/two-factor-secret-key"};s.url=e=>s.definition.url+i(e);s.get=e=>({url:s.url(e),method:"get"});s.head=e=>({url:s.url(e),method:"head"});const D=e=>({action:s.url(e),method:"get"});D.get=e=>({action:s.url(e),method:"get"});D.head=e=>({action:s.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"HEAD",...e?.query??e?.mergeQuery??{}}}),method:"get"});s.form=D;const u=e=>({url:u.url(e),method:"get"});u.definition={methods:["get","head"],url:"/user/two-factor-recovery-codes"};u.url=e=>u.definition.url+i(e);u.get=e=>({url:u.url(e),method:"get"});u.head=e=>({url:u.url(e),method:"head"});const k=e=>({action:u.url(e),method:"get"});k.get=e=>({action:u.url(e),method:"get"});k.head=e=>({action:u.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"HEAD",...e?.query??e?.mergeQuery??{}}}),method:"get"});u.form=k;const h=e=>({url:h.url(e),method:"post"});h.definition={methods:["post"],url:"/user/two-factor-recovery-codes"};h.url=e=>h.definition.url+i(e);h.post=e=>({url:h.url(e),method:"post"});const V=e=>({action:h.url(e),method:"post"});V.post=e=>({action:h.url(e),method:"post"});h.form=V;const r=e=>({url:r.url(e),method:"get"});r.definition={methods:["get","head"],url:"/settings/two-factor"};r.url=e=>r.definition.url+i(e);r.get=e=>({url:r.url(e),method:"get"});r.head=e=>({url:r.url(e),method:"head"});const A=e=>({action:r.url(e),method:"get"});A.get=e=>({action:r.url(e),method:"get"});A.head=e=>({action:r.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"HEAD",...e?.query??e?.mergeQuery??{}}}),method:"get"});r.form=A;Object.assign(n,le),Object.assign(d,d),Object.assign(c,c),Object.assign(m,m),Object.assign(a,a),Object.assign(s,s),Object.assign(u,u),Object.assign(h,h),Object.assign(r,r);const o=e=>({url:o.url(e),method:"get"});o.definition={methods:["get","head"],url:"/settings/password"};o.url=e=>o.definition.url+i(e);o.get=e=>({url:o.url(e),method:"get"});o.head=e=>({url:o.url(e),method:"head"});const z=e=>({action:o.url(e),method:"get"});z.get=e=>({action:o.url(e),method:"get"});z.head=e=>({action:o.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"HEAD",...e?.query??e?.mergeQuery??{}}}),method:"get"});o.form=z;const g=e=>({url:g.url(e),method:"put"});g.definition={methods:["put"],url:"/settings/password"};g.url=e=>g.definition.url+i(e);g.put=e=>({url:g.url(e),method:"put"});const K=e=>({action:g.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"PUT",...e?.query??e?.mergeQuery??{}}}),method:"post"});K.put=e=>({action:g.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"PUT",...e?.query??e?.mergeQuery??{}}}),method:"post"});g.form=K;Object.assign(o,o),Object.assign(g,g);const ve={class:"px-4 py-6"},qe={class:"flex flex-col lg:flex-row lg:space-x-12"},Qe={class:"w-full max-w-xl lg:w-48"},we={class:"flex flex-col space-y-1 space-x-0"},be={class:"flex-1 md:max-w-2xl"},xe={class:"max-w-xl space-y-12"},Pe=Q({__name:"Layout",setup(e){const l=[{title:"Profile",href:ue()},{title:"Password",href:o()},{title:"Two-Factor Auth",href:r()},{title:"Appearance",href:t()}],y=typeof window!==void 0?window.location.pathname:"";return(w,C)=>(p(),q("div",ve,[O(_e,{title:"Settings",description:"Manage your profile and account settings"}),v("div",qe,[v("aside",Qe,[v("nav",we,[(p(),q(M,null,J(l,_=>O(f(ae),{key:f(oe)(_.href),variant:"ghost",class:Z(["w-full justify-start",{"bg-muted":f(re)(_.href,f(y))}]),"as-child":""},{default:$(()=>[O(f(W),{href:_.href},{default:$(()=>[(p(),E(Y(_.icon),{class:"h-4 w-4"})),X(" "+x(_.title),1)]),_:2},1032,["href"])]),_:2},1032,["class"])),64))])]),O(f(me),{class:"my-6 lg:hidden"}),v("div",be,[v("section",xe,[B(w.$slots,"default")])])])]))}});export{Pe as _,je as a,o as b,h as c,c as d,t as e,r as f,d as g,m as h,a as q,u as r,s}; diff --git a/public/build/assets/List-CVA9NIjL.css b/public/build/assets/List-CVA9NIjL.css new file mode 100644 index 0000000..8103dcc --- /dev/null +++ b/public/build/assets/List-CVA9NIjL.css @@ -0,0 +1 @@ +.fade-enter-active[data-v-7fa35049],.fade-leave-active[data-v-7fa35049]{transition:opacity .2s}.fade-enter-from[data-v-7fa35049],.fade-leave-to[data-v-7fa35049]{opacity:0} diff --git a/public/build/assets/List-C_4Kh8Sa.js b/public/build/assets/List-C_4Kh8Sa.js new file mode 100644 index 0000000..0076903 --- /dev/null +++ b/public/build/assets/List-C_4Kh8Sa.js @@ -0,0 +1 @@ +import{d as $,r,c as D,e as Y,p as B,a as l,f as T,u as E,h as O,w as X,b as s,i as S,q as n,v as u,s as Z,o,t as P,F as C,g as z,l as q}from"./app-CClrM5Yi.js";import{_ as G}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{_ as H}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./index-C4J_hXM0.js";import"./createLucideIcon-ZFd4jktC.js";const W={class:"flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4"},J={class:"grid grid-cols-1 items-end gap-2 md:grid-cols-12"},K={class:"md:col-span-4"},Q={class:"md:col-span-3"},ee={class:"md:col-span-2"},ae={class:"md:col-span-3"},te={class:"flex gap-2"},se={class:"md:col-span-2"},re={class:"md:col-span-3"},le={class:"md:col-span-3"},oe={class:"md:col-span-3"},ne={key:0,class:"rounded-md border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200"},ie=["aria-busy"],ue=["href"],de={class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted"},ce=["src","alt"],ve={class:"flex min-w-0 flex-1 flex-col"},me={class:"flex items-center justify-between gap-2"},pe={class:"truncate font-medium"},fe={class:"text-xs text-muted-foreground"},ge={class:"mt-1 text-xs text-muted-foreground"},he={key:0,class:"mr-2 rounded border px-1 py-0.5"},ye={key:1},xe={class:"mt-2 text-sm text-foreground/90"},_e=$({__name:"List",setup(be){const d=r(""),c=r("title_asc"),v=r(""),m=r(""),p=r(""),f=r(""),g=r(""),h=r(""),y=r(""),k=r(1),_=r([]),N=r(0),F=r(1),x=r(!1),M=r(null);let L=null;const j=D(()=>k.value{k.value=1,U(!0)},300)}function i(){const a=new URL(window.location.href);d.value?a.searchParams.set("q",d.value):a.searchParams.delete("q"),c.value?a.searchParams.set("sort",c.value):a.searchParams.delete("sort"),v.value?a.searchParams.set("genre",v.value):a.searchParams.delete("genre"),m.value?a.searchParams.set("rating",m.value):a.searchParams.delete("rating"),p.value!==""?a.searchParams.set("year_min",String(p.value)):a.searchParams.delete("year_min"),f.value!==""?a.searchParams.set("year_max",String(f.value)):a.searchParams.delete("year_max"),g.value?a.searchParams.set("actor",g.value):a.searchParams.delete("actor"),h.value?a.searchParams.set("director",h.value):a.searchParams.delete("director"),y.value?a.searchParams.set("studio",y.value):a.searchParams.delete("studio"),window.history.replaceState({},"",a.toString()),k.value=1,U(!0)}async function I(){j.value&&(k.value+=1,await U(!1))}const V=r(null);let b=null;return Y(()=>{const a=new URL(window.location.href);d.value=a.searchParams.get("q")??"",c.value=a.searchParams.get("sort")??"title_asc",v.value=a.searchParams.get("genre")??"",m.value=a.searchParams.get("rating")??"",p.value=a.searchParams.get("year_min")??"",f.value=a.searchParams.get("year_max")??"",g.value=a.searchParams.get("actor")??"",h.value=a.searchParams.get("director")??"",y.value=a.searchParams.get("studio")??"",U(!0),b=new IntersectionObserver(e=>{for(const t of e)t.isIntersecting&&I()},{root:null,rootMargin:"200px",threshold:0}),V.value&&b.observe(V.value)}),B(V,(a,e)=>{e&&b&&b.unobserve(e),a&&b&&b.observe(a)}),(a,e)=>(o(),l(C,null,[T(E(O),{title:"Movies"}),T(G,{breadcrumbs:[{title:"Dashboard",href:"/dashboard"},{title:"Movies",href:"/admin/movies"}]},{default:X(()=>[s("div",W,[s("div",J,[s("div",K,[n(s("input",{class:"w-full rounded-md border border-gray-300 bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-primary",type:"text",placeholder:"Search movies in your library…","aria-label":"Search movies in your library","onUpdate:modelValue":e[0]||(e[0]=t=>d.value=t),onInput:A},null,544),[[u,d.value]])]),s("div",Q,[n(s("select",{"onUpdate:modelValue":e[1]||(e[1]=t=>c.value=t),onChange:i,class:"w-full rounded-md border px-3 py-2 text-sm","aria-label":"Sort movies"},[...e[9]||(e[9]=[s("option",{value:"title_asc"},"Title A → Z",-1),s("option",{value:"title_desc"},"Title Z → A",-1),s("option",{value:"newest"},"Newest",-1),s("option",{value:"oldest"},"Oldest",-1),s("option",{value:"year_asc"},"Year ↑",-1),s("option",{value:"year_desc"},"Year ↓",-1)])],544),[[Z,c.value]])]),s("div",ee,[n(s("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>v.value=t),onChange:i,class:"w-full rounded-md border px-3 py-2 text-sm",type:"text",placeholder:"Genre","aria-label":"Filter by genre"},null,544),[[u,v.value]])]),s("div",ae,[s("div",te,[n(s("input",{"onUpdate:modelValue":e[3]||(e[3]=t=>p.value=t),onChange:i,class:"w-full rounded-md border px-3 py-2 text-sm",type:"number",placeholder:"Year min","aria-label":"Minimum year"},null,544),[[u,p.value]]),n(s("input",{"onUpdate:modelValue":e[4]||(e[4]=t=>f.value=t),onChange:i,class:"w-full rounded-md border px-3 py-2 text-sm",type:"number",placeholder:"Year max","aria-label":"Maximum year"},null,544),[[u,f.value]])])]),s("div",se,[n(s("input",{"onUpdate:modelValue":e[5]||(e[5]=t=>m.value=t),onChange:i,class:"w-full rounded-md border px-3 py-2 text-sm",type:"text",placeholder:"Rating","aria-label":"Filter by rating"},null,544),[[u,m.value]])]),s("div",re,[n(s("input",{"onUpdate:modelValue":e[6]||(e[6]=t=>g.value=t),onChange:i,class:"w-full rounded-md border px-3 py-2 text-sm",type:"text",placeholder:"Actor","aria-label":"Filter by actor"},null,544),[[u,g.value]])]),s("div",le,[n(s("input",{"onUpdate:modelValue":e[7]||(e[7]=t=>h.value=t),onChange:i,class:"w-full rounded-md border px-3 py-2 text-sm",type:"text",placeholder:"Director","aria-label":"Filter by director"},null,544),[[u,h.value]])]),s("div",oe,[n(s("input",{"onUpdate:modelValue":e[8]||(e[8]=t=>y.value=t),onChange:i,class:"w-full rounded-md border px-3 py-2 text-sm",type:"text",placeholder:"Studio","aria-label":"Filter by studio"},null,544),[[u,y.value]])]),e[10]||(e[10]=s("div",{class:"md:col-span-12 flex justify-end"},[s("a",{href:"/admin/movies/add",class:"shrink-0 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:opacity-90"},"Add")],-1))]),M.value?(o(),l("div",ne,P(M.value),1)):S("",!0),s("ul",{class:"divide-y divide-muted-foreground/20","aria-busy":x.value?"true":"false"},[(o(!0),l(C,null,z(_.value,t=>(o(),l("li",{key:t.id,class:"py-1"},[s("a",{href:`/movies/${t.id}`,class:"flex gap-3 rounded px-2 py-2 hover:bg-muted/40 focus:bg-muted/40 focus:outline-none"},[s("div",de,[t.poster_url?(o(),l("img",{key:0,src:t.poster_url,alt:`Poster for ${t.title}`,loading:"lazy",class:"h-full w-full object-cover"},null,8,ce)):S("",!0)]),s("div",ve,[s("div",me,[s("div",pe,P(t.title),1),s("div",fe,P(t.year??""),1)]),s("div",ge,[t.rating?(o(),l("span",he,P(t.rating),1)):S("",!0),t.genres?.length?(o(),l("span",ye,P(t.genres.map(w=>w.name).join(", ")),1)):S("",!0)]),s("div",xe,P(R(t.description)),1)])],8,ue)]))),128))],8,ie),s("div",{ref_key:"sentinel",ref:V,class:"py-6 text-center text-sm text-muted-foreground"},[x.value?(o(),l(C,{key:0},[q("Loading…")],64)):!j.value&&_.value.length>0?(o(),l(C,{key:1},[q("End of results")],64)):!_.value.length&&!x.value?(o(),l(C,{key:2},[q("No results")],64)):S("",!0)],512)])]),_:1})],64))}}),Le=H(_e,[["__scopeId","data-v-7fa35049"]]);export{Le as default}; diff --git a/public/build/assets/Login-4gIV6O-Y.js b/public/build/assets/Login-4gIV6O-Y.js new file mode 100644 index 0000000..82d6d8a --- /dev/null +++ b/public/build/assets/Login-4gIV6O-Y.js @@ -0,0 +1 @@ +import{_ as z}from"./InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js";import{_ as F}from"./TextLink.vue_vue_type_script_setup_true_lang-JYycsYY3.js";import{P as A,c as U,_ as L}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{c as K,u as G}from"./VisuallyHidden-Cu70tzB6.js";import{t as H,u as J,a as P,b as Q}from"./useForwardExpose-BhawR5VU.js";import{c as _,d as k,e as W,E as X,k as g,o as b,w as f,f as d,u as r,G as q,H as Y,i as w,B as I,z as Z,y as ee,I as te,a as R,h as ae,t as re,A as se,b as $,l as x}from"./app-CClrM5Yi.js";import{i as oe,u as ie,a as ne,g as le,w as ue,f as de,P as ce}from"./RovingFocusGroup-CNFroA6Y.js";import{V as fe}from"./VisuallyHiddenInput-Drd3EMOd.js";import{C as pe}from"./check-BNffy8wt.js";import{_ as E}from"./Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js";import{_ as B}from"./Label.vue_vue_type_script_setup_true_lang-Dbqibcwo.js";import{_ as me}from"./Spinner.vue_vue_type_script_setup_true_lang-BPOcqWqa.js";import{_ as ye}from"./AuthLayout.vue_vue_type_script_setup_true_lang-B14CUTB5.js";import{q as be,r as ve}from"./index-C4J_hXM0.js";import{r as he}from"./index-vZYIBGLo.js";import"./createLucideIcon-ZFd4jktC.js";import"./index-BCC4ahRc.js";function O(t){return typeof t=="string"?`'${t}'`:new ge().serialize(t)}const ge=(function(){class t{#e=new Map;compare(e,a){const s=typeof e,l=typeof a;return s==="string"&&l==="string"?e.localeCompare(a):s==="number"&&l==="number"?e-a:String.prototype.localeCompare.call(this.serialize(e,!0),this.serialize(a,!0))}serialize(e,a){if(e===null)return"null";switch(typeof e){case"string":return a?e:`'${e}'`;case"bigint":return`${e}n`;case"object":return this.$object(e);case"function":return this.$function(e)}return String(e)}serializeObject(e){const a=Object.prototype.toString.call(e);if(a!=="[object Object]")return this.serializeBuiltInType(a.length<10?`unknown:${a}`:a.slice(8,-1),e);const s=e.constructor,l=s===Object||s===void 0?"":s.name;if(l!==""&&globalThis[l]===s)return this.serializeBuiltInType(l,e);if(typeof e.toJSON=="function"){const i=e.toJSON();return l+(i!==null&&typeof i=="object"?this.$object(i):`(${this.serialize(i)})`)}return this.serializeObjectEntries(l,Object.entries(e))}serializeBuiltInType(e,a){const s=this["$"+e];if(s)return s.call(this,a);if(typeof a?.entries=="function")return this.serializeObjectEntries(e,a.entries());throw new Error(`Cannot serialize ${e}`)}serializeObjectEntries(e,a){const s=Array.from(a).sort((i,c)=>this.compare(i[0],c[0]));let l=`${e}{`;for(let i=0;ithis.compare(a,s)))}`}$Map(e){return this.serializeObjectEntries("Map",e.entries())}}for(const o of["Error","RegExp","URL"])t.prototype["$"+o]=function(e){return`${o}(${e})`};for(const o of["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array"])t.prototype["$"+o]=function(e){return`${o}[${e.join(",")}]`};for(const o of["BigInt64Array","BigUint64Array"])t.prototype["$"+o]=function(e){return`${o}[${e.join("n,")}${e.length>0?"n":""}]`};return t})();function S(t,o){return t===o||O(t)===O(o)}function V(t){return t==null}function T(t,o){return V(t)?!1:Array.isArray(t)?t.some(e=>S(e,o)):S(t,o)}function _e(t){return _(()=>H(t)?!!J(t)?.closest("form"):!0)}var $e=k({__name:"RovingFocusItem",props:{tabStopId:{type:String,required:!1},focusable:{type:Boolean,required:!1,default:!0},active:{type:Boolean,required:!1},allowShiftKey:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(t){const o=t,e=oe(),a=ie(),s=_(()=>o.tabStopId||a),l=_(()=>e.currentTabStopId.value===s.value),{getItems:i,CollectionItem:c}=ne();W(()=>{o.focusable&&e.onFocusableItemAdd()}),X(()=>{o.focusable&&e.onFocusableItemRemove()});function v(n){if(n.key==="Tab"&&n.shiftKey){e.onItemShiftTab();return}if(n.target!==n.currentTarget)return;const p=le(n,e.orientation.value,e.dir.value);if(p!==void 0){if(n.metaKey||n.ctrlKey||n.altKey||!o.allowShiftKey&&n.shiftKey)return;n.preventDefault();let m=[...i().map(h=>h.ref).filter(h=>h.dataset.disabled!=="")];if(p==="last")m.reverse();else if(p==="prev"||p==="next"){p==="prev"&&m.reverse();const h=m.indexOf(n.currentTarget);m=e.loop.value?ue(m,h+1):m.slice(h+1)}Y(()=>de(m))}}return(n,p)=>(b(),g(r(c),null,{default:f(()=>[d(r(A),{tabindex:l.value?0:-1,"data-orientation":r(e).orientation.value,"data-active":n.active?"":void 0,"data-disabled":n.focusable?void 0:"",as:n.as,"as-child":n.asChild,onMousedown:p[0]||(p[0]=m=>{n.focusable?r(e).onItemFocus(s.value):m.preventDefault()}),onFocus:p[1]||(p[1]=m=>r(e).onItemFocus(s.value)),onKeydown:v},{default:f(()=>[q(n.$slots,"default")]),_:3},8,["tabindex","data-orientation","data-active","data-disabled","as","as-child"])]),_:3}))}}),xe=$e;const[we]=K("CheckboxGroupRoot");function C(t){return t==="indeterminate"}function M(t){return C(t)?"indeterminate":t?"checked":"unchecked"}const[ke,Ce]=K("CheckboxRoot");var qe=k({inheritAttrs:!1,__name:"CheckboxRoot",props:{defaultValue:{type:[Boolean,String],required:!1},modelValue:{type:[Boolean,String,null],required:!1,default:void 0},disabled:{type:Boolean,required:!1},value:{type:null,required:!1,default:"on"},id:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:modelValue"],setup(t,{emit:o}){const e=t,a=o,{forwardRef:s,currentElement:l}=P(),i=we(null),c=Q(e,"modelValue",a,{defaultValue:e.defaultValue,passive:e.modelValue===void 0}),v=_(()=>i?.disabled.value||e.disabled),n=_(()=>V(i?.modelValue.value)?c.value==="indeterminate"?"indeterminate":c.value:T(i.modelValue.value,e.value));function p(){if(V(i?.modelValue.value))c.value=C(c.value)?!0:!c.value;else{const u=[...i.modelValue.value||[]];if(T(u,e.value)){const j=u.findIndex(N=>S(N,e.value));u.splice(j,1)}else u.push(e.value);i.modelValue.value=u}}const m=_e(l),h=_(()=>e.id&&l.value?document.querySelector(`[for="${e.id}"]`)?.innerText:void 0);return Ce({disabled:v,state:n}),(u,j)=>(b(),g(te(r(i)?.rovingFocus.value?r(xe):r(A)),I(u.$attrs,{id:u.id,ref:r(s),role:"checkbox","as-child":u.asChild,as:u.as,type:u.as==="button"?"button":void 0,"aria-checked":r(C)(n.value)?"mixed":n.value,"aria-required":u.required,"aria-label":u.$attrs["aria-label"]||h.value,"data-state":r(M)(n.value),"data-disabled":v.value?"":void 0,disabled:v.value,focusable:r(i)?.rovingFocus.value?!v.value:void 0,onKeydown:Z(ee(()=>{},["prevent"]),["enter"]),onClick:p}),{default:f(()=>[q(u.$slots,"default",{modelValue:r(c),state:n.value}),r(m)&&u.name&&!r(i)?(b(),g(r(fe),{key:0,type:"checkbox",checked:!!n.value,name:u.name,value:u.value,disabled:v.value,required:u.required},null,8,["checked","name","value","disabled","required"])):w("v-if",!0)]),_:3},16,["id","as-child","as","type","aria-checked","aria-required","aria-label","data-state","data-disabled","disabled","focusable","onKeydown"]))}}),Ie=qe,Be=k({__name:"CheckboxIndicator",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(t){const{forwardRef:o}=P(),e=ke();return(a,s)=>(b(),g(r(ce),{present:a.forceMount||r(C)(r(e).state.value)||r(e).state.value===!0},{default:f(()=>[d(r(A),I({ref:r(o),"data-state":r(M)(r(e).state.value),"data-disabled":r(e).disabled.value?"":void 0,style:{pointerEvents:"none"},"as-child":a.asChild,as:a.as},a.$attrs),{default:f(()=>[q(a.$slots,"default")]),_:3},16,["data-state","data-disabled","as-child","as"])]),_:3},8,["present"]))}}),Se=Be;const Ve=k({__name:"Checkbox",props:{defaultValue:{type:[Boolean,String]},modelValue:{type:[Boolean,String,null]},disabled:{type:Boolean},value:{},id:{},asChild:{type:Boolean},as:{},name:{},required:{type:Boolean},class:{}},emits:["update:modelValue"],setup(t,{emit:o}){const e=t,a=o,s=_(()=>{const{class:i,...c}=e;return c}),l=G(s,a);return(i,c)=>(b(),g(r(Ie),I({"data-slot":"checkbox"},r(l),{class:r(U)("peer border-input data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",e.class)}),{default:f(()=>[d(r(Se),{"data-slot":"checkbox-indicator",class:"flex items-center justify-center text-current transition-none"},{default:f(()=>[q(i.$slots,"default",{},()=>[d(r(pe),{class:"size-3.5"})])]),_:3})]),_:3},16,["class"]))}}),y=t=>({url:y.url(t),method:"post"});y.definition={methods:["post"],url:"/login"};y.url=t=>y.definition.url+be(t);y.post=t=>({url:y.url(t),method:"post"});const D=t=>({action:y.url(t),method:"post"});D.post=t=>({action:y.url(t),method:"post"});y.form=D;Object.assign(y,y);const Ae={key:0,class:"mb-4 text-center text-sm font-medium text-green-600"},je={class:"grid gap-6"},ze={class:"grid gap-2"},Fe={class:"grid gap-2"},Re={class:"flex items-center justify-between"},Ee={class:"flex items-center justify-between"},Oe={key:0,class:"text-center text-sm text-muted-foreground"},tt=k({__name:"Login",props:{status:{},canResetPassword:{type:Boolean},canRegister:{type:Boolean}},setup(t){return(o,e)=>(b(),g(ye,{title:"Log in to your account",description:"Enter your email and password below to log in"},{default:f(()=>[d(r(ae),{title:"Log in"}),t.status?(b(),R("div",Ae,re(t.status),1)):w("",!0),d(r(se),I(r(y).form(),{"reset-on-success":["password"],class:"flex flex-col gap-6"}),{default:f(({errors:a,processing:s})=>[$("div",je,[$("div",ze,[d(r(B),{for:"email"},{default:f(()=>[...e[0]||(e[0]=[x("Email address",-1)])]),_:1}),d(r(E),{id:"email",type:"email",name:"email",required:"",autofocus:"",tabindex:1,autocomplete:"email",placeholder:"email@example.com"}),d(z,{message:a.email},null,8,["message"])]),$("div",Fe,[$("div",Re,[d(r(B),{for:"password"},{default:f(()=>[...e[1]||(e[1]=[x("Password",-1)])]),_:1}),t.canResetPassword?(b(),g(F,{key:0,href:r(he)(),class:"text-sm",tabindex:5},{default:f(()=>[...e[2]||(e[2]=[x(" Forgot password? ",-1)])]),_:1},8,["href"])):w("",!0)]),d(r(E),{id:"password",type:"password",name:"password",required:"",tabindex:2,autocomplete:"current-password",placeholder:"Password"}),d(z,{message:a.password},null,8,["message"])]),$("div",Ee,[d(r(B),{for:"remember",class:"flex items-center space-x-3"},{default:f(()=>[d(r(Ve),{id:"remember",name:"remember",tabindex:3}),e[3]||(e[3]=$("span",null,"Remember me",-1))]),_:1})]),d(r(L),{type:"submit",class:"mt-4 w-full",tabindex:4,disabled:s,"data-test":"login-button"},{default:f(()=>[s?(b(),g(r(me),{key:0})):w("",!0),e[4]||(e[4]=x(" Log in ",-1))]),_:2},1032,["disabled"])]),t.canRegister?(b(),R("div",Oe,[e[6]||(e[6]=x(" Don't have an account? ",-1)),d(F,{href:r(ve)(),tabindex:5},{default:f(()=>[...e[5]||(e[5]=[x("Sign up",-1)])]),_:1},8,["href"])])):w("",!0)]),_:1},16)]),_:1}))}});export{tt as default}; diff --git a/public/build/assets/Password-Cz_oOx7m.js b/public/build/assets/Password-Cz_oOx7m.js new file mode 100644 index 0000000..759e850 --- /dev/null +++ b/public/build/assets/Password-Cz_oOx7m.js @@ -0,0 +1 @@ +import{d as y,k as v,w as d,f as s,u as t,h as b,b as i,A as q,B as Q,l as u,T as P,q as $,L as x,o as C}from"./app-CClrM5Yi.js";import{q as _}from"./index-C4J_hXM0.js";import{_ as m}from"./InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js";import{_ as k}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{b as N,_ as T,a as B}from"./Layout.vue_vue_type_script_setup_true_lang-ROf3tZlv.js";import{_ as S}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{_ as l}from"./Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js";import{_ as p}from"./Label.vue_vue_type_script_setup_true_lang-Dbqibcwo.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./createLucideIcon-ZFd4jktC.js";import"./index--H2rh_A_.js";const r=e=>({url:r.url(e),method:"get"});r.definition={methods:["get","head"],url:"/settings/password"};r.url=e=>r.definition.url+_(e);r.get=e=>({url:r.url(e),method:"get"});r.head=e=>({url:r.url(e),method:"head"});const c=e=>({action:r.url(e),method:"get"});c.get=e=>({action:r.url(e),method:"get"});c.head=e=>({action:r.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"HEAD",...e?.query??e?.mergeQuery??{}}}),method:"get"});r.form=c;const a=e=>({url:a.url(e),method:"put"});a.definition={methods:["put"],url:"/settings/password"};a.url=e=>a.definition.url+_(e);a.put=e=>({url:a.url(e),method:"put"});const f=e=>({action:a.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"PUT",...e?.query??e?.mergeQuery??{}}}),method:"post"});f.put=e=>({action:a.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"PUT",...e?.query??e?.mergeQuery??{}}}),method:"post"});a.form=f;const U={edit:r,update:a},V={class:"space-y-6"},A={class:"grid gap-2"},D={class:"grid gap-2"},E={class:"grid gap-2"},F={class:"flex items-center gap-4"},H={class:"text-sm text-neutral-600"},se=y({__name:"Password",setup(e){const w=[{title:"Password settings",href:N().url}];return(I,o)=>(C(),v(k,{breadcrumbs:w},{default:d(()=>[s(t(b),{title:"Password settings"}),s(T,null,{default:d(()=>[i("div",V,[s(B,{title:"Update password",description:"Ensure your account is using a long, random password to stay secure"}),s(t(q),Q(t(U).update.form(),{options:{preserveScroll:!0},"reset-on-success":"","reset-on-error":["password","password_confirmation","current_password"],class:"space-y-6"}),{default:d(({errors:n,processing:g,recentlySuccessful:h})=>[i("div",A,[s(t(p),{for:"current_password"},{default:d(()=>[...o[0]||(o[0]=[u("Current password",-1)])]),_:1}),s(t(l),{id:"current_password",name:"current_password",type:"password",class:"mt-1 block w-full",autocomplete:"current-password",placeholder:"Current password"}),s(m,{message:n.current_password},null,8,["message"])]),i("div",D,[s(t(p),{for:"password"},{default:d(()=>[...o[1]||(o[1]=[u("New password",-1)])]),_:1}),s(t(l),{id:"password",name:"password",type:"password",class:"mt-1 block w-full",autocomplete:"new-password",placeholder:"New password"}),s(m,{message:n.password},null,8,["message"])]),i("div",E,[s(t(p),{for:"password_confirmation"},{default:d(()=>[...o[2]||(o[2]=[u("Confirm password",-1)])]),_:1}),s(t(l),{id:"password_confirmation",name:"password_confirmation",type:"password",class:"mt-1 block w-full",autocomplete:"new-password",placeholder:"Confirm password"}),s(m,{message:n.password_confirmation},null,8,["message"])]),i("div",F,[s(t(S),{disabled:g,"data-test":"update-password-button"},{default:d(()=>[...o[3]||(o[3]=[u("Save password",-1)])]),_:1},8,["disabled"]),s(P,{"enter-active-class":"transition ease-in-out","enter-from-class":"opacity-0","leave-active-class":"transition ease-in-out","leave-to-class":"opacity-0"},{default:d(()=>[$(i("p",H," Saved. ",512),[[x,h]])]),_:2},1024)])]),_:1},16)])]),_:1})]),_:1}))}});export{se as default}; diff --git a/public/build/assets/PinInputSlot.vue_vue_type_script_setup_true_lang-D_qQ1GfR.js b/public/build/assets/PinInputSlot.vue_vue_type_script_setup_true_lang-D_qQ1GfR.js new file mode 100644 index 0000000..0d55d0b --- /dev/null +++ b/public/build/assets/PinInputSlot.vue_vue_type_script_setup_true_lang-D_qQ1GfR.js @@ -0,0 +1 @@ +import{a as O,c as G,b as H,g as T,u as Q,d as z}from"./VisuallyHidden-Cu70tzB6.js";import{P as A,c as R}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{d as w,Q as U,c as f,r as J,p as K,k as q,w as E,G as C,f as L,u as l,B as k,o as I,e as W,E as X,z as N,H as Y}from"./app-CClrM5Yi.js";import{a as Z,b as ee,r as S}from"./useForwardExpose-BhawR5VU.js";import{u as te}from"./useArrowNavigation-C6Y-ieo6.js";import{V as ae}from"./VisuallyHiddenInput-Drd3EMOd.js";const[le,oe]=G("PinInputRoot");var se=w({inheritAttrs:!1,__name:"PinInputRoot",props:{modelValue:{type:null,required:!1},defaultValue:{type:Array,required:!1},placeholder:{type:String,required:!1,default:""},mask:{type:Boolean,required:!1},otp:{type:Boolean,required:!1},type:{type:null,required:!1,default:"text"},dir:{type:String,required:!1},disabled:{type:Boolean,required:!1},id:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:modelValue","complete"],setup(i,{emit:o}){const t=i,s=o,{mask:u,otp:d,placeholder:h,type:B,disabled:y,dir:g}=U(t),{forwardRef:$}=Z(),b=O(g),p=ee(t,"modelValue",s,{defaultValue:t.defaultValue??[],passive:t.modelValue===void 0}),_=f(()=>Array.isArray(p.value)?[...p.value]:[]),v=J(new Set);function D(r){v.value.add(r)}const M=f(()=>t.type==="number"),V=f(()=>_.value.filter(m=>!!m||M.value&&m===0).length===v.value.size);return K(p,()=>{V.value&&s("complete",p.value)},{deep:!0}),oe({modelValue:p,currentModelValue:_,mask:u,otp:d,placeholder:h,type:B,dir:b,disabled:y,isCompleted:V,inputElements:v,onInputElementChange:D,isNumericMode:M}),(r,m)=>(I(),q(l(A),k(r.$attrs,{ref:l($),dir:l(b),"data-complete":V.value?"":void 0,"data-disabled":l(y)?"":void 0}),{default:E(()=>[C(r.$slots,"default",{modelValue:l(p)}),L(ae,{id:r.id,as:"input",feature:"focusable",tabindex:"-1",value:_.value.join(""),name:r.name??"",disabled:l(y),required:r.required,onFocus:m[0]||(m[0]=P=>Array.from(v.value)?.[0]?.focus())},null,8,["id","value","name","disabled","required"])]),_:3},16,["dir","data-complete","data-disabled"]))}}),ne=se,re=w({__name:"PinInputInput",props:{index:{type:Number,required:!0},disabled:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"input"}},setup(i){const o=i,t=le(),s=f(()=>Array.from(t.inputElements.value)),u=f(()=>t.currentModelValue.value[o.index]),d=f(()=>o.disabled||t.disabled.value),h=f(()=>t.otp.value),B=f(()=>t.mask.value),{primitiveElement:y,currentElement:g}=H();function $(e){const a=e.target;if((e.data?.length??0)>1){r(a.value);return}if(t.isNumericMode.value&&!/^\d*$/.test(a.value)){a.value=a.value.replace(/\D/g,"");return}a.value=e.data??"",P(o.index,a.value);const n=s.value[o.index+1];n&&n.focus()}function b(){const e=g.value;Y(()=>{e&&!e.value&&(e.placeholder=t.placeholder.value)})}function p(e){te(e,T(),void 0,{itemsArray:s.value,focus:!0,loop:!1,arrowKeyOptions:"horizontal",dir:t.dir.value})}function _(e){if(e.preventDefault(),e.target.value)P(o.index,"");else{const c=s.value[o.index-1];c&&(c.focus(),P(o.index-1,""))}}function v(e){e.key==="Delete"&&(e.preventDefault(),P(o.index,""))}function D(e){const a=e.target;a.setSelectionRange(1,1),a.value||(a.placeholder="")}function M(e){b()}function V(e){e.preventDefault();const a=e.clipboardData;if(!a)return;const n=a.getData("text");r(n)}function r(e){const a=[...t.currentModelValue.value],n=e.length>=s.value.length?0:o.index,c=Math.min(n+e.length,s.value.length);for(let x=n;x=0&&e[a]==="";)e.pop(),a--;return e}function P(e,a){const n=[...t.currentModelValue.value];if(t.isNumericMode.value){const c=+a;a===""||isNaN(c)?delete n[e]:n[e]=c}else n[e]=a;t.modelValue.value=m(n)}return K(u,()=>{u.value||b()}),W(()=>{t.onInputElementChange(g.value)}),X(()=>{t.inputElements?.value.delete(g.value)}),(e,a)=>(I(),q(l(A),{ref_key:"primitiveElement",ref:y,autocapitalize:"none",as:e.as,"as-child":e.asChild,autocomplete:h.value?"one-time-code":"false",type:B.value?"password":"text",inputmode:l(t).isNumericMode.value?"numeric":"text",pattern:l(t).isNumericMode.value?"[0-9]*":void 0,placeholder:l(t).placeholder.value,value:u.value,disabled:d.value,"data-disabled":d.value?"":void 0,"data-complete":l(t).isCompleted.value?"":void 0,"aria-label":`pin input ${e.index+1} of ${s.value.length}`,onInput:a[0]||(a[0]=n=>$(n)),onKeydown:[N(p,["left","right","up","down","home","end"]),N(_,["backspace"]),N(v,["delete"])],onFocus:D,onBlur:M,onPaste:V},{default:E(()=>[C(e.$slots,"default")]),_:3},8,["as","as-child","autocomplete","type","inputmode","pattern","placeholder","value","disabled","data-disabled","data-complete","aria-label"]))}}),ue=re;const ve=w({__name:"PinInput",props:{modelValue:{default:()=>[]},defaultValue:{},placeholder:{},mask:{type:Boolean},otp:{type:Boolean},type:{},dir:{},disabled:{type:Boolean},id:{},asChild:{type:Boolean},as:{},name:{},required:{type:Boolean},class:{}},emits:["update:modelValue","complete"],setup(i,{emit:o}){const t=i,s=o,u=S(t,"class"),d=Q(u,s);return(h,B)=>(I(),q(l(ne),k({"data-slot":"pin-input"},l(d),{class:l(R)("flex items-center gap-2 has-disabled:opacity-50 disabled:cursor-not-allowed",t.class)}),{default:E(()=>[C(h.$slots,"default")]),_:3},16,["class"]))}}),he=w({__name:"PinInputGroup",props:{asChild:{type:Boolean},as:{},class:{}},setup(i){const o=i,t=S(o,"class"),s=z(t);return(u,d)=>(I(),q(l(A),k({"data-slot":"pin-input-group"},l(s),{class:l(R)("flex items-center",o.class)}),{default:E(()=>[C(u.$slots,"default")]),_:3},16,["class"]))}}),ye=w({__name:"PinInputSlot",props:{index:{},disabled:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},setup(i){const o=i,t=S(o,"class"),s=z(t);return(u,d)=>(I(),q(l(ue),k({"data-slot":"pin-input-slot"},l(s),{class:l(R)("border-input focus:border-ring focus:ring-ring/50 focus:aria-invalid:ring-destructive/20 dark:bg-input/30 dark:focus:aria-invalid:ring-destructive/40 aria-invalid:border-destructive focus:aria-invalid:border-destructive relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none text-center first:rounded-l-md first:border-l last:rounded-r-md focus:z-10 focus:ring-[3px]",o.class)}),null,16,["class"]))}});export{ve as _,he as a,ye as b}; diff --git a/public/build/assets/Profile-DvBzD9G7.js b/public/build/assets/Profile-DvBzD9G7.js new file mode 100644 index 0000000..a148649 --- /dev/null +++ b/public/build/assets/Profile-DvBzD9G7.js @@ -0,0 +1 @@ +import{d as p,e as F,k as b,w as r,G as w,B as g,u as t,o as f,a as h,K as V,M as N,f as a,b as u,l as i,A as P,n as S,h as H,i as E,m as L,T as R,q as j,L as M}from"./app-CClrM5Yi.js";import{q as D}from"./index-C4J_hXM0.js";import{i as O,D as U,e as z,_ as G}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{s as K}from"./index-DZxzsgmi.js";import{a as Q,_ as W}from"./Layout.vue_vue_type_script_setup_true_lang-ROf3tZlv.js";import{_ as $}from"./InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js";import{P as Y,c as J,_ as v}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{_ as X,a as Z,b as ee,c as te,d as ae}from"./DialogTitle.vue_vue_type_script_setup_true_lang-Dg2xd9QK.js";import{a as se}from"./useForwardExpose-BhawR5VU.js";import{u as re}from"./RovingFocusGroup-CNFroA6Y.js";import{_ as k}from"./Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js";import{_ as C}from"./Label.vue_vue_type_script_setup_true_lang-Dbqibcwo.js";import"./VisuallyHidden-Cu70tzB6.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./createLucideIcon-ZFd4jktC.js";import"./index--H2rh_A_.js";var oe=p({__name:"DialogTrigger",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const n=e,o=O(),{forwardRef:s,currentElement:y}=se();return o.contentId||=re(void 0,"reka-dialog-content"),F(()=>{o.triggerElement.value=y.value}),(l,_)=>(f(),b(t(Y),g(n,{ref:t(s),type:l.as==="button"?"button":void 0,"aria-haspopup":"dialog","aria-expanded":t(o).open.value||!1,"aria-controls":t(o).open.value?t(o).contentId:void 0,"data-state":t(o).open.value?"open":"closed",onClick:t(o).onOpenToggle}),{default:r(()=>[w(l.$slots,"default")]),_:3},16,["type","aria-expanded","aria-controls","data-state","onClick"]))}}),le=oe;const d=e=>({url:d.url(e),method:"get"});d.definition={methods:["get","head"],url:"/settings/profile"};d.url=e=>d.definition.url+D(e);d.get=e=>({url:d.url(e),method:"get"});d.head=e=>({url:d.url(e),method:"head"});const q=e=>({action:d.url(e),method:"get"});q.get=e=>({action:d.url(e),method:"get"});q.head=e=>({action:d.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"HEAD",...e?.query??e?.mergeQuery??{}}}),method:"get"});d.form=q;const m=e=>({url:m.url(e),method:"patch"});m.definition={methods:["patch"],url:"/settings/profile"};m.url=e=>m.definition.url+D(e);m.patch=e=>({url:m.url(e),method:"patch"});const T=e=>({action:m.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"PATCH",...e?.query??e?.mergeQuery??{}}}),method:"post"});T.patch=e=>({action:m.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"PATCH",...e?.query??e?.mergeQuery??{}}}),method:"post"});m.form=T;const c=e=>({url:c.url(e),method:"delete"});c.definition={methods:["delete"],url:"/settings/profile"};c.url=e=>c.definition.url+D(e);c.delete=e=>({url:c.url(e),method:"delete"});const B=e=>({action:c.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"DELETE",...e?.query??e?.mergeQuery??{}}}),method:"post"});B.delete=e=>({action:c.url({[e?.mergeQuery?"mergeQuery":"query"]:{_method:"DELETE",...e?.query??e?.mergeQuery??{}}}),method:"post"});c.form=B;const I={edit:d,update:m,destroy:c},de=p({__name:"DialogClose",props:{asChild:{type:Boolean},as:{}},setup(e){const n=e;return(o,s)=>(f(),b(t(U),g({"data-slot":"dialog-close"},n),{default:r(()=>[w(o.$slots,"default")]),_:3},16))}}),ne=p({__name:"DialogFooter",props:{class:{}},setup(e){const n=e;return(o,s)=>(f(),h("div",{"data-slot":"dialog-footer",class:V(t(J)("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",n.class))},[w(o.$slots,"default")],2))}}),ue=p({__name:"DialogTrigger",props:{asChild:{type:Boolean},as:{}},setup(e){const n=e;return(o,s)=>(f(),b(t(le),g({"data-slot":"dialog-trigger"},n),{default:r(()=>[w(o.$slots,"default")]),_:3},16))}}),ie={class:"space-y-6"},me={class:"space-y-4 rounded-lg border border-red-100 bg-red-50 p-4 dark:border-red-200/10 dark:bg-red-700/10"},ce={class:"grid gap-2"},fe=p({__name:"DeleteUser",setup(e){const n=N("passwordInput");return(o,s)=>(f(),h("div",ie,[a(Q,{title:"Delete account",description:"Delete your account and all of its resources"}),u("div",me,[s[7]||(s[7]=u("div",{class:"relative space-y-0.5 text-red-600 dark:text-red-100"},[u("p",{class:"font-medium"},"Warning"),u("p",{class:"text-sm"}," Please proceed with caution, this cannot be undone. ")],-1)),a(t(ae),null,{default:r(()=>[a(t(ue),{"as-child":""},{default:r(()=>[a(t(v),{variant:"destructive","data-test":"delete-user-button"},{default:r(()=>[...s[1]||(s[1]=[i("Delete account",-1)])]),_:1})]),_:1}),a(t(X),null,{default:r(()=>[a(t(P),g(t(I).destroy.form(),{"reset-on-success":"",onError:s[0]||(s[0]=()=>n.value?.$el?.focus()),options:{preserveScroll:!0},class:"space-y-6"}),{default:r(({errors:y,processing:l,reset:_,clearErrors:x})=>[a(t(Z),{class:"space-y-3"},{default:r(()=>[a(t(ee),null,{default:r(()=>[...s[2]||(s[2]=[i("Are you sure you want to delete your account?",-1)])]),_:1}),a(t(te),null,{default:r(()=>[...s[3]||(s[3]=[i(" Once your account is deleted, all of its resources and data will also be permanently deleted. Please enter your password to confirm you would like to permanently delete your account. ",-1)])]),_:1})]),_:1}),u("div",ce,[a(t(C),{for:"password",class:"sr-only"},{default:r(()=>[...s[4]||(s[4]=[i("Password",-1)])]),_:1}),a(t(k),{id:"password",type:"password",name:"password",ref_key:"passwordInput",ref:n,placeholder:"Password"},null,512),a($,{message:y.password},null,8,["message"])]),a(t(ne),{class:"gap-2"},{default:r(()=>[a(t(de),{"as-child":""},{default:r(()=>[a(t(v),{variant:"secondary",onClick:()=>{x(),_()}},{default:r(()=>[...s[5]||(s[5]=[i(" Cancel ",-1)])]),_:1},8,["onClick"])]),_:2},1024),a(t(v),{type:"submit",variant:"destructive",disabled:l,"data-test":"confirm-delete-user-button"},{default:r(()=>[...s[6]||(s[6]=[i(" Delete account ",-1)])]),_:1},8,["disabled"])]),_:2},1024)]),_:1},16)]),_:1})]),_:1})])]))}}),pe={class:"flex flex-col space-y-6"},_e={class:"grid gap-2"},ge={class:"grid gap-2"},ye={key:0},ve={class:"-mt-4 text-sm text-muted-foreground"},he={key:0,class:"mt-2 text-sm font-medium text-green-600"},be={class:"flex items-center gap-4"},we={class:"text-sm text-neutral-600"},Se=p({__name:"Profile",props:{mustVerifyEmail:{type:Boolean},status:{}},setup(e){const n=[{title:"Profile settings",href:z().url}],s=S().props.auth.user;return(y,l)=>(f(),b(G,{breadcrumbs:n},{default:r(()=>[a(t(H),{title:"Profile settings"}),a(W,null,{default:r(()=>[u("div",pe,[a(Q,{title:"Profile information",description:"Update your name and email address"}),a(t(P),g(t(I).update.form(),{class:"space-y-6"}),{default:r(({errors:_,processing:x,recentlySuccessful:A})=>[u("div",_e,[a(t(C),{for:"name"},{default:r(()=>[...l[0]||(l[0]=[i("Name",-1)])]),_:1}),a(t(k),{id:"name",class:"mt-1 block w-full",name:"name","default-value":t(s).name,required:"",autocomplete:"name",placeholder:"Full name"},null,8,["default-value"]),a($,{class:"mt-2",message:_.name},null,8,["message"])]),u("div",ge,[a(t(C),{for:"email"},{default:r(()=>[...l[1]||(l[1]=[i("Email address",-1)])]),_:1}),a(t(k),{id:"email",type:"email",class:"mt-1 block w-full",name:"email","default-value":t(s).email,required:"",autocomplete:"username",placeholder:"Email address"},null,8,["default-value"]),a($,{class:"mt-2",message:_.email},null,8,["message"])]),e.mustVerifyEmail&&!t(s).email_verified_at?(f(),h("div",ye,[u("p",ve,[l[3]||(l[3]=i(" Your email address is unverified. ",-1)),a(t(L),{href:t(K)(),as:"button",class:"text-foreground underline decoration-neutral-300 underline-offset-4 transition-colors duration-300 ease-out hover:decoration-current! dark:decoration-neutral-500"},{default:r(()=>[...l[2]||(l[2]=[i(" Click here to resend the verification email. ",-1)])]),_:1},8,["href"])]),e.status==="verification-link-sent"?(f(),h("div",he," A new verification link has been sent to your email address. ")):E("",!0)])):E("",!0),u("div",be,[a(t(v),{disabled:x,"data-test":"update-profile-button"},{default:r(()=>[...l[4]||(l[4]=[i("Save",-1)])]),_:1},8,["disabled"]),a(R,{"enter-active-class":"transition ease-in-out","enter-from-class":"opacity-0","leave-active-class":"transition ease-in-out","leave-to-class":"opacity-0"},{default:r(()=>[j(u("p",we," Saved. ",512),[[M,A]])]),_:2},1024)])]),_:1},16)]),a(fe)]),_:1})]),_:1}))}});export{Se as default}; diff --git a/public/build/assets/Register-kQGfWF-K.js b/public/build/assets/Register-kQGfWF-K.js new file mode 100644 index 0000000..0fdc821 --- /dev/null +++ b/public/build/assets/Register-kQGfWF-K.js @@ -0,0 +1 @@ +import{_ as n}from"./InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js";import{_ as g}from"./TextLink.vue_vue_type_script_setup_true_lang-JYycsYY3.js";import{_ as w}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{_ as l}from"./Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js";import{_ as p}from"./Label.vue_vue_type_script_setup_true_lang-Dbqibcwo.js";import{_ as x}from"./Spinner.vue_vue_type_script_setup_true_lang-BPOcqWqa.js";import{_ as b}from"./AuthLayout.vue_vue_type_script_setup_true_lang-B14CUTB5.js";import{q as y,l as h}from"./index-C4J_hXM0.js";import{d as v,k as f,w as r,f as e,u as a,h as C,A as $,B as q,b as d,l as i,i as N,o as _}from"./app-CClrM5Yi.js";import"./useForwardExpose-BhawR5VU.js";import"./createLucideIcon-ZFd4jktC.js";const t=o=>({url:t.url(o),method:"post"});t.definition={methods:["post"],url:"/register"};t.url=o=>t.definition.url+y(o);t.post=o=>({url:t.url(o),method:"post"});const c=o=>({action:t.url(o),method:"post"});c.post=o=>({action:t.url(o),method:"post"});t.form=c;Object.assign(t,t);const k={class:"grid gap-6"},B={class:"grid gap-2"},P={class:"grid gap-2"},V={class:"grid gap-2"},A={class:"grid gap-2"},E={class:"text-center text-sm text-muted-foreground"},K=v({__name:"Register",setup(o){return(F,s)=>(_(),f(b,{title:"Create an account",description:"Enter your details below to create your account"},{default:r(()=>[e(a(C),{title:"Register"}),e(a($),q(a(t).form(),{"reset-on-success":["password","password_confirmation"],class:"flex flex-col gap-6"}),{default:r(({errors:m,processing:u})=>[d("div",k,[d("div",B,[e(a(p),{for:"name"},{default:r(()=>[...s[0]||(s[0]=[i("Name",-1)])]),_:1}),e(a(l),{id:"name",type:"text",required:"",autofocus:"",tabindex:1,autocomplete:"name",name:"name",placeholder:"Full name"}),e(n,{message:m.name},null,8,["message"])]),d("div",P,[e(a(p),{for:"email"},{default:r(()=>[...s[1]||(s[1]=[i("Email address",-1)])]),_:1}),e(a(l),{id:"email",type:"email",required:"",tabindex:2,autocomplete:"email",name:"email",placeholder:"email@example.com"}),e(n,{message:m.email},null,8,["message"])]),d("div",V,[e(a(p),{for:"password"},{default:r(()=>[...s[2]||(s[2]=[i("Password",-1)])]),_:1}),e(a(l),{id:"password",type:"password",required:"",tabindex:3,autocomplete:"new-password",name:"password",placeholder:"Password"}),e(n,{message:m.password},null,8,["message"])]),d("div",A,[e(a(p),{for:"password_confirmation"},{default:r(()=>[...s[3]||(s[3]=[i("Confirm password",-1)])]),_:1}),e(a(l),{id:"password_confirmation",type:"password",required:"",tabindex:4,autocomplete:"new-password",name:"password_confirmation",placeholder:"Confirm password"}),e(n,{message:m.password_confirmation},null,8,["message"])]),e(a(w),{type:"submit",class:"mt-2 w-full",tabindex:"5",disabled:u,"data-test":"register-user-button"},{default:r(()=>[u?(_(),f(a(x),{key:0})):N("",!0),s[4]||(s[4]=i(" Create account ",-1))]),_:2},1032,["disabled"])]),d("div",E,[s[6]||(s[6]=i(" Already have an account? ",-1)),e(g,{href:a(h)(),class:"underline underline-offset-4",tabindex:6},{default:r(()=>[...s[5]||(s[5]=[i("Log in",-1)])]),_:1},8,["href"])])]),_:1},16)]),_:1}))}});export{K as default}; diff --git a/public/build/assets/ResetPassword-BPOrjW9k.js b/public/build/assets/ResetPassword-BPOrjW9k.js new file mode 100644 index 0000000..0d6c7e7 --- /dev/null +++ b/public/build/assets/ResetPassword-BPOrjW9k.js @@ -0,0 +1 @@ +import{_ as d}from"./InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js";import{_ as c}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{_ as i}from"./Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js";import{_ as n}from"./Label.vue_vue_type_script_setup_true_lang-Dbqibcwo.js";import{_ as g}from"./Spinner.vue_vue_type_script_setup_true_lang-BPOcqWqa.js";import{_ as k}from"./AuthLayout.vue_vue_type_script_setup_true_lang-B14CUTB5.js";import{u as b}from"./index-vZYIBGLo.js";import{d as y,r as V,k as u,w as o,f as s,u as a,h as v,A as P,B as $,b as r,l as m,i as C,o as w}from"./app-CClrM5Yi.js";import"./useForwardExpose-BhawR5VU.js";import"./createLucideIcon-ZFd4jktC.js";import"./index-C4J_hXM0.js";import"./index-BCC4ahRc.js";const x={class:"grid gap-6"},B={class:"grid gap-2"},N={class:"grid gap-2"},R={class:"grid gap-2"},K=y({__name:"ResetPassword",props:{token:{},email:{}},setup(l){const p=V(l.email);return(A,e)=>(w(),u(k,{title:"Reset password",description:"Please enter your new password below"},{default:o(()=>[s(a(v),{title:"Reset password"}),s(a(P),$(a(b).form(),{transform:t=>({...t,token:l.token,email:l.email}),"reset-on-success":["password","password_confirmation"]}),{default:o(({errors:t,processing:f})=>[r("div",x,[r("div",B,[s(a(n),{for:"email"},{default:o(()=>[...e[1]||(e[1]=[m("Email",-1)])]),_:1}),s(a(i),{id:"email",type:"email",name:"email",autocomplete:"email",modelValue:p.value,"onUpdate:modelValue":e[0]||(e[0]=_=>p.value=_),class:"mt-1 block w-full",readonly:""},null,8,["modelValue"]),s(d,{message:t.email,class:"mt-2"},null,8,["message"])]),r("div",N,[s(a(n),{for:"password"},{default:o(()=>[...e[2]||(e[2]=[m("Password",-1)])]),_:1}),s(a(i),{id:"password",type:"password",name:"password",autocomplete:"new-password",class:"mt-1 block w-full",autofocus:"",placeholder:"Password"}),s(d,{message:t.password},null,8,["message"])]),r("div",R,[s(a(n),{for:"password_confirmation"},{default:o(()=>[...e[3]||(e[3]=[m(" Confirm Password ",-1)])]),_:1}),s(a(i),{id:"password_confirmation",type:"password",name:"password_confirmation",autocomplete:"new-password",class:"mt-1 block w-full",placeholder:"Confirm password"}),s(d,{message:t.password_confirmation},null,8,["message"])]),s(a(c),{type:"submit",class:"mt-4 w-full",disabled:f,"data-test":"reset-password-button"},{default:o(()=>[f?(w(),u(a(g),{key:0})):C("",!0),e[4]||(e[4]=m(" Reset password ",-1))]),_:2},1032,["disabled"])])]),_:1},16,["transform"])]),_:1}))}});export{K as default}; diff --git a/public/build/assets/RovingFocusGroup-CNFroA6Y.js b/public/build/assets/RovingFocusGroup-CNFroA6Y.js new file mode 100644 index 0000000..2c9f266 --- /dev/null +++ b/public/build/assets/RovingFocusGroup-CNFroA6Y.js @@ -0,0 +1,3 @@ +import{a4 as L,r as E,p as w,H as q,E as B,c as b,d as M,Q as x,a5 as G,a6 as C,a7 as V,a8 as j,R as K,a9 as Y,k as z,o as W,w as _,f as H,u as T,G as Q}from"./app-CClrM5Yi.js";import{r as J,S as O,P as X}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{q as Z,i as ee,u as te,b as ne}from"./useForwardExpose-BhawR5VU.js";import{b as R,g as P,c as ae,a as oe}from"./VisuallyHidden-Cu70tzB6.js";function Ee(t,e="reka"){return`${e}-${L?.()}`}function re(t,e){const i=E(t);function a(d){return e[i.value][d]??i.value}return{state:i,dispatch:d=>{i.value=a(d)}}}function ie(t,e){const i=E({}),a=E("none"),s=E(t),d=t.value?"mounted":"unmounted";let c;const v=e.value?.ownerDocument.defaultView??Z,{state:m,dispatch:u}=re(d,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}}),n=o=>{if(ee){const r=new CustomEvent(o,{bubbles:!1,cancelable:!1});e.value?.dispatchEvent(r)}};w(t,async(o,r)=>{const h=r!==o;if(await q(),h){const I=a.value,p=N(e.value);o?(u("MOUNT"),n("enter"),p==="none"&&n("after-enter")):p==="none"||p==="undefined"||i.value?.display==="none"?(u("UNMOUNT"),n("leave"),n("after-leave")):r&&I!==p?(u("ANIMATION_OUT"),n("leave")):(u("UNMOUNT"),n("after-leave"))}},{immediate:!0});const l=o=>{const r=N(e.value),h=r.includes(CSS.escape(o.animationName)),I=m.value==="mounted"?"enter":"leave";if(o.target===e.value&&h&&(n(`after-${I}`),u("ANIMATION_END"),!s.value)){const p=e.value.style.animationFillMode;e.value.style.animationFillMode="forwards",c=v?.setTimeout(()=>{e.value?.style.animationFillMode==="forwards"&&(e.value.style.animationFillMode=p)})}o.target===e.value&&r==="none"&&u("ANIMATION_END")},f=o=>{o.target===e.value&&(a.value=N(e.value))},A=w(e,(o,r)=>{o?(i.value=getComputedStyle(o),o.addEventListener("animationstart",f),o.addEventListener("animationcancel",l),o.addEventListener("animationend",l)):(u("ANIMATION_END"),c!==void 0&&v?.clearTimeout(c),r?.removeEventListener("animationstart",f),r?.removeEventListener("animationcancel",l),r?.removeEventListener("animationend",l))},{immediate:!0}),g=w(m,()=>{const o=N(e.value);a.value=m.value==="mounted"?o:"none"});return B(()=>{A(),g()}),{isPresent:b(()=>["mounted","unmountSuspended"].includes(m.value))}}function N(t){return t&&getComputedStyle(t).animationName||"none"}var Ie=M({name:"Presence",props:{present:{type:Boolean,required:!0},forceMount:{type:Boolean}},slots:{},setup(t,{slots:e,expose:i}){const{present:a,forceMount:s}=x(t),d=E(),{isPresent:c}=ie(a,d);i({present:c});let v=e.default({present:c.value});v=J(v||[]);const m=G();if(v&&v?.length>1){const u=m?.parent?.type.name?`<${m.parent.type.name} />`:"component";throw new Error([`Detected an invalid children for \`${u}\` for \`Presence\` component.`,"","Note: Presence works similarly to `v-if` directly, but it waits for animation/transition to finished before unmounting. So it expect only one direct child of valid VNode type.","You can apply a few solutions:",["Provide a single child element so that `presence` directive attach correctly.","Ensure the first child is an actual element instead of a raw text node or comment node."].map(n=>` - ${n}`).join(` +`)].join(` +`))}return()=>s.value||a.value||c.value?C(e.default({present:c.value})[0],{ref:u=>{const n=te(u);return typeof n?.hasAttribute>"u"||(n?.hasAttribute("data-reka-popper-content-wrapper")?d.value=n.firstElementChild:d.value=n),n}}):null}});const U="data-reka-collection-item";function se(t={}){const{key:e="",isProvider:i=!1}=t,a=`${e}CollectionProvider`;let s;if(i){const n=E(new Map);s={collectionRef:E(),itemMap:n},V(a,s)}else s=j(a);const d=(n=!1)=>{const l=s.collectionRef.value;if(!l)return[];const f=Array.from(l.querySelectorAll(`[${U}]`)),g=Array.from(s.itemMap.value.values()).sort((S,o)=>f.indexOf(S.ref)-f.indexOf(o.ref));return n?g:g.filter(S=>S.ref.dataset.disabled!=="")},c=M({name:"CollectionSlot",setup(n,{slots:l}){const{primitiveElement:f,currentElement:A}=R();return w(A,()=>{s.collectionRef.value=A.value}),()=>C(O,{ref:f},l)}}),v=M({name:"CollectionItem",inheritAttrs:!1,props:{value:{validator:()=>!0}},setup(n,{slots:l,attrs:f}){const{primitiveElement:A,currentElement:g}=R();return K(S=>{if(g.value){const o=Y(g.value);s.itemMap.value.set(o,{ref:g.value,value:n.value}),S(()=>s.itemMap.value.delete(o))}}),()=>C(O,{...f,[U]:"",ref:A},l)}}),m=b(()=>Array.from(s.itemMap.value.values())),u=b(()=>s.itemMap.value.size);return{getItems:d,reactiveItems:m,itemMapSize:u,CollectionSlot:c,CollectionItem:v}}const ue="rovingFocusGroup.onEntryFocus",le={bubbles:!1,cancelable:!0},ce={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function de(t,e){return e!=="rtl"?t:t==="ArrowLeft"?"ArrowRight":t==="ArrowRight"?"ArrowLeft":t}function ye(t,e,i){const a=de(t.key,i);if(!(e==="vertical"&&["ArrowLeft","ArrowRight"].includes(a))&&!(e==="horizontal"&&["ArrowUp","ArrowDown"].includes(a)))return ce[a]}function fe(t,e=!1){const i=P();for(const a of t)if(a===i||(a.focus({preventScroll:e}),P()!==i))return}function Se(t,e){return t.map((i,a)=>t[(e+a)%t.length])}const[Te,me]=ae("RovingFocusGroup");var ve=M({__name:"RovingFocusGroup",props:{orientation:{type:String,required:!1,default:void 0},dir:{type:String,required:!1},loop:{type:Boolean,required:!1,default:!1},currentTabStopId:{type:[String,null],required:!1},defaultCurrentTabStopId:{type:String,required:!1},preventScrollOnEntryFocus:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["entryFocus","update:currentTabStopId"],setup(t,{expose:e,emit:i}){const a=t,s=i,{loop:d,orientation:c,dir:v}=x(a),m=oe(v),u=ne(a,"currentTabStopId",s,{defaultValue:a.defaultCurrentTabStopId,passive:a.currentTabStopId===void 0}),n=E(!1),l=E(!1),f=E(0),{getItems:A,CollectionSlot:g}=se({isProvider:!0});function S(r){const h=!l.value;if(r.currentTarget&&r.target===r.currentTarget&&h&&!n.value){const I=new CustomEvent(ue,le);if(r.currentTarget.dispatchEvent(I),s("entryFocus",I),!I.defaultPrevented){const p=A().map(y=>y.ref).filter(y=>y.dataset.disabled!==""),F=p.find(y=>y.getAttribute("data-active")===""),D=p.find(y=>y.getAttribute("data-highlighted")===""),$=p.find(y=>y.id===u.value),k=[F,D,$,...p].filter(Boolean);fe(k,a.preventScrollOnEntryFocus)}}l.value=!1}function o(){setTimeout(()=>{l.value=!1},1)}return e({getItems:A}),me({loop:d,dir:m,orientation:c,currentTabStopId:u,onItemFocus:r=>{u.value=r},onItemShiftTab:()=>{n.value=!0},onFocusableItemAdd:()=>{f.value++},onFocusableItemRemove:()=>{f.value--}}),(r,h)=>(W(),z(T(g),null,{default:_(()=>[H(T(X),{tabindex:n.value||f.value===0?-1:0,"data-orientation":T(c),as:r.as,"as-child":r.asChild,dir:T(m),style:{outline:"none"},onMousedown:h[0]||(h[0]=I=>l.value=!0),onMouseup:o,onFocus:S,onBlur:h[1]||(h[1]=I=>n.value=!1)},{default:_(()=>[Q(r.$slots,"default")]),_:3},8,["tabindex","data-orientation","as","as-child","dir"])]),_:3}))}}),Ne=ve;export{Ie as P,Ne as R,se as a,fe as f,ye as g,Te as i,Ee as u,Se as w}; diff --git a/public/build/assets/Show-B-qGUz9l.css b/public/build/assets/Show-B-qGUz9l.css new file mode 100644 index 0000000..622da8a --- /dev/null +++ b/public/build/assets/Show-B-qGUz9l.css @@ -0,0 +1 @@ +.fade-enter-active[data-v-dfdd9f1d],.fade-leave-active[data-v-dfdd9f1d]{transition:opacity .2s}.fade-enter-from[data-v-dfdd9f1d],.fade-leave-to[data-v-dfdd9f1d]{opacity:0} diff --git a/public/build/assets/Show-B81d5hyh.js b/public/build/assets/Show-B81d5hyh.js new file mode 100644 index 0000000..5ef2114 --- /dev/null +++ b/public/build/assets/Show-B81d5hyh.js @@ -0,0 +1 @@ +import{d as D,n as T,c as E,r as c,e as j,a as t,f as p,u as C,h as S,w as y,b as o,i as n,o as s,t as r,F as d,g as _,l as k,T as L}from"./app-CClrM5Yi.js";import{_ as M}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{_ as N}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./index-C4J_hXM0.js";import"./createLucideIcon-ZFd4jktC.js";const F={class:"flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4"},R={key:0,class:"text-sm text-muted-foreground"},V={key:1,class:"rounded-md border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200"},q={key:2,class:"grid grid-cols-1 gap-4 md:grid-cols-[160px,1fr]"},A={class:"order-first"},B={class:"h-[240px] w-[160px] overflow-hidden rounded bg-muted"},I=["src"],X={class:"flex min-w-0 flex-col"},P={class:"flex items-start justify-between gap-3"},z={class:"text-xl font-semibold"},G={class:"shrink-0 space-x-2"},H=["href"],K=["disabled"],O={key:0},U={key:1},W={class:"mt-1 text-sm text-muted-foreground"},J={key:0,class:"mr-2"},Q={key:1,class:"mr-2 rounded border px-1 py-0.5"},Y={key:2,class:"mr-2"},Z={key:3,class:"mr-2"},ee={key:0,class:"mt-2 text-sm"},te={class:"space-x-1"},se=["href"],oe={key:0},ae={key:1,class:"mt-1 text-sm"},ne={class:"space-x-1"},re=["href"],le={key:0},ie={key:2,class:"mt-1 text-sm"},de={class:"space-x-1"},ue=["href"],ce={key:0},me={key:3,class:"mt-1 text-sm"},ve={class:"space-x-1"},_e=["href"],he={key:0},fe={key:4,class:"mt-1 text-sm"},pe={key:5,class:"mt-1 text-sm"},ge={class:"mt-3 text-sm leading-6"},xe={key:0,class:"fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded bg-foreground px-3 py-2 text-sm text-background shadow-lg"},ye=D({__name:"Show",setup(ke){const b=T(),g=E(()=>b.props.movieId),h=c(!1),m=c(null),e=c(null),v=c(!1),f=c(!1),x=c("");async function w(){h.value=!0,m.value=null;try{const i=await fetch(`/api/movies/${g.value}`,{headers:{Accept:"application/json"},credentials:"same-origin"});if(!i.ok)throw new Error(`Failed: ${i.status}`);e.value=await i.json()}catch(i){m.value=i?.message??"Unexpected error"}finally{h.value=!1}}j(w);async function $(){if(e.value&&confirm(`Delete '${e.value.title}'? This cannot be undone.`)){v.value=!0;try{const i=await fetch(`/admin/movies/${e.value.id}`,{method:"DELETE",headers:{Accept:"application/json","X-Requested-With":"XMLHttpRequest","X-CSRF-TOKEN":document.querySelector('meta[name="csrf-token"]')?.content??""},credentials:"same-origin"});if(!i.ok)throw new Error(`Delete failed: ${i.status}`);window.location.href="/admin/movies"}catch(i){x.value=i?.message??"Delete failed",f.value=!0,setTimeout(()=>f.value=!1,2500)}finally{v.value=!1}}}return(i,l)=>(s(),t(d,null,[p(C(S),{title:e.value?.title??"Movie"},null,8,["title"]),p(M,{breadcrumbs:[{title:"Movies",href:"/movies"},{title:e.value?.title??"…",href:`/movies/${g.value}`}]},{default:y(()=>[o("div",F,[h.value?(s(),t("div",R,"Loading…")):m.value?(s(),t("div",V,r(m.value),1)):e.value?(s(),t("div",q,[o("div",A,[o("div",B,[e.value.poster_url?(s(),t("img",{key:0,src:e.value.poster_url,alt:"Poster",class:"h-full w-full object-cover"},null,8,I)):n("",!0)])]),o("div",X,[o("div",P,[o("h1",z,r(e.value.title),1),o("div",G,[o("a",{href:`/admin/movies/${e.value.id}/edit`,class:"rounded-md border px-3 py-1.5 text-xs hover:bg-muted"},"Edit",8,H),o("button",{onClick:$,disabled:v.value,class:"rounded-md border px-3 py-1.5 text-xs hover:bg-muted disabled:opacity-60"},[v.value?(s(),t("span",O,"Deleting…")):(s(),t("span",U,"Delete"))],8,K)])]),o("div",W,[e.value.year?(s(),t("span",J,r(e.value.year),1)):n("",!0),e.value.rating?(s(),t("span",Q,r(e.value.rating),1)):n("",!0),e.value.runtime?(s(),t("span",Y,r(e.value.runtime)+" min",1)):n("",!0),e.value.release_date?(s(),t("span",Z,"Released: "+r(e.value.release_date),1)):n("",!0)]),e.value.genres?.length?(s(),t("div",ee,[l[0]||(l[0]=o("strong",null,"Genres:",-1)),o("span",te,[(s(!0),t(d,null,_(e.value.genres,(a,u)=>(s(),t(d,{key:a.id},[o("a",{href:`/genres/${a.id}`,class:"underline-offset-2 hover:underline"},r(a.name),9,se),u(s(),t(d,{key:a.id},[o("a",{href:`/directors/${a.id}`,class:"underline-offset-2 hover:underline"},r(a.name),9,re),u(s(),t(d,{key:a.id},[o("a",{href:`/actors/${a.id}`,class:"underline-offset-2 hover:underline"},r(a.name),9,ue),u(s(),t(d,{key:a.id},[o("a",{href:`/studios/${a.id}`,class:"underline-offset-2 hover:underline"},r(a.name),9,_e),ua.name).join(", ")),1)])):n("",!0),e.value.languages?.length?(s(),t("div",pe,[l[5]||(l[5]=o("strong",null,"Languages:",-1)),k(" "+r(e.value.languages.map(a=>a.name).join(", ")),1)])):n("",!0),o("p",ge,r(e.value.description),1)])])):n("",!0),p(L,{name:"fade"},{default:y(()=>[f.value?(s(),t("div",xe,r(x.value),1)):n("",!0)]),_:1})])]),_:1},8,["breadcrumbs"])],64))}}),Me=N(ye,[["__scopeId","data-v-4dfe0470"]]);export{Me as default}; diff --git a/public/build/assets/Show-BCIzyp2I.js b/public/build/assets/Show-BCIzyp2I.js new file mode 100644 index 0000000..bc8a911 --- /dev/null +++ b/public/build/assets/Show-BCIzyp2I.js @@ -0,0 +1 @@ +import{d as R,n as B,c as I,r,e as E,p as z,a as o,f as w,u as D,h as O,w as M,b as e,i as u,o as l,t as i,q as N,v as X,s as Y,F as g,g as j,l as k,T as Z}from"./app-CClrM5Yi.js";import{_ as H}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{_ as W}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./index-C4J_hXM0.js";import"./createLucideIcon-ZFd4jktC.js";const G={class:"flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4"},J={key:0,class:"flex items-center gap-3"},K={class:"flex items-center gap-3"},Q={class:"min-w-0 flex-1"},ee={class:"truncate text-lg font-semibold"},te={class:"flex items-center gap-2"},se={key:1,class:"rounded-md border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200"},ae=["aria-busy"],oe=["href"],le={class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted"},re=["src","alt"],ne={class:"flex min-w-0 flex-1 flex-col"},ue={class:"flex items-center justify-between gap-2"},ie={class:"truncate font-medium"},de={class:"text-xs text-muted-foreground"},ce={class:"mt-1 text-xs text-muted-foreground"},ve={key:0,class:"mr-2 rounded border px-1 py-0.5"},fe={key:1},pe={class:"mt-2 text-sm text-foreground/90"},me={key:0,class:"fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded bg-foreground px-3 py-2 text-sm text-background shadow-lg"},ge=R({__name:"Show",setup(he){const A=B(),T=I(()=>A.props.entityId),d=r(""),c=r("title_asc"),v=r([]),C=r(0),P=r(1),h=r(1),n=r(!1),_=r(null),b=r(!1),S=r(""),p=r(null);let $=null;const q=I(()=>h.valueb.value=!1,2500)}finally{n.value=!1}}}function U(){clearTimeout($),$=setTimeout(()=>{h.value=1,x(!0)},300)}function V(){const a=new URL(window.location.href);d.value?a.searchParams.set("q",d.value):a.searchParams.delete("q"),c.value?a.searchParams.set("sort",c.value):a.searchParams.delete("sort"),window.history.replaceState({},"",a.toString()),h.value=1,x(!0)}async function F(){q.value&&(h.value+=1,await x(!1))}const y=r(null);let m=null;return E(()=>{const a=new URL(window.location.href);d.value=a.searchParams.get("q")??"",c.value=a.searchParams.get("sort")??"title_asc",x(!0),m=new IntersectionObserver(t=>{for(const s of t)s.isIntersecting&&F()},{root:null,rootMargin:"200px",threshold:0}),y.value&&m.observe(y.value)}),z(y,(a,t)=>{t&&m&&m.unobserve(t),a&&m&&m.observe(a)}),(a,t)=>(l(),o(g,null,[w(D(O),{title:p.value?.name?`${p.value.name} · Actor`:"Actor"},null,8,["title"]),w(H,{breadcrumbs:[{title:"Actors",href:"/actors"},{title:p.value?.name??"…",href:`/actors/${T.value}`}]},{default:M(()=>[e("div",G,[!p.value&&n.value?(l(),o("div",J,[...t[2]||(t[2]=[e("div",{class:"h-12 w-12 shrink-0 rounded-full bg-muted animate-pulse"},null,-1),e("div",{class:"h-4 w-40 rounded bg-muted animate-pulse"},null,-1)])])):u("",!0),e("div",K,[t[3]||(t[3]=e("div",{class:"h-12 w-12 shrink-0 rounded-full bg-muted"},null,-1)),e("div",Q,[e("h1",ee,i(p.value?.name??"…"),1)])]),e("div",te,[N(e("input",{class:"w-full rounded-md border border-gray-300 bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-primary",type:"text",placeholder:"Filter movies by title…","aria-label":"Filter movies by title","onUpdate:modelValue":t[0]||(t[0]=s=>d.value=s),onInput:U},null,544),[[X,d.value]]),N(e("select",{"onUpdate:modelValue":t[1]||(t[1]=s=>c.value=s),onChange:V,class:"w-44 shrink-0 rounded-md border px-3 py-2 text-sm","aria-label":"Sort movies"},[...t[4]||(t[4]=[e("option",{value:"title_asc"},"Title A → Z",-1),e("option",{value:"title_desc"},"Title Z → A",-1),e("option",{value:"newest"},"Newest",-1),e("option",{value:"oldest"},"Oldest",-1),e("option",{value:"year_asc"},"Year ↑",-1),e("option",{value:"year_desc"},"Year ↓",-1)])],544),[[Y,c.value]])]),_.value?(l(),o("div",se,i(_.value),1)):u("",!0),e("ul",{class:"divide-y divide-muted-foreground/20","aria-busy":n.value?"true":"false"},[(l(!0),o(g,null,j(v.value,s=>(l(),o("li",{key:s.id,class:"py-1"},[e("a",{href:`/movies/${s.id}`,class:"flex gap-3 rounded px-2 py-2 hover:bg-muted/40 focus:bg-muted/40 focus:outline-none"},[e("div",le,[s.poster_url?(l(),o("img",{key:0,src:s.poster_url,alt:`Poster for ${s.title}`,loading:"lazy",class:"h-full w-full object-cover"},null,8,re)):u("",!0)]),e("div",ne,[e("div",ue,[e("div",ie,i(s.title),1),e("div",de,i(s.year??""),1)]),e("div",ce,[s.rating?(l(),o("span",ve,i(s.rating),1)):u("",!0),s.genres?.length?(l(),o("span",fe,i(s.genres.map(f=>f.name).join(", ")),1)):u("",!0)]),e("div",pe,i(L(s.description)),1)])],8,oe)]))),128)),n.value&&v.value.length===0?(l(),o(g,{key:0},j(5,s=>e("li",{key:`s-${s}`,class:"py-1"},[...t[5]||(t[5]=[e("div",{class:"flex gap-3 rounded px-2 py-2"},[e("div",{class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted animate-pulse"}),e("div",{class:"flex min-w-0 flex-1 flex-col gap-2"},[e("div",{class:"h-4 w-1/3 rounded bg-muted animate-pulse"}),e("div",{class:"h-3 w-1/2 rounded bg-muted animate-pulse"}),e("div",{class:"h-3 w-2/3 rounded bg-muted animate-pulse"})])],-1)])])),64)):u("",!0)],8,ae),e("div",{ref_key:"sentinel",ref:y,class:"py-6 text-center text-sm text-muted-foreground"},[n.value?(l(),o(g,{key:0},[k("Loading…")],64)):!q.value&&v.value.length>0?(l(),o(g,{key:1},[k("End of results")],64)):!v.value.length&&!n.value?(l(),o(g,{key:2},[k("No results")],64)):u("",!0)],512),w(Z,{name:"fade"},{default:M(()=>[b.value?(l(),o("div",me,i(S.value),1)):u("",!0)]),_:1})])]),_:1},8,["breadcrumbs"])],64))}}),qe=W(ge,[["__scopeId","data-v-57497e98"]]);export{qe as default}; diff --git a/public/build/assets/Show-BGTgh0m1.js b/public/build/assets/Show-BGTgh0m1.js new file mode 100644 index 0000000..4bbb211 --- /dev/null +++ b/public/build/assets/Show-BGTgh0m1.js @@ -0,0 +1 @@ +import{d as A,n as B,c as I,r,e as E,p as z,a as o,f as w,u as D,h as O,w as M,b as e,i as u,o as l,t as i,q as N,v as X,s as Y,F as g,g as j,l as k,T as Z}from"./app-CClrM5Yi.js";import{_ as H}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{_ as W}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./index-C4J_hXM0.js";import"./createLucideIcon-ZFd4jktC.js";const G={class:"flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4"},J={key:0,class:"flex items-center gap-3"},K={class:"flex items-center gap-3"},Q={class:"min-w-0 flex-1"},ee={class:"truncate text-lg font-semibold"},te={class:"flex items-center gap-2"},se={key:1,class:"rounded-md border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200"},ae=["aria-busy"],oe=["href"],le={class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted"},re=["src","alt"],ne={class:"flex min-w-0 flex-1 flex-col"},ue={class:"flex items-center justify-between gap-2"},ie={class:"truncate font-medium"},de={class:"text-xs text-muted-foreground"},ce={class:"mt-1 text-xs text-muted-foreground"},ve={key:0,class:"mr-2 rounded border px-1 py-0.5"},fe={key:1},pe={class:"mt-2 text-sm text-foreground/90"},me={key:0,class:"fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded bg-foreground px-3 py-2 text-sm text-background shadow-lg"},ge=A({__name:"Show",setup(he){const C=B(),S=I(()=>C.props.entityId),d=r(""),c=r("title_asc"),v=r([]),L=r(0),T=r(1),h=r(1),n=r(!1),_=r(null),b=r(!1),P=r(""),p=r(null);let $=null;const q=I(()=>h.valueb.value=!1,2500)}finally{n.value=!1}}}function V(){clearTimeout($),$=setTimeout(()=>{h.value=1,x(!0)},300)}function F(){const a=new URL(window.location.href);d.value?a.searchParams.set("q",d.value):a.searchParams.delete("q"),c.value?a.searchParams.set("sort",c.value):a.searchParams.delete("sort"),window.history.replaceState({},"",a.toString()),h.value=1,x(!0)}async function R(){q.value&&(h.value+=1,await x(!1))}const y=r(null);let m=null;return E(()=>{const a=new URL(window.location.href);d.value=a.searchParams.get("q")??"",c.value=a.searchParams.get("sort")??"title_asc",x(!0),m=new IntersectionObserver(t=>{for(const s of t)s.isIntersecting&&R()},{root:null,rootMargin:"200px",threshold:0}),y.value&&m.observe(y.value)}),z(y,(a,t)=>{t&&m&&m.unobserve(t),a&&m&&m.observe(a)}),(a,t)=>(l(),o(g,null,[w(D(O),{title:p.value?.name?`${p.value.name} · Studio`:"Studio"},null,8,["title"]),w(H,{breadcrumbs:[{title:"Studios",href:"/studios"},{title:p.value?.name??"…",href:`/studios/${S.value}`}]},{default:M(()=>[e("div",G,[!p.value&&n.value?(l(),o("div",J,[...t[2]||(t[2]=[e("div",{class:"h-12 w-12 shrink-0 rounded bg-muted animate-pulse"},null,-1),e("div",{class:"h-4 w-40 rounded bg-muted animate-pulse"},null,-1)])])):u("",!0),e("div",K,[t[3]||(t[3]=e("div",{class:"h-12 w-12 shrink-0 rounded bg-muted"},null,-1)),e("div",Q,[e("h1",ee,i(p.value?.name??"…"),1)])]),e("div",te,[N(e("input",{class:"w-full rounded-md border border-gray-300 bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-primary",type:"text",placeholder:"Filter movies by title…","aria-label":"Filter movies by title","onUpdate:modelValue":t[0]||(t[0]=s=>d.value=s),onInput:V},null,544),[[X,d.value]]),N(e("select",{"onUpdate:modelValue":t[1]||(t[1]=s=>c.value=s),onChange:F,class:"w-44 shrink-0 rounded-md border px-3 py-2 text-sm","aria-label":"Sort movies"},[...t[4]||(t[4]=[e("option",{value:"title_asc"},"Title A → Z",-1),e("option",{value:"title_desc"},"Title Z → A",-1),e("option",{value:"newest"},"Newest",-1),e("option",{value:"oldest"},"Oldest",-1),e("option",{value:"year_asc"},"Year ↑",-1),e("option",{value:"year_desc"},"Year ↓",-1)])],544),[[Y,c.value]])]),_.value?(l(),o("div",se,i(_.value),1)):u("",!0),e("ul",{class:"divide-y divide-muted-foreground/20","aria-busy":n.value?"true":"false"},[(l(!0),o(g,null,j(v.value,s=>(l(),o("li",{key:s.id,class:"py-1"},[e("a",{href:`/movies/${s.id}`,class:"flex gap-3 rounded px-2 py-2 hover:bg-muted/40 focus:bg-muted/40 focus:outline-none"},[e("div",le,[s.poster_url?(l(),o("img",{key:0,src:s.poster_url,alt:`Poster for ${s.title}`,loading:"lazy",class:"h-full w-full object-cover"},null,8,re)):u("",!0)]),e("div",ne,[e("div",ue,[e("div",ie,i(s.title),1),e("div",de,i(s.year??""),1)]),e("div",ce,[s.rating?(l(),o("span",ve,i(s.rating),1)):u("",!0),s.genres?.length?(l(),o("span",fe,i(s.genres.map(f=>f.name).join(", ")),1)):u("",!0)]),e("div",pe,i(U(s.description)),1)])],8,oe)]))),128)),n.value&&v.value.length===0?(l(),o(g,{key:0},j(5,s=>e("li",{key:`s-${s}`,class:"py-1"},[...t[5]||(t[5]=[e("div",{class:"flex gap-3 rounded px-2 py-2"},[e("div",{class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted animate-pulse"}),e("div",{class:"flex min-w-0 flex-1 flex-col gap-2"},[e("div",{class:"h-4 w-1/3 rounded bg-muted animate-pulse"}),e("div",{class:"h-3 w-1/2 rounded bg-muted animate-pulse"}),e("div",{class:"h-3 w-2/3 rounded bg-muted animate-pulse"})])],-1)])])),64)):u("",!0)],8,ae),e("div",{ref_key:"sentinel",ref:y,class:"py-6 text-center text-sm text-muted-foreground"},[n.value?(l(),o(g,{key:0},[k("Loading…")],64)):!q.value&&v.value.length>0?(l(),o(g,{key:1},[k("End of results")],64)):!v.value.length&&!n.value?(l(),o(g,{key:2},[k("No results")],64)):u("",!0)],512),w(Z,{name:"fade"},{default:M(()=>[b.value?(l(),o("div",me,i(P.value),1)):u("",!0)]),_:1})])]),_:1},8,["breadcrumbs"])],64))}}),qe=W(ge,[["__scopeId","data-v-e8784fd4"]]);export{qe as default}; diff --git a/public/build/assets/Show-CLkQumZS.js b/public/build/assets/Show-CLkQumZS.js new file mode 100644 index 0000000..abc6c3e --- /dev/null +++ b/public/build/assets/Show-CLkQumZS.js @@ -0,0 +1 @@ +import{d as R,n as A,c as I,r,e as B,p as E,a as o,f as w,u as z,h as O,w as M,b as e,i,o as l,t as u,q as N,v as X,s as Y,F as g,g as j,l as k,T as Z}from"./app-CClrM5Yi.js";import{_ as H}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{_ as W}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./index-C4J_hXM0.js";import"./createLucideIcon-ZFd4jktC.js";const G={class:"flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4"},J={key:0,class:"flex items-center gap-3"},K={class:"flex items-center gap-3"},Q={class:"min-w-0 flex-1"},ee={class:"truncate text-lg font-semibold"},te={class:"flex items-center gap-2"},se={key:1,class:"rounded-md border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200"},ae=["aria-busy"],oe=["href"],le={class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted"},re=["src","alt"],ne={class:"flex min-w-0 flex-1 flex-col"},ie={class:"flex items-center justify-between gap-2"},ue={class:"truncate font-medium"},de={class:"text-xs text-muted-foreground"},ce={class:"mt-1 text-xs text-muted-foreground"},ve={key:0,class:"mr-2 rounded border px-1 py-0.5"},fe={key:1},pe={class:"mt-2 text-sm text-foreground/90"},me={key:0,class:"fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded bg-foreground px-3 py-2 text-sm text-background shadow-lg"},ge=R({__name:"Show",setup(he){const C=A(),T=I(()=>C.props.entityId),d=r(""),c=r("title_asc"),v=r([]),L=r(0),P=r(1),h=r(1),n=r(!1),_=r(null),b=r(!1),S=r(""),p=r(null);let $=null;const q=I(()=>h.valueb.value=!1,2500)}finally{n.value=!1}}}function V(){clearTimeout($),$=setTimeout(()=>{h.value=1,x(!0)},300)}function D(){const a=new URL(window.location.href);d.value?a.searchParams.set("q",d.value):a.searchParams.delete("q"),c.value?a.searchParams.set("sort",c.value):a.searchParams.delete("sort"),window.history.replaceState({},"",a.toString()),h.value=1,x(!0)}async function F(){q.value&&(h.value+=1,await x(!1))}const y=r(null);let m=null;return B(()=>{const a=new URL(window.location.href);d.value=a.searchParams.get("q")??"",c.value=a.searchParams.get("sort")??"title_asc",x(!0),m=new IntersectionObserver(t=>{for(const s of t)s.isIntersecting&&F()},{root:null,rootMargin:"200px",threshold:0}),y.value&&m.observe(y.value)}),E(y,(a,t)=>{t&&m&&m.unobserve(t),a&&m&&m.observe(a)}),(a,t)=>(l(),o(g,null,[w(z(O),{title:p.value?.name?`${p.value.name} · Director`:"Director"},null,8,["title"]),w(H,{breadcrumbs:[{title:"Directors",href:"/directors"},{title:p.value?.name??"…",href:`/directors/${T.value}`}]},{default:M(()=>[e("div",G,[!p.value&&n.value?(l(),o("div",J,[...t[2]||(t[2]=[e("div",{class:"h-12 w-12 shrink-0 rounded-full bg-muted animate-pulse"},null,-1),e("div",{class:"h-4 w-40 rounded bg-muted animate-pulse"},null,-1)])])):i("",!0),e("div",K,[t[3]||(t[3]=e("div",{class:"h-12 w-12 shrink-0 rounded-full bg-muted"},null,-1)),e("div",Q,[e("h1",ee,u(p.value?.name??"…"),1)])]),e("div",te,[N(e("input",{class:"w-full rounded-md border border-gray-300 bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-primary",type:"text",placeholder:"Filter movies by title…","aria-label":"Filter movies by title","onUpdate:modelValue":t[0]||(t[0]=s=>d.value=s),onInput:V},null,544),[[X,d.value]]),N(e("select",{"onUpdate:modelValue":t[1]||(t[1]=s=>c.value=s),onChange:D,class:"w-44 shrink-0 rounded-md border px-3 py-2 text-sm","aria-label":"Sort movies"},[...t[4]||(t[4]=[e("option",{value:"title_asc"},"Title A → Z",-1),e("option",{value:"title_desc"},"Title Z → A",-1),e("option",{value:"newest"},"Newest",-1),e("option",{value:"oldest"},"Oldest",-1),e("option",{value:"year_asc"},"Year ↑",-1),e("option",{value:"year_desc"},"Year ↓",-1)])],544),[[Y,c.value]])]),_.value?(l(),o("div",se,u(_.value),1)):i("",!0),e("ul",{class:"divide-y divide-muted-foreground/20","aria-busy":n.value?"true":"false"},[(l(!0),o(g,null,j(v.value,s=>(l(),o("li",{key:s.id,class:"py-1"},[e("a",{href:`/movies/${s.id}`,class:"flex gap-3 rounded px-2 py-2 hover:bg-muted/40 focus:bg-muted/40 focus:outline-none"},[e("div",le,[s.poster_url?(l(),o("img",{key:0,src:s.poster_url,alt:`Poster for ${s.title}`,loading:"lazy",class:"h-full w-full object-cover"},null,8,re)):i("",!0)]),e("div",ne,[e("div",ie,[e("div",ue,u(s.title),1),e("div",de,u(s.year??""),1)]),e("div",ce,[s.rating?(l(),o("span",ve,u(s.rating),1)):i("",!0),s.genres?.length?(l(),o("span",fe,u(s.genres.map(f=>f.name).join(", ")),1)):i("",!0)]),e("div",pe,u(U(s.description)),1)])],8,oe)]))),128)),n.value&&v.value.length===0?(l(),o(g,{key:0},j(5,s=>e("li",{key:`s-${s}`,class:"py-1"},[...t[5]||(t[5]=[e("div",{class:"flex gap-3 rounded px-2 py-2"},[e("div",{class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted animate-pulse"}),e("div",{class:"flex min-w-0 flex-1 flex-col gap-2"},[e("div",{class:"h-4 w-1/3 rounded bg-muted animate-pulse"}),e("div",{class:"h-3 w-1/2 rounded bg-muted animate-pulse"}),e("div",{class:"h-3 w-2/3 rounded bg-muted animate-pulse"})])],-1)])])),64)):i("",!0)],8,ae),e("div",{ref_key:"sentinel",ref:y,class:"py-6 text-center text-sm text-muted-foreground"},[n.value?(l(),o(g,{key:0},[k("Loading…")],64)):!q.value&&v.value.length>0?(l(),o(g,{key:1},[k("End of results")],64)):!v.value.length&&!n.value?(l(),o(g,{key:2},[k("No results")],64)):i("",!0)],512),w(Z,{name:"fade"},{default:M(()=>[b.value?(l(),o("div",me,u(S.value),1)):i("",!0)]),_:1})])]),_:1},8,["breadcrumbs"])],64))}}),qe=W(ge,[["__scopeId","data-v-dfdd9f1d"]]);export{qe as default}; diff --git a/public/build/assets/Show-Cm2t8bQb.css b/public/build/assets/Show-Cm2t8bQb.css new file mode 100644 index 0000000..cd6243f --- /dev/null +++ b/public/build/assets/Show-Cm2t8bQb.css @@ -0,0 +1 @@ +.fade-enter-active[data-v-57497e98],.fade-leave-active[data-v-57497e98]{transition:opacity .2s}.fade-enter-from[data-v-57497e98],.fade-leave-to[data-v-57497e98]{opacity:0} diff --git a/public/build/assets/Show-Csw6sC-4.css b/public/build/assets/Show-Csw6sC-4.css new file mode 100644 index 0000000..3ecf18f --- /dev/null +++ b/public/build/assets/Show-Csw6sC-4.css @@ -0,0 +1 @@ +.fade-enter-active[data-v-e8784fd4],.fade-leave-active[data-v-e8784fd4]{transition:opacity .2s}.fade-enter-from[data-v-e8784fd4],.fade-leave-to[data-v-e8784fd4]{opacity:0} diff --git a/public/build/assets/Show-DB_iXr9H.css b/public/build/assets/Show-DB_iXr9H.css new file mode 100644 index 0000000..cbce37c --- /dev/null +++ b/public/build/assets/Show-DB_iXr9H.css @@ -0,0 +1 @@ +.fade-enter-active[data-v-2ee2f925],.fade-leave-active[data-v-2ee2f925]{transition:opacity .2s}.fade-enter-from[data-v-2ee2f925],.fade-leave-to[data-v-2ee2f925]{opacity:0} diff --git a/public/build/assets/Show-u0mnbIJy.css b/public/build/assets/Show-u0mnbIJy.css new file mode 100644 index 0000000..e0d819b --- /dev/null +++ b/public/build/assets/Show-u0mnbIJy.css @@ -0,0 +1 @@ +.fade-enter-active[data-v-4dfe0470],.fade-leave-active[data-v-4dfe0470]{transition:opacity .2s}.fade-enter-from[data-v-4dfe0470],.fade-leave-to[data-v-4dfe0470]{opacity:0} diff --git a/public/build/assets/Show-y_rWxQ3Z.js b/public/build/assets/Show-y_rWxQ3Z.js new file mode 100644 index 0000000..70f8f04 --- /dev/null +++ b/public/build/assets/Show-y_rWxQ3Z.js @@ -0,0 +1 @@ +import{d as A,n as B,c as I,r,e as E,p as G,a as o,f as w,u as z,h as D,w as M,b as e,i as u,o as l,t as i,q as N,v as O,s as X,F as g,g as j,l as k,T as Y}from"./app-CClrM5Yi.js";import{_ as Z}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{_ as H}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./index-C4J_hXM0.js";import"./createLucideIcon-ZFd4jktC.js";const W={class:"flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4"},J={key:0,class:"flex items-center gap-3"},K={class:"flex items-center gap-3"},Q={class:"min-w-0 flex-1"},ee={class:"truncate text-lg font-semibold"},te={class:"flex items-center gap-2"},se={key:1,class:"rounded-md border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200"},ae=["aria-busy"],oe=["href"],le={class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted"},re=["src","alt"],ne={class:"flex min-w-0 flex-1 flex-col"},ue={class:"flex items-center justify-between gap-2"},ie={class:"truncate font-medium"},de={class:"text-xs text-muted-foreground"},ce={class:"mt-1 text-xs text-muted-foreground"},ve={key:0,class:"mr-2 rounded border px-1 py-0.5"},fe={key:1},pe={class:"mt-2 text-sm text-foreground/90"},me={key:0,class:"fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded bg-foreground px-3 py-2 text-sm text-background shadow-lg"},ge=A({__name:"Show",setup(he){const C=B(),T=I(()=>C.props.entityId),d=r(""),c=r("title_asc"),v=r([]),L=r(0),P=r(1),h=r(1),n=r(!1),_=r(null),b=r(!1),S=r(""),p=r(null);let $=null;const q=I(()=>h.valueb.value=!1,2500)}finally{n.value=!1}}}function V(){clearTimeout($),$=setTimeout(()=>{h.value=1,x(!0)},300)}function F(){const a=new URL(window.location.href);d.value?a.searchParams.set("q",d.value):a.searchParams.delete("q"),c.value?a.searchParams.set("sort",c.value):a.searchParams.delete("sort"),window.history.replaceState({},"",a.toString()),h.value=1,x(!0)}async function R(){q.value&&(h.value+=1,await x(!1))}const y=r(null);let m=null;return E(()=>{const a=new URL(window.location.href);d.value=a.searchParams.get("q")??"",c.value=a.searchParams.get("sort")??"title_asc",x(!0),m=new IntersectionObserver(t=>{for(const s of t)s.isIntersecting&&R()},{root:null,rootMargin:"200px",threshold:0}),y.value&&m.observe(y.value)}),G(y,(a,t)=>{t&&m&&m.unobserve(t),a&&m&&m.observe(a)}),(a,t)=>(l(),o(g,null,[w(z(D),{title:p.value?.name?`${p.value.name} · Genre`:"Genre"},null,8,["title"]),w(Z,{breadcrumbs:[{title:"Genres",href:"/genres"},{title:p.value?.name??"…",href:`/genres/${T.value}`}]},{default:M(()=>[e("div",W,[!p.value&&n.value?(l(),o("div",J,[...t[2]||(t[2]=[e("div",{class:"h-12 w-12 shrink-0 rounded bg-muted animate-pulse"},null,-1),e("div",{class:"h-4 w-40 rounded bg-muted animate-pulse"},null,-1)])])):u("",!0),e("div",K,[t[3]||(t[3]=e("div",{class:"h-12 w-12 shrink-0 rounded bg-muted"},null,-1)),e("div",Q,[e("h1",ee,i(p.value?.name??"…"),1)])]),e("div",te,[N(e("input",{class:"w-full rounded-md border border-gray-300 bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-primary",type:"text",placeholder:"Filter movies by title…","aria-label":"Filter movies by title","onUpdate:modelValue":t[0]||(t[0]=s=>d.value=s),onInput:V},null,544),[[O,d.value]]),N(e("select",{"onUpdate:modelValue":t[1]||(t[1]=s=>c.value=s),onChange:F,class:"w-44 shrink-0 rounded-md border px-3 py-2 text-sm","aria-label":"Sort movies"},[...t[4]||(t[4]=[e("option",{value:"title_asc"},"Title A → Z",-1),e("option",{value:"title_desc"},"Title Z → A",-1),e("option",{value:"newest"},"Newest",-1),e("option",{value:"oldest"},"Oldest",-1),e("option",{value:"year_asc"},"Year ↑",-1),e("option",{value:"year_desc"},"Year ↓",-1)])],544),[[X,c.value]])]),_.value?(l(),o("div",se,i(_.value),1)):u("",!0),e("ul",{class:"divide-y divide-muted-foreground/20","aria-busy":n.value?"true":"false"},[(l(!0),o(g,null,j(v.value,s=>(l(),o("li",{key:s.id,class:"py-1"},[e("a",{href:`/movies/${s.id}`,class:"flex gap-3 rounded px-2 py-2 hover:bg-muted/40 focus:bg-muted/40 focus:outline-none"},[e("div",le,[s.poster_url?(l(),o("img",{key:0,src:s.poster_url,alt:`Poster for ${s.title}`,loading:"lazy",class:"h-full w-full object-cover"},null,8,re)):u("",!0)]),e("div",ne,[e("div",ue,[e("div",ie,i(s.title),1),e("div",de,i(s.year??""),1)]),e("div",ce,[s.rating?(l(),o("span",ve,i(s.rating),1)):u("",!0),s.genres?.length?(l(),o("span",fe,i(s.genres.map(f=>f.name).join(", ")),1)):u("",!0)]),e("div",pe,i(U(s.description)),1)])],8,oe)]))),128)),n.value&&v.value.length===0?(l(),o(g,{key:0},j(5,s=>e("li",{key:`s-${s}`,class:"py-1"},[...t[5]||(t[5]=[e("div",{class:"flex gap-3 rounded px-2 py-2"},[e("div",{class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted animate-pulse"}),e("div",{class:"flex min-w-0 flex-1 flex-col gap-2"},[e("div",{class:"h-4 w-1/3 rounded bg-muted animate-pulse"}),e("div",{class:"h-3 w-1/2 rounded bg-muted animate-pulse"}),e("div",{class:"h-3 w-2/3 rounded bg-muted animate-pulse"})])],-1)])])),64)):u("",!0)],8,ae),e("div",{ref_key:"sentinel",ref:y,class:"py-6 text-center text-sm text-muted-foreground"},[n.value?(l(),o(g,{key:0},[k("Loading…")],64)):!q.value&&v.value.length>0?(l(),o(g,{key:1},[k("End of results")],64)):!v.value.length&&!n.value?(l(),o(g,{key:2},[k("No results")],64)):u("",!0)],512),w(Y,{name:"fade"},{default:M(()=>[b.value?(l(),o("div",me,i(S.value),1)):u("",!0)]),_:1})])]),_:1},8,["breadcrumbs"])],64))}}),qe=H(ge,[["__scopeId","data-v-2ee2f925"]]);export{qe as default}; diff --git a/public/build/assets/Spinner.vue_vue_type_script_setup_true_lang-BPOcqWqa.js b/public/build/assets/Spinner.vue_vue_type_script_setup_true_lang-BPOcqWqa.js new file mode 100644 index 0000000..796dd0c --- /dev/null +++ b/public/build/assets/Spinner.vue_vue_type_script_setup_true_lang-BPOcqWqa.js @@ -0,0 +1 @@ +import{c as o}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{c as r}from"./createLucideIcon-ZFd4jktC.js";import{d as c,k as n,u as a,K as t,o as l}from"./app-CClrM5Yi.js";const i=r("LoaderCircleIcon",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]),f=c({__name:"Spinner",props:{class:{}},setup(s){const e=s;return(p,m)=>(l(),n(a(i),{role:"status","aria-label":"Loading",class:t(a(o)("size-4 animate-spin",e.class))},null,8,["class"]))}});export{f as _}; diff --git a/public/build/assets/TextLink.vue_vue_type_script_setup_true_lang-JYycsYY3.js b/public/build/assets/TextLink.vue_vue_type_script_setup_true_lang-JYycsYY3.js new file mode 100644 index 0000000..6888301 --- /dev/null +++ b/public/build/assets/TextLink.vue_vue_type_script_setup_true_lang-JYycsYY3.js @@ -0,0 +1 @@ +import{d as a,k as n,u as o,m as r,w as d,G as s,o as i}from"./app-CClrM5Yi.js";const l=a({__name:"TextLink",props:{href:{},tabindex:{},method:{},as:{}},setup(e){return(t,u)=>(i(),n(o(r),{href:e.href,tabindex:e.tabindex,method:e.method,as:e.as,class:"text-foreground underline decoration-neutral-300 underline-offset-4 transition-colors duration-300 ease-out hover:decoration-current! dark:decoration-neutral-500"},{default:d(()=>[s(t.$slots,"default")]),_:3},8,["href","tabindex","method","as"]))}});export{l as _}; diff --git a/public/build/assets/TwoFactor-CEzdBq7S.js b/public/build/assets/TwoFactor-CEzdBq7S.js new file mode 100644 index 0000000..846058d --- /dev/null +++ b/public/build/assets/TwoFactor-CEzdBq7S.js @@ -0,0 +1 @@ +import{r as se,s as oe,q as re,c as ne,d as le,f as ie,_ as ce,a as de,g as ue,h as fe}from"./Layout.vue_vue_type_script_setup_true_lang-ROf3tZlv.js";import{c as w,b as J,_ as S,P as pe}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{d as y,a as c,K as x,u as e,G as k,o as t,c as D,k as m,w as l,f as s,l as p,t as M,b as n,F as g,g as E,r as F,M as X,e as ve,i as me,I as ye,A as I,B,H as Y,O as he,P as _e,p as be,E as ge,h as we,C as xe,D as ke}from"./app-CClrM5Yi.js";import{c as C}from"./createLucideIcon-ZFd4jktC.js";import{_ as Ce}from"./InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js";import{_ as U}from"./Spinner.vue_vue_type_script_setup_true_lang-BPOcqWqa.js";import{d as $e,a as Se,b as Fe,c as Te,_ as Me}from"./DialogTitle.vue_vue_type_script_setup_true_lang-Dg2xd9QK.js";import{_ as Re,a as Ae,b as Ee}from"./PinInputSlot.vue_vue_type_script_setup_true_lang-D_qQ1GfR.js";import{c as Ve,r as qe}from"./useForwardExpose-BhawR5VU.js";import{C as je}from"./check-BNffy8wt.js";import{_ as ze}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import"./index-C4J_hXM0.js";import"./index--H2rh_A_.js";import"./VisuallyHidden-Cu70tzB6.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./VisuallyHiddenInput-Drd3EMOd.js";import"./RovingFocusGroup-CNFroA6Y.js";const De=C("CircleAlertIcon",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);const Ie=C("CopyIcon",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);const Be=C("EyeOffIcon",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);const Oe=C("EyeIcon",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);const Le=C("LockKeyholeIcon",[["circle",{cx:"12",cy:"16",r:"1",key:"1au0dj"}],["rect",{x:"3",y:"10",width:"18",height:"12",rx:"2",key:"6s8ecr"}],["path",{d:"M7 10V7a5 5 0 0 1 10 0v3",key:"1pqi11"}]]);const Pe=C("RefreshCwIcon",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);const Ke=C("ScanLineIcon",[["path",{d:"M3 7V5a2 2 0 0 1 2-2h2",key:"aa7l1z"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2",key:"4qcy5o"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2",key:"6vwrx8"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2",key:"ioqczr"}],["path",{d:"M7 12h10",key:"b7w52i"}]]);const He=C("ShieldBanIcon",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m4.243 5.21 14.39 12.472",key:"1c9a7c"}]]);const W=C("ShieldCheckIcon",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]),Ne=y({__name:"Alert",props:{class:{},variant:{}},setup(o){const a=o;return(r,d)=>(t(),c("div",{"data-slot":"alert",class:x(e(w)(e(We)({variant:o.variant}),a.class)),role:"alert"},[k(r.$slots,"default")],2))}}),Qe=y({__name:"AlertDescription",props:{class:{}},setup(o){const a=o;return(r,d)=>(t(),c("div",{"data-slot":"alert-description",class:x(e(w)("text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed",a.class))},[k(r.$slots,"default")],2))}}),Ue=y({__name:"AlertTitle",props:{class:{}},setup(o){const a=o;return(r,d)=>(t(),c("div",{"data-slot":"alert-title",class:x(e(w)("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight",a.class))},[k(r.$slots,"default")],2))}}),We=J("relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",{variants:{variant:{default:"bg-card text-card-foreground",destructive:"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90"}},defaultVariants:{variant:"default"}}),Ge={class:"list-inside list-disc text-sm"},Z=y({__name:"AlertError",props:{errors:{},title:{default:"Something went wrong."}},setup(o){const a=o,r=D(()=>Array.from(new Set(a.errors)));return(d,u)=>(t(),m(e(Ne),{variant:"destructive"},{default:l(()=>[s(e(De),{class:"size-4"}),s(e(Ue),null,{default:l(()=>[p(M(o.title),1)]),_:1}),s(e(Qe),null,{default:l(()=>[n("ul",Ge,[(t(!0),c(g,null,E(r.value,(h,i)=>(t(),c("li",{key:i},M(h),1))),128))])]),_:1})]),_:1}))}}),Je=y({__name:"Card",props:{class:{}},setup(o){const a=o;return(r,d)=>(t(),c("div",{"data-slot":"card",class:x(e(w)("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",a.class))},[k(r.$slots,"default")],2))}}),Xe=y({__name:"CardContent",props:{class:{}},setup(o){const a=o;return(r,d)=>(t(),c("div",{"data-slot":"card-content",class:x(e(w)("px-6",a.class))},[k(r.$slots,"default")],2))}}),Ye=y({__name:"CardDescription",props:{class:{}},setup(o){const a=o;return(r,d)=>(t(),c("p",{"data-slot":"card-description",class:x(e(w)("text-muted-foreground text-sm",a.class))},[k(r.$slots,"default")],2))}}),Ze=y({__name:"CardHeader",props:{class:{}},setup(o){const a=o;return(r,d)=>(t(),c("div",{"data-slot":"card-header",class:x(e(w)("@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",a.class))},[k(r.$slots,"default")],2))}}),et=y({__name:"CardTitle",props:{class:{}},setup(o){const a=o;return(r,d)=>(t(),c("h3",{"data-slot":"card-title",class:x(e(w)("leading-none font-semibold",a.class))},[k(r.$slots,"default")],2))}}),P=async o=>{const a=await fetch(o,{headers:{Accept:"application/json"}});if(!a.ok)throw new Error(`Failed to fetch: ${a.status}`);return a.json()},q=F([]),R=F(null),A=F(null),z=F([]),tt=D(()=>A.value!==null&&R.value!==null),K=()=>{const o=async()=>{try{const{svg:v}=await P(re.url());A.value=v}catch{q.value.push("Failed to fetch QR code"),A.value=null}},a=async()=>{try{const{secretKey:v}=await P(oe.url());R.value=v}catch{q.value.push("Failed to fetch a setup key"),R.value=null}},r=()=>{R.value=null,A.value=null,d()},d=()=>{q.value=[]};return{qrCodeSvg:A,manualSetupKey:R,recoveryCodesList:z,errors:q,hasSetupData:tt,clearSetupData:r,clearErrors:d,clearTwoFactorAuthData:()=>{r(),d(),z.value=[]},fetchQrCode:o,fetchSetupKey:a,fetchSetupData:async()=>{try{d(),await Promise.all([o(),a()])}catch{A.value=null,R.value=null}},fetchRecoveryCodes:async()=>{try{d(),z.value=await P(se.url())}catch{q.value.push("Failed to fetch recovery codes"),z.value=[]}}}},at={class:"flex flex-col gap-3 select-none sm:flex-row sm:items-center sm:justify-between"},st={key:0,class:"mt-6"},ot={key:1,class:"mt-3 space-y-3"},rt={key:0,class:"space-y-2"},nt=y({__name:"TwoFactorRecoveryCodes",setup(o){const{recoveryCodesList:a,fetchRecoveryCodes:r,errors:d}=K(),u=F(!1),h=X("recoveryCodeSectionRef"),i=async()=>{!u.value&&!a.value.length&&await r(),u.value=!u.value,u.value&&(await Y(),h.value?.scrollIntoView({behavior:"smooth"}))};return ve(async()=>{a.value.length||await r()}),(v,_)=>(t(),m(e(Je),{class:"w-full"},{default:l(()=>[s(e(Ze),null,{default:l(()=>[s(e(et),{class:"flex gap-3"},{default:l(()=>[s(e(Le),{class:"size-4"}),_[0]||(_[0]=p("2FA Recovery Codes ",-1))]),_:1}),s(e(Ye),null,{default:l(()=>[..._[1]||(_[1]=[p(" Recovery codes let you regain access if you lose your 2FA device. Store them in a secure password manager. ",-1)])]),_:1})]),_:1}),s(e(Xe),null,{default:l(()=>[n("div",at,[s(e(S),{onClick:i,class:"w-fit"},{default:l(()=>[(t(),m(ye(u.value?e(Be):e(Oe)),{class:"size-4"})),p(" "+M(u.value?"Hide":"View")+" Recovery Codes ",1)]),_:1}),u.value&&e(a).length?(t(),m(e(I),B({key:0},e(ne).form(),{method:"post",options:{preserveScroll:!0},onSuccess:e(r)}),{default:l(({processing:$})=>[s(e(S),{variant:"secondary",type:"submit",disabled:$},{default:l(()=>[s(e(Pe)),_[2]||(_[2]=p(" Regenerate Codes ",-1))]),_:1},8,["disabled"])]),_:1},16,["onSuccess"])):me("",!0)]),n("div",{class:x(["relative overflow-hidden transition-all duration-300",u.value?"h-auto opacity-100":"h-0 opacity-0"])},[e(d)?.length?(t(),c("div",st,[s(Z,{errors:e(d)},null,8,["errors"])])):(t(),c("div",ot,[n("div",{ref_key:"recoveryCodeSectionRef",ref:h,class:"grid gap-1 rounded-lg bg-muted p-4 font-mono text-sm"},[e(a).length?(t(!0),c(g,{key:1},E(e(a),($,T)=>(t(),c("div",{key:T},M($),1))),128)):(t(),c("div",rt,[(t(),c(g,null,E(8,$=>n("div",{key:$,class:"h-4 animate-pulse rounded bg-muted-foreground/20"})),64))]))],512),_[3]||(_[3]=n("p",{class:"text-xs text-muted-foreground select-none"},[p(" Each recovery code can be used once to access your account and will be removed after use. If you need more, click "),n("span",{class:"font-bold"},"Regenerate Codes"),p(" above. ")],-1))]))],2)]),_:1})]),_:1}))}}),lt={class:"mb-3 w-auto rounded-full border border-border bg-card p-0.5 shadow-sm"},it={class:"relative overflow-hidden rounded-full border border-border bg-muted p-2.5"},ct={class:"absolute inset-0 grid grid-cols-5 opacity-50"},dt={class:"absolute inset-0 grid grid-rows-5 opacity-50"},ut={class:"relative flex w-auto flex-col items-center justify-center space-y-5"},ft={class:"relative mx-auto flex max-w-md items-center overflow-hidden"},pt={class:"relative mx-auto aspect-square w-64 overflow-hidden rounded-lg border border-border"},vt={key:0,class:"absolute inset-0 z-10 flex aspect-square h-auto w-full animate-pulse items-center justify-center bg-background"},mt={key:1,class:"relative z-10 overflow-hidden border p-5"},yt=["innerHTML"],ht={class:"flex w-full items-center space-x-5"},_t={class:"flex w-full items-center justify-center space-x-2"},bt={class:"flex w-full items-stretch overflow-hidden rounded-xl border border-border"},gt={key:0,class:"flex h-full w-full items-center justify-center bg-muted p-3"},wt=["value"],xt=["value"],kt={class:"flex w-full flex-col items-center justify-center space-y-3 py-2"},Ct={class:"flex w-full items-center space-x-5"},$t=y({__name:"TwoFactorSetupModal",props:he({requiresConfirmation:{type:Boolean},twoFactorEnabled:{type:Boolean}},{isOpen:{type:Boolean},isOpenModifiers:{}}),emits:["update:isOpen"],setup(o){const a=o,r=_e(o,"isOpen"),{copy:d,copied:u}=Ve(),{qrCodeSvg:h,manualSetupKey:i,clearSetupData:v,fetchSetupData:_,errors:$}=K(),T=F(!1),V=F([]),H=D(()=>V.value.join("")),N=X("pinInputContainerRef"),O=D(()=>a.twoFactorEnabled?{title:"Two-Factor Authentication Enabled",description:"Two-factor authentication is now enabled. Scan the QR code or enter the setup key in your authenticator app.",buttonText:"Close"}:T.value?{title:"Verify Authentication Code",description:"Enter the 6-digit code from your authenticator app",buttonText:"Continue"}:{title:"Enable Two-Factor Authentication",description:"To finish enabling two-factor authentication, scan the QR code or enter the setup key in your authenticator app",buttonText:"Continue"}),ee=()=>{if(a.requiresConfirmation){T.value=!0,Y(()=>{N.value?.querySelector("input")?.focus()});return}v(),r.value=!1},te=()=>{a.twoFactorEnabled&&v(),T.value=!1,V.value=[]};return be(()=>r.value,async Q=>{if(!Q){te();return}h.value||await _()}),(Q,f)=>(t(),m(e($e),{open:r.value,"onUpdate:open":f[5]||(f[5]=b=>r.value=b)},{default:l(()=>[s(e(Me),{class:"sm:max-w-md"},{default:l(()=>[s(e(Se),{class:"flex items-center justify-center"},{default:l(()=>[n("div",lt,[n("div",it,[n("div",ct,[(t(),c(g,null,E(5,b=>n("div",{key:`col-${b}`,class:"border-r border-border last:border-r-0"})),64))]),n("div",dt,[(t(),c(g,null,E(5,b=>n("div",{key:`row-${b}`,class:"border-b border-border last:border-b-0"})),64))]),s(e(Ke),{class:"relative z-20 size-6 text-foreground"})])]),s(e(Fe),null,{default:l(()=>[p(M(O.value.title),1)]),_:1}),s(e(Te),{class:"text-center"},{default:l(()=>[p(M(O.value.description),1)]),_:1})]),_:1}),n("div",ut,[T.value?(t(),m(e(I),B({key:1},e(le).form(),{"reset-on-error":"",onFinish:f[3]||(f[3]=b=>V.value=[]),onSuccess:f[4]||(f[4]=b=>r.value=!1)}),{default:l(({errors:b,processing:L})=>[n("input",{type:"hidden",name:"code",value:H.value},null,8,xt),n("div",{ref_key:"pinInputContainerRef",ref:N,class:"relative w-full space-y-3"},[n("div",kt,[s(e(Re),{id:"otp",placeholder:"○",modelValue:V.value,"onUpdate:modelValue":f[1]||(f[1]=j=>V.value=j),type:"number",otp:""},{default:l(()=>[s(e(Ae),null,{default:l(()=>[(t(),c(g,null,E(6,(j,ae)=>s(e(Ee),{autofocus:"",key:j,index:ae,disabled:L},null,8,["index","disabled"])),64))]),_:2},1024)]),_:2},1032,["modelValue"]),s(Ce,{message:b?.confirmTwoFactorAuthentication?.code},null,8,["message"])]),n("div",Ct,[s(e(S),{type:"button",variant:"outline",class:"w-auto flex-1",onClick:f[2]||(f[2]=j=>T.value=!1),disabled:L},{default:l(()=>[...f[7]||(f[7]=[p(" Back ",-1)])]),_:1},8,["disabled"]),s(e(S),{type:"submit",class:"w-auto flex-1",disabled:L||H.value.length<6},{default:l(()=>[...f[8]||(f[8]=[p(" Confirm ",-1)])]),_:1},8,["disabled"])])],512)]),_:1},16)):(t(),c(g,{key:0},[e($)?.length?(t(),m(Z,{key:0,errors:e($)},null,8,["errors"])):(t(),c(g,{key:1},[n("div",ft,[n("div",pt,[e(h)?(t(),c("div",mt,[n("div",{innerHTML:e(h),class:"aspect-square w-full justify-center rounded-lg bg-white p-2 [&_svg]:size-full"},null,8,yt)])):(t(),c("div",vt,[s(e(U),{class:"size-6"})]))])]),n("div",ht,[s(e(S),{class:"w-full",onClick:ee},{default:l(()=>[p(M(O.value.buttonText),1)]),_:1})]),f[6]||(f[6]=n("div",{class:"relative flex w-full items-center justify-center"},[n("div",{class:"absolute inset-0 top-1/2 h-px w-full bg-border"}),n("span",{class:"relative bg-card px-2 py-1"},"or, enter the code manually")],-1)),n("div",_t,[n("div",bt,[e(i)?(t(),c(g,{key:1},[n("input",{type:"text",readonly:"",value:e(i),class:"h-full w-full bg-background p-3 text-foreground"},null,8,wt),n("button",{onClick:f[0]||(f[0]=b=>e(d)(e(i)||"")),class:"relative block h-auto border-l border-border px-3 hover:bg-muted"},[e(u)?(t(),m(e(je),{key:0,class:"w-4 text-green-500"})):(t(),m(e(Ie),{key:1,class:"w-4"}))])],64)):(t(),c("div",gt,[s(e(U))]))])])],64))],64))])]),_:1})]),_:1},8,["open"]))}}),G=y({__name:"Badge",props:{asChild:{type:Boolean},as:{},variant:{},class:{}},setup(o){const a=o,r=qe(a,"class");return(d,u)=>(t(),m(e(pe),B({"data-slot":"badge",class:e(w)(e(St)({variant:o.variant}),a.class)},e(r)),{default:l(()=>[k(d.$slots,"default")]),_:3},16,["class"]))}}),St=J("inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",secondary:"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",destructive:"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"}},defaultVariants:{variant:"default"}}),Ft={class:"space-y-6"},Tt={key:0,class:"flex flex-col items-start justify-start space-y-4"},Mt={key:1,class:"flex flex-col items-start justify-start space-y-4"},Rt={class:"relative inline"},Wt=y({__name:"TwoFactor",props:{requiresConfirmation:{type:Boolean,default:!1},twoFactorEnabled:{type:Boolean,default:!1}},setup(o){const a=[{title:"Two-Factor Authentication",href:ie.url()}],{hasSetupData:r,clearTwoFactorAuthData:d}=K(),u=F(!1);return ge(()=>{d()}),(h,i)=>(t(),m(ze,{breadcrumbs:a},{default:l(()=>[s(e(we),{title:"Two-Factor Authentication"}),s(ce,null,{default:l(()=>[n("div",Ft,[s(de,{title:"Two-Factor Authentication",description:"Manage your two-factor authentication settings"}),o.twoFactorEnabled?(t(),c("div",Mt,[s(e(G),{variant:"default"},{default:l(()=>[...i[7]||(i[7]=[p("Enabled",-1)])]),_:1}),i[9]||(i[9]=n("p",{class:"text-muted-foreground"}," With two-factor authentication enabled, you will be prompted for a secure, random pin during login, which you can retrieve from the TOTP-supported application on your phone. ",-1)),s(nt),n("div",Rt,[s(e(I),xe(ke(e(fe).form())),{default:l(({processing:v})=>[s(e(S),{variant:"destructive",type:"submit",disabled:v},{default:l(()=>[s(e(He)),i[8]||(i[8]=p(" Disable 2FA ",-1))]),_:1},8,["disabled"])]),_:1},16)])])):(t(),c("div",Tt,[s(e(G),{variant:"destructive"},{default:l(()=>[...i[3]||(i[3]=[p("Disabled",-1)])]),_:1}),i[6]||(i[6]=n("p",{class:"text-muted-foreground"}," When you enable two-factor authentication, you will be prompted for a secure pin during login. This pin can be retrieved from a TOTP-supported application on your phone. ",-1)),n("div",null,[e(r)?(t(),m(e(S),{key:0,onClick:i[0]||(i[0]=v=>u.value=!0)},{default:l(()=>[s(e(W)),i[4]||(i[4]=p("Continue Setup ",-1))]),_:1})):(t(),m(e(I),B({key:1},e(ue).form(),{onSuccess:i[1]||(i[1]=v=>u.value=!0)}),{default:l(({processing:v})=>[s(e(S),{type:"submit",disabled:v},{default:l(()=>[s(e(W)),i[5]||(i[5]=p("Enable 2FA",-1))]),_:1},8,["disabled"])]),_:1},16))])])),s($t,{isOpen:u.value,"onUpdate:isOpen":i[2]||(i[2]=v=>u.value=v),requiresConfirmation:o.requiresConfirmation,twoFactorEnabled:o.twoFactorEnabled},null,8,["isOpen","requiresConfirmation","twoFactorEnabled"])])]),_:1})]),_:1}))}});export{Wt as default}; diff --git a/public/build/assets/TwoFactorChallenge-BSzmROh9.js b/public/build/assets/TwoFactorChallenge-BSzmROh9.js new file mode 100644 index 0000000..7b3ecac --- /dev/null +++ b/public/build/assets/TwoFactorChallenge-BSzmROh9.js @@ -0,0 +1 @@ +import{_ as v}from"./InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js";import{_ as y}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{_ as V}from"./Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js";import{_ as B,a as E,b as F}from"./PinInputSlot.vue_vue_type_script_setup_true_lang-D_qQ1GfR.js";import{_ as j}from"./AuthLayout.vue_vue_type_script_setup_true_lang-B14CUTB5.js";import{s as g}from"./index--H2rh_A_.js";import{d as A,c as x,r as b,k as m,w as a,f as n,b as o,u as t,h as N,o as d,A as h,B as k,a as R,F as P,g as q,l as C,t as w}from"./app-CClrM5Yi.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./VisuallyHiddenInput-Drd3EMOd.js";import"./index-C4J_hXM0.js";const D={class:"space-y-6"},I=["value"],L={class:"flex flex-col items-center justify-center space-y-3 text-center"},M={class:"flex w-full items-center justify-center"},S={class:"text-center text-sm text-muted-foreground"},U=["onClick"],z={class:"text-center text-sm text-muted-foreground"},G=["onClick"],ae=A({__name:"TwoFactorChallenge",setup(H){const l=x(()=>r.value?{title:"Recovery Code",description:"Please confirm access to your account by entering one of your emergency recovery codes.",toggleText:"login using an authentication code"}:{title:"Authentication Code",description:"Enter the authentication code provided by your authenticator application.",toggleText:"login using a recovery code"}),r=b(!1),p=_=>{r.value=!r.value,_(),s.value=[]},s=b([]),$=x(()=>s.value.join(""));return(_,e)=>(d(),m(j,{title:l.value.title,description:l.value.description},{default:a(()=>[n(t(N),{title:"Two-Factor Authentication"}),o("div",D,[r.value?(d(),m(t(h),k({key:1},t(g).form(),{class:"space-y-4","reset-on-error":""}),{default:a(({errors:i,processing:u,clearErrors:c})=>[n(t(V),{name:"recovery_code",type:"text",placeholder:"Enter recovery code",autofocus:r.value,required:""},null,8,["autofocus"]),n(v,{message:i.recovery_code},null,8,["message"]),n(t(y),{type:"submit",class:"w-full",disabled:u},{default:a(()=>[...e[4]||(e[4]=[C("Continue",-1)])]),_:1},8,["disabled"]),o("div",z,[e[5]||(e[5]=o("span",null,"or you can ",-1)),o("button",{type:"button",class:"text-foreground underline decoration-neutral-300 underline-offset-4 transition-colors duration-300 ease-out hover:decoration-current! dark:decoration-neutral-500",onClick:()=>p(c)},w(l.value.toggleText),9,G)])]),_:1},16)):(d(),m(t(h),k({key:0},t(g).form(),{class:"space-y-4","reset-on-error":"",onError:e[1]||(e[1]=i=>s.value=[])}),{default:a(({errors:i,processing:u,clearErrors:c})=>[o("input",{type:"hidden",name:"code",value:$.value},null,8,I),o("div",L,[o("div",M,[n(t(B),{id:"otp",placeholder:"○",modelValue:s.value,"onUpdate:modelValue":e[0]||(e[0]=f=>s.value=f),type:"number",otp:""},{default:a(()=>[n(t(E),null,{default:a(()=>[(d(),R(P,null,q(6,(f,T)=>n(t(F),{key:f,index:T,disabled:u,autofocus:""},null,8,["index","disabled"])),64))]),_:2},1024)]),_:2},1032,["modelValue"])]),n(v,{message:i.code},null,8,["message"])]),n(t(y),{type:"submit",class:"w-full",disabled:u},{default:a(()=>[...e[2]||(e[2]=[C("Continue",-1)])]),_:1},8,["disabled"]),o("div",S,[e[3]||(e[3]=o("span",null,"or you can ",-1)),o("button",{type:"button",class:"text-foreground underline decoration-neutral-300 underline-offset-4 transition-colors duration-300 ease-out hover:decoration-current! dark:decoration-neutral-500",onClick:()=>p(c)},w(l.value.toggleText),9,U)])]),_:1},16))])]),_:1},8,["title","description"]))}});export{ae as default}; diff --git a/public/build/assets/VerifyEmail-DZQcbTya.js b/public/build/assets/VerifyEmail-DZQcbTya.js new file mode 100644 index 0000000..c31a83e --- /dev/null +++ b/public/build/assets/VerifyEmail-DZQcbTya.js @@ -0,0 +1 @@ +import{_ as l}from"./TextLink.vue_vue_type_script_setup_true_lang-JYycsYY3.js";import{_ as d}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import{_ as u}from"./Spinner.vue_vue_type_script_setup_true_lang-BPOcqWqa.js";import{_ as c}from"./AuthLayout.vue_vue_type_script_setup_true_lang-B14CUTB5.js";import{b as _}from"./index-C4J_hXM0.js";import{s as p}from"./index-DZxzsgmi.js";import{d as k,k as r,w as a,f as s,a as y,i as m,u as e,h as x,o as i,A as b,B as v,l as n}from"./app-CClrM5Yi.js";import"./createLucideIcon-ZFd4jktC.js";const g={key:0,class:"mb-4 text-center text-sm font-medium text-green-600"},P=k({__name:"VerifyEmail",props:{status:{}},setup(f){return(h,t)=>(i(),r(c,{title:"Verify email",description:"Please verify your email address by clicking on the link we just emailed to you."},{default:a(()=>[s(e(x),{title:"Email verification"}),f.status==="verification-link-sent"?(i(),y("div",g," A new verification link has been sent to the email address you provided during registration. ")):m("",!0),s(e(b),v(e(p).form(),{class:"space-y-6 text-center"}),{default:a(({processing:o})=>[s(e(d),{disabled:o,variant:"secondary"},{default:a(()=>[o?(i(),r(e(u),{key:0})):m("",!0),t[0]||(t[0]=n(" Resend verification email ",-1))]),_:2},1032,["disabled"]),s(l,{href:e(_)(),as:"button",class:"mx-auto block text-sm"},{default:a(()=>[...t[1]||(t[1]=[n(" Log out ",-1)])]),_:1},8,["href"])]),_:1},16)]),_:1}))}});export{P as default}; diff --git a/public/build/assets/VisuallyHidden-Cu70tzB6.js b/public/build/assets/VisuallyHidden-Cu70tzB6.js new file mode 100644 index 0000000..c8c66d0 --- /dev/null +++ b/public/build/assets/VisuallyHidden-Cu70tzB6.js @@ -0,0 +1 @@ +import{a8 as f,a7 as p,r as u,c as l,a5 as d,aa as m,ab as c,ac as h,d as v,k as y,o as w,w as g,G as P,u as b}from"./app-CClrM5Yi.js";import{u as E}from"./useForwardExpose-BhawR5VU.js";import{P as x}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";function _(e,t){const s=typeof e=="string"&&!t?`${e}Context`:t,o=Symbol(s);return[n=>{const i=f(o,n);if(i||i===null)return i;throw new Error(`Injection \`${o.toString()}\` not found. Component must be used within ${Array.isArray(e)?`one of the following components: ${e.join(", ")}`:`\`${e}\``}`)},n=>(p(o,n),n)]}function R(){let e=document.activeElement;if(e==null)return null;for(;e!=null&&e.shadowRoot!=null&&e.shadowRoot.activeElement!=null;)e=e.shadowRoot.activeElement;return e}const[C]=_("ConfigProvider");function V(e){const t=C({dir:u("ltr")});return l(()=>e?.value||t.dir?.value||"ltr")}function j(e){const t=d(),s=t?.type.emits,o={};return s?.length||console.warn(`No emitted event found. Please check component: ${t?.type.__name}`),s?.forEach(r=>{o[m(c(r))]=(...a)=>e(r,...a)}),o}function $(e){const t=d(),s=Object.keys(t?.type.props??{}).reduce((r,a)=>{const n=(t?.type.props[a]).default;return n!==void 0&&(r[a]=n),r},{}),o=h(e);return l(()=>{const r={},a=t?.vnode.props??{};return Object.keys(a).forEach(n=>{r[c(n)]=a[n]}),Object.keys({...s,...r}).reduce((n,i)=>(o.value[i]!==void 0&&(n[i]=o.value[i]),n),{})})}function q(e,t){const s=$(e),o=t?j(t):{};return l(()=>({...s.value,...o}))}function B(){const e=u(),t=l(()=>["#text","#comment"].includes(e.value?.$el.nodeName)?e.value?.$el.nextElementSibling:E(e));return{primitiveElement:e,currentElement:t}}var k=v({__name:"VisuallyHidden",props:{feature:{type:String,required:!1,default:"focusable"},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){return(t,s)=>(w(),y(b(x),{as:t.as,"as-child":t.asChild,"aria-hidden":t.feature==="focusable"?"true":void 0,"data-hidden":t.feature==="fully-hidden"?"":void 0,tabindex:t.feature==="fully-hidden"?"-1":void 0,style:{position:"absolute",border:0,width:"1px",height:"1px",padding:0,margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",clipPath:"inset(50%)",whiteSpace:"nowrap",wordWrap:"normal",top:"-1px",left:"-1px"}},{default:g(()=>[P(t.$slots,"default")]),_:3},8,["as","as-child","aria-hidden","data-hidden","tabindex"]))}}),O=k;export{O as V,V as a,B as b,_ as c,$ as d,j as e,R as g,C as i,q as u}; diff --git a/public/build/assets/VisuallyHiddenInput-Drd3EMOd.js b/public/build/assets/VisuallyHiddenInput-Drd3EMOd.js new file mode 100644 index 0000000..ab93800 --- /dev/null +++ b/public/build/assets/VisuallyHiddenInput-Drd3EMOd.js @@ -0,0 +1 @@ +import{b as g,V as h}from"./VisuallyHidden-Cu70tzB6.js";import{d as y,c as o,p as B,k as p,o as n,B as d,a as f,i as E,F as c,g as V}from"./app-CClrM5Yi.js";var k=y({inheritAttrs:!1,__name:"VisuallyHiddenInputBubble",props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:"fully-hidden"}},setup(i){const e=i,{primitiveElement:s,currentElement:l}=g(),t=o(()=>e.checked??e.value);return B(t,(r,a)=>{if(!l.value)return;const u=l.value,_=window.HTMLInputElement.prototype,v=Object.getOwnPropertyDescriptor(_,"value").set;if(v&&r!==a){const b=new Event("input",{bubbles:!0}),q=new Event("change",{bubbles:!0});v.call(u,r),u.dispatchEvent(b),u.dispatchEvent(q)}}),(r,a)=>(n(),p(h,d({ref_key:"primitiveElement",ref:s},{...e,...r.$attrs},{as:"input"}),null,16))}}),m=k,A=y({inheritAttrs:!1,__name:"VisuallyHiddenInput",props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:"fully-hidden"}},setup(i){const e=i,s=o(()=>typeof e.value=="object"&&Array.isArray(e.value)&&e.value.length===0&&e.required),l=o(()=>typeof e.value=="string"||typeof e.value=="number"||typeof e.value=="boolean"||e.value===null||e.value===void 0?[{name:e.name,value:e.value}]:typeof e.value=="object"&&Array.isArray(e.value)?e.value.flatMap((t,r)=>typeof t=="object"?Object.entries(t).map(([a,u])=>({name:`${e.name}[${r}][${a}]`,value:u})):{name:`${e.name}[${r}]`,value:t}):e.value!==null&&typeof e.value=="object"&&!Array.isArray(e.value)?Object.entries(e.value).map(([t,r])=>({name:`${e.name}[${t}]`,value:r})):[]);return(t,r)=>(n(),f(c,null,[E(" We render single input if it's required "),s.value?(n(),p(m,d({key:t.name},{...e,...t.$attrs},{name:t.name,value:t.value}),null,16,["name","value"])):(n(!0),f(c,{key:1},V(l.value,a=>(n(),p(m,d({key:a.name},{ref_for:!0},{...e,...t.$attrs},{name:a.name,value:a.value}),null,16,["name","value"]))),128))],2112))}}),w=A;export{w as V}; diff --git a/public/build/assets/Welcome-1IB3Dtj8.js b/public/build/assets/Welcome-1IB3Dtj8.js new file mode 100644 index 0000000..9cb8199 --- /dev/null +++ b/public/build/assets/Welcome-1IB3Dtj8.js @@ -0,0 +1 @@ +import{d as p,l as k,r as b}from"./index-C4J_hXM0.js";import{d as g,a as l,f as i,b as a,w as r,u as e,h as w,j as F,k as d,l as s,m as C,F as L,i as c,o}from"./app-CClrM5Yi.js";const f={class:"flex min-h-screen flex-col items-center bg-[#FDFDFC] p-6 text-[#1b1b18] lg:justify-center lg:p-8 dark:bg-[#0a0a0a]"},v={class:"mb-6 w-full max-w-[335px] text-sm not-has-[nav]:hidden lg:max-w-4xl"},M={class:"flex items-center justify-end gap-4"},m=g({__name:"Welcome",props:{canRegister:{type:Boolean,default:!0}},setup(n){return(h,t)=>(o(),l(L,null,[i(e(w),{title:"Welcome"},{default:r(()=>[...t[0]||(t[0]=[a("link",{rel:"preconnect",href:"https://rsms.me/"},null,-1),a("link",{rel:"stylesheet",href:"https://rsms.me/inter/inter.css"},null,-1)])]),_:1}),a("div",f,[a("header",v,[a("nav",M,[h.$page.props.auth.user?(o(),d(e(C),{key:0,href:e(p)(),class:"inline-block rounded-sm border border-[#19140035] px-5 py-1.5 text-sm leading-normal text-[#1b1b18] hover:border-[#1915014a] dark:border-[#3E3E3A] dark:text-[#EDEDEC] dark:hover:border-[#62605b]"},{default:r(()=>[...t[1]||(t[1]=[s(" Dashboard ",-1)])]),_:1},8,["href"])):(o(),l(L,{key:1},[i(e(C),{href:e(k)(),class:"inline-block rounded-sm border border-transparent px-5 py-1.5 text-sm leading-normal text-[#1b1b18] hover:border-[#19140035] dark:text-[#EDEDEC] dark:hover:border-[#3E3E3A]"},{default:r(()=>[...t[2]||(t[2]=[s(" Log in ",-1)])]),_:1},8,["href"]),n.canRegister?(o(),d(e(C),{key:0,href:e(b)(),class:"inline-block rounded-sm border border-[#19140035] px-5 py-1.5 text-sm leading-normal text-[#1b1b18] hover:border-[#1915014a] dark:border-[#3E3E3A] dark:text-[#EDEDEC] dark:hover:border-[#62605b]"},{default:r(()=>[...t[3]||(t[3]=[s(" Register ",-1)])]),_:1},8,["href"])):c("",!0)],64))])]),t[4]||(t[4]=F('

Let's get started

Laravel has an incredibly rich ecosystem.
We suggest starting with the following.

',2))])],64))}});export{m as default}; diff --git a/public/build/assets/_plugin-vue_export-helper-DlAUqK2U.js b/public/build/assets/_plugin-vue_export-helper-DlAUqK2U.js new file mode 100644 index 0000000..718edd3 --- /dev/null +++ b/public/build/assets/_plugin-vue_export-helper-DlAUqK2U.js @@ -0,0 +1 @@ +const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _}; diff --git a/public/build/assets/app-BUIfoF4D.css b/public/build/assets/app-BUIfoF4D.css new file mode 100644 index 0000000..fd4ee8f --- /dev/null +++ b/public/build/assets/app-BUIfoF4D.css @@ -0,0 +1 @@ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-950:oklch(25.8% .092 26.042);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-zinc-900:oklch(21% .006 285.885);--color-neutral-100:oklch(97% 0 0);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-4xl:56rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--aspect-video:16/9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:Instrument Sans,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-gray-200,currentColor)}::file-selector-button{border-color:var(--color-gray-200,currentColor)}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\.5{top:calc(var(--spacing)*1.5)}.top-1\/2{top:50%}.top-3\.5{top:calc(var(--spacing)*3.5)}.top-4{top:calc(var(--spacing)*4)}.top-\[1px\]{top:1px}.top-\[50\%\]{top:50%}.top-\[60\%\]{top:60%}.top-full{top:100%}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-4{bottom:calc(var(--spacing)*4)}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-\[50\%\]{left:50%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[1\]{z-index:1}.order-first{order:-9999}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.-mx-3{margin-inline:calc(var(--spacing)*-3)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-3\.5{margin-inline:calc(var(--spacing)*3.5)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-6{margin-block:calc(var(--spacing)*6)}.my-8{margin-block:calc(var(--spacing)*8)}.-mt-4{margin-top:calc(var(--spacing)*-4)}.-mt-\[4\.9rem\]{margin-top:-4.9rem}.-mt-px{margin-top:-1px}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-auto{margin-top:auto}.mr-2{margin-right:calc(var(--spacing)*2)}.-mb-px{margin-bottom:-1px}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.-ml-8{margin-left:calc(var(--spacing)*-8)}.-ml-px{margin-left:-1px}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-10{margin-left:calc(var(--spacing)*10)}.ml-12{margin-left:calc(var(--spacing)*12)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-335\/376{aspect-ratio:335/376}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-2{width:calc(var(--spacing)*2);height:calc(var(--spacing)*2)}.size-2\.5{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5)}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.size-full{width:100%;height:100%}.h-0{height:calc(var(--spacing)*0)}.h-0\.5{height:calc(var(--spacing)*.5)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14\.5{height:calc(var(--spacing)*14.5)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-\[240px\]{height:240px}.h-\[var\(--reka-navigation-menu-viewport-height\)\]{height:var(--reka-navigation-menu-viewport-height)}.h-auto{height:auto}.h-dvh{height:100dvh}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-\(--reka-dropdown-menu-content-available-height\){max-height:var(--reka-dropdown-menu-content-available-height)}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-4{min-height:calc(var(--spacing)*4)}.min-h-\[100vh\],.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-\(--reka-dropdown-menu-trigger-width\){width:var(--reka-dropdown-menu-trigger-width)}.w-\(--sidebar-width\){width:var(--sidebar-width)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-1\/2{width:50%}.w-1\/3{width:33.3333%}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-2\/3{width:66.6667%}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-40{width:calc(var(--spacing)*40)}.w-44{width:calc(var(--spacing)*44)}.w-56{width:calc(var(--spacing)*56)}.w-64{width:calc(var(--spacing)*64)}.w-\[160px\]{width:160px}.w-\[300px\]{width:300px}.w-\[448px\]{width:448px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.max-w-\(--skeleton-width\){max-width:var(--skeleton-width)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[335px\]{max-width:335px}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-5{min-width:calc(var(--spacing)*5)}.min-w-56{min-width:calc(var(--spacing)*56)}.min-w-\[8rem\]{min-width:8rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.origin-\(--reka-dropdown-menu-content-transform-origin\){transform-origin:var(--reka-dropdown-menu-content-transform-origin)}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[calc\(-50\%_-_2px\)\]{--tw-translate-y: calc(-50% - 2px) ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-px{--tw-translate-y:1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[0_1fr\]{grid-template-columns:0 1fr}.grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-items-center{justify-items:center}.justify-items-start{justify-items:start}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*12)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*12)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing)*2)}.gap-x-3{column-gap:calc(var(--spacing)*3)}:where(.space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*0)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*5)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*5)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing)*.5)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-muted-foreground\/20>:not(:last-child)){border-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){:where(.divide-muted-foreground\/20>:not(:last-child)){border-color:color-mix(in oklab,var(--muted-foreground)20%,transparent)}}.self-center{align-self:center}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[4px\]{border-radius:4px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-t-lg{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.rounded-l-md{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.rounded-tl-sm{border-top-left-radius:calc(var(--radius) - 4px)}.rounded-r-md{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.rounded-br-lg{border-bottom-right-radius:var(--radius)}.rounded-bl-lg{border-bottom-left-radius:var(--radius)}.border{border-style:var(--tw-border-style);border-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-\[\#19140035\]{border-color:#19140035}.border-\[\#e3e3e0\]{border-color:#e3e3e0}.border-black{border-color:var(--color-black)}.border-border{border-color:var(--border)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-400{border-color:var(--color-gray-400)}.border-input{border-color:var(--input)}.border-red-100{border-color:var(--color-red-100)}.border-red-300{border-color:var(--color-red-300)}.border-sidebar-border,.border-sidebar-border\/70{border-color:var(--sidebar-border)}@supports (color:color-mix(in lab,red,red)){.border-sidebar-border\/70{border-color:color-mix(in oklab,var(--sidebar-border)70%,transparent)}}.border-sidebar-border\/80{border-color:var(--sidebar-border)}@supports (color:color-mix(in lab,red,red)){.border-sidebar-border\/80{border-color:color-mix(in oklab,var(--sidebar-border)80%,transparent)}}.border-transparent{border-color:#0000}.bg-\[\#1b1b18\]{background-color:#1b1b18}.bg-\[\#FDFDFC\]{background-color:#fdfdfc}.bg-\[\#dbdbd7\]{background-color:#dbdbd7}.bg-\[\#fff2f2\]{background-color:#fff2f2}.bg-background{background-color:var(--background)}.bg-black{background-color:var(--color-black)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-foreground{background-color:var(--foreground)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-muted{background-color:var(--muted)}.bg-muted-foreground\/20{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/20{background-color:color-mix(in oklab,var(--muted-foreground)20%,transparent)}}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-popover{background-color:var(--popover)}.bg-primary,.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--primary)10%,transparent)}}.bg-red-50{background-color:var(--color-red-50)}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar-background)}.bg-sidebar-border{background-color:var(--sidebar-border)}.bg-sidebar-primary{background-color:var(--sidebar-primary)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-zinc-900{background-color:var(--color-zinc-900)}.fill-current{fill:currentColor}.fill-primary{fill:var(--primary)}.stroke-neutral-900\/20{stroke:#17171733}@supports (color:color-mix(in lab,red,red)){.stroke-neutral-900\/20{stroke:color-mix(in oklab,var(--color-neutral-900)20%,transparent)}}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-10{padding:calc(var(--spacing)*10)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-3\.5{padding-inline:calc(var(--spacing)*3.5)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.px-10{padding-inline:calc(var(--spacing)*10)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-8{padding-top:calc(var(--spacing)*8)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-2\.5{padding-right:calc(var(--spacing)*2.5)}.pb-0{padding-bottom:calc(var(--spacing)*0)}.pb-12{padding-bottom:calc(var(--spacing)*12)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:Instrument Sans,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[13px\]{font-size:13px}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.leading-7{--tw-leading:calc(var(--spacing)*7);line-height:calc(var(--spacing)*7)}.leading-\[20px\]{--tw-leading:20px;line-height:20px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.text-\[\#1b1b18\]{color:#1b1b18}.text-\[\#706f6c\]{color:#706f6c}.text-\[\#F53003\],.text-\[\#f53003\]{color:#f53003}.text-\[var\(--foreground\)\]{color:var(--foreground)}.text-background{color:var(--background)}.text-black{color:var(--color-black)}.text-card-foreground{color:var(--card-foreground)}.text-current{color:currentColor}.text-destructive{color:var(--destructive)}.text-foreground,.text-foreground\/90{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/90{color:color-mix(in oklab,var(--foreground)90%,transparent)}}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-muted{color:var(--muted)}.text-muted-foreground{color:var(--muted-foreground)}.text-neutral-300{color:var(--color-neutral-300)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-900{color:var(--color-neutral-900)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-600{color:var(--color-red-600)}.text-red-800{color:var(--color-red-800)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-foreground,.text-sidebar-foreground\/70{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/70{color:color-mix(in oklab,var(--sidebar-foreground)70%,transparent)}}.text-sidebar-primary-foreground{color:var(--sidebar-primary-foreground)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.decoration-neutral-300{-webkit-text-decoration-color:var(--color-neutral-300);text-decoration-color:var(--color-neutral-300)}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0px_0px_1px_0px_rgba\(0\,0\,0\,0\.03\)\,0px_1px_2px_0px_rgba\(0\,0\,0\,0\.06\)\]{--tw-shadow:0px 0px 1px 0px var(--tw-shadow-color,#00000008),0px 1px 2px 0px var(--tw-shadow-color,#0000000f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[inset_0px_0px_0px_1px_rgba\(26\,26\,0\,0\.16\)\]{--tw-shadow:inset 0px 0px 0px 1px var(--tw-shadow-color,#1a1a0029);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-gray-300{--tw-ring-color:var(--color-gray-300)}.ring-ring\/10{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.ring-ring\/10{--tw-ring-color:color-mix(in oklab,var(--ring)10%,transparent)}}.ring-sidebar-ring{--tw-ring-color:var(--sidebar-ring)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-ring\/50{outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.outline-ring\/50{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opacity\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\]{transition-property:width,height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-none{transition-property:none}.delay-300{transition-delay:.3s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-750{--tw-duration:.75s;transition-duration:.75s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.delay-300{--tw-animation-delay:.3s;animation-delay:.3s}.fade-in-0{--tw-enter-opacity:0}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}.running{animation-play-state:running}.not-has-\[nav\]\:hidden:not(:has(:is(nav))){display:none}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:1}}.group-has-data-\[collapsible\=icon\]\/sidebar-wrapper\:h-12:is(:where(.group\/sidebar-wrapper):has([data-collapsible=icon]) *){height:calc(var(--spacing)*12)}.group-has-data-\[sidebar\=menu-action\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing)*8)}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing)*-8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:size-8\!:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing)*8)!important;height:calc(var(--spacing)*8)!important}.group-data-\[collapsible\=icon\]\:w-\(--sidebar-width-icon\):is(:where(.group)[data-collapsible=icon] *){width:var(--sidebar-width-icon)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)\+\(--spacing\(4\)\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(var(--spacing)*4)))}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)\+\(--spacing\(4\)\)\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(var(--spacing)*4)) + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:p-0:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing)*0)}.group-data-\[collapsible\=icon\]\:p-0\!:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing)*0)!important}.group-data-\[collapsible\=icon\]\:pr-2\!:is(:where(.group)[data-collapsible=icon] *){padding-right:calc(var(--spacing)*2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width)*-1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width)*-1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:calc(var(--spacing)*0)}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing)*-4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:calc(var(--spacing)*0)}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:border-sidebar-border:is(:where(.group)[data-variant=floating] *){border-color:var(--sidebar-border)}.group-data-\[variant\=floating\]\:shadow-sm:is(:where(.group)[data-variant=floating] *){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-data-\[viewport\=false\]\/navigation-menu\:top-full:is(:where(.group\/navigation-menu)[data-viewport=false] *){top:100%}.group-data-\[viewport\=false\]\/navigation-menu\:mt-1\.5:is(:where(.group\/navigation-menu)[data-viewport=false] *){margin-top:calc(var(--spacing)*1.5)}.group-data-\[viewport\=false\]\/navigation-menu\:overflow-hidden:is(:where(.group\/navigation-menu)[data-viewport=false] *){overflow:hidden}.group-data-\[viewport\=false\]\/navigation-menu\:rounded-md:is(:where(.group\/navigation-menu)[data-viewport=false] *){border-radius:calc(var(--radius) - 2px)}.group-data-\[viewport\=false\]\/navigation-menu\:border:is(:where(.group\/navigation-menu)[data-viewport=false] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[viewport\=false\]\/navigation-menu\:bg-popover:is(:where(.group\/navigation-menu)[data-viewport=false] *){background-color:var(--popover)}.group-data-\[viewport\=false\]\/navigation-menu\:text-popover-foreground:is(:where(.group\/navigation-menu)[data-viewport=false] *){color:var(--popover-foreground)}.group-data-\[viewport\=false\]\/navigation-menu\:shadow:is(:where(.group\/navigation-menu)[data-viewport=false] *){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-data-\[viewport\=false\]\/navigation-menu\:duration-200:is(:where(.group\/navigation-menu)[data-viewport=false] *){--tw-duration:.2s;transition-duration:.2s}@media (hover:hover){.peer-hover\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button):hover~*){color:var(--sidebar-accent-foreground)}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button)[data-active=true]~*){color:var(--sidebar-accent-foreground)}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing)*1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing)*2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:calc(var(--spacing)*1)}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing)*7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:top-0:before{content:var(--tw-content);top:calc(var(--spacing)*0)}.before\:top-1\/2:before{content:var(--tw-content);top:50%}.before\:bottom-0:before{content:var(--tw-content);bottom:calc(var(--spacing)*0)}.before\:bottom-1\/2:before{content:var(--tw-content);bottom:50%}.before\:left-\[0\.4rem\]:before{content:var(--tw-content);left:.4rem}.before\:border-l:before{content:var(--tw-content);border-left-style:var(--tw-border-style);border-left-width:1px}.before\:border-\[\#e3e3e0\]:before{content:var(--tw-content);border-color:#e3e3e0}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing)*-2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:calc(var(--spacing)*0)}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.first\:rounded-l-md:first-child{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}.last\:rounded-r-md:last-child{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.last\:border-r-0:last-child{border-right-style:var(--tw-border-style);border-right-width:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.focus-within\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-primary:focus-within{--tw-ring-color:var(--primary)}@media (hover:hover){.hover\:border-\[\#1915014a\]:hover{border-color:#1915014a}.hover\:border-\[\#19140035\]:hover{border-color:#19140035}.hover\:border-black:hover{border-color:var(--color-black)}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-muted:hover,.hover\:bg-muted\/40:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/40:hover{background-color:color-mix(in oklab,var(--muted)40%,transparent)}}.hover\:bg-neutral-200\/60:hover{background-color:#e5e5e599}@supports (color:color-mix(in lab,red,red)){.hover\:bg-neutral-200\/60:hover{background-color:color-mix(in oklab,var(--color-neutral-200)60%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\:bg-secondary:hover,.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\:bg-sidebar-accent:hover{background-color:var(--sidebar-accent)}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-black:hover{color:var(--color-black)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-gray-400:hover{color:var(--color-gray-400)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-neutral-800:hover{color:var(--color-neutral-800)}.hover\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-current\!:hover{text-decoration-color:currentColor!important}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:group-data-\[collapsible\=offcanvas\]\:bg-sidebar:hover:is(:where(.group)[data-collapsible=offcanvas] *){background-color:var(--sidebar-background)}.hover\:after\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:var(--sidebar-border)}}.focus\:z-10:focus{z-index:10}.focus\:border-blue-300:focus{border-color:var(--color-blue-300)}.focus\:border-ring:focus{border-color:var(--ring)}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:bg-muted\/40:focus{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.focus\:bg-muted\/40:focus{background-color:color-mix(in oklab,var(--muted)40%,transparent)}}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-\[3px\]:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-primary:focus{--tw-ring-color:var(--primary)}.focus\:ring-ring:focus,.focus\:ring-ring\/50:focus{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus\:ring-ring\/50:focus{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-4:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.active\:bg-gray-100:active{background-color:var(--color-gray-100)}.active\:bg-sidebar-accent:active{background-color:var(--sidebar-accent)}.active\:text-gray-500:active{color:var(--color-gray-500)}.active\:text-gray-700:active{color:var(--color-gray-700)}.active\:text-gray-800:active{color:var(--color-gray-800)}.active\:text-sidebar-accent-foreground:active{color:var(--sidebar-accent-foreground)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}:where([data-side=left]) .in-data-\[side\=left\]\:cursor-w-resize{cursor:w-resize}:where([data-side=right]) .in-data-\[side\=right\]\:cursor-e-resize{cursor:e-resize}.has-disabled\:opacity-50:has(:disabled){opacity:.5}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\[variant\=inset\]\:bg-sidebar:has([data-variant=inset]){background-color:var(--sidebar-background)}.has-\[\>svg\]\:grid-cols-\[calc\(var\(--spacing\)\*4\)_1fr\]:has(>svg){grid-template-columns:calc(var(--spacing)*4)1fr}.has-\[\>svg\]\:gap-x-3:has(>svg){column-gap:calc(var(--spacing)*3)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus\:aria-invalid\:border-destructive:focus[aria-invalid=true]{border-color:var(--destructive)}.focus\:aria-invalid\:ring-destructive\/20:focus[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus\:aria-invalid\:ring-destructive\/20:focus[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.data-\[active\=true\]\:bg-accent\/50[data-active=true]{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.data-\[active\=true\]\:bg-accent\/50[data-active=true]{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.data-\[active\=true\]\:bg-sidebar-accent[data-active=true]{background-color:var(--sidebar-accent)}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[active\=true\]\:text-accent-foreground[data-active=true]{color:var(--accent-foreground)}.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active=true]{color:var(--sidebar-accent-foreground)}@media (hover:hover){.data-\[active\=true\]\:hover\:bg-accent[data-active=true]:hover{background-color:var(--accent)}}.data-\[active\=true\]\:focus\:bg-accent[data-active=true]:focus{background-color:var(--accent)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[inset\]\:pl-8[data-inset]{padding-left:calc(var(--spacing)*8)}.data-\[motion\=from-end\]\:slide-in-from-right-52[data-motion=from-end]{--tw-enter-translate-x:calc(52*var(--spacing))}.data-\[motion\=from-start\]\:slide-in-from-left-52[data-motion=from-start]{--tw-enter-translate-x:calc(52*var(--spacing)*-1)}.data-\[motion\=to-end\]\:slide-out-to-right-52[data-motion=to-end]{--tw-exit-translate-x:calc(52*var(--spacing))}.data-\[motion\=to-start\]\:slide-out-to-left-52[data-motion=to-start]{--tw-exit-translate-x:calc(52*var(--spacing)*-1)}.data-\[motion\^\=from-\]\:animate-in[data-motion^=from-]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[motion\^\=from-\]\:fade-in[data-motion^=from-]{--tw-enter-opacity:0}.data-\[motion\^\=to-\]\:animate-out[data-motion^=to-]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[motion\^\=to-\]\:fade-out[data-motion^=to-]{--tw-exit-opacity:0}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:color-mix(in oklab,var(--destructive)90%,transparent)}}:is(.\*\*\:data-\[slot\=navigation-menu-link\]\:focus\:ring-0 *)[data-slot=navigation-menu-link]:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:is(.\*\*\:data-\[slot\=navigation-menu-link\]\:focus\:outline-none *)[data-slot=navigation-menu-link]:focus{--tw-outline-style:none;outline-style:none}.data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:var(--primary)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.group-data-\[viewport\=false\]\/navigation-menu\:data-\[state\=closed\]\:animate-out:is(:where(.group\/navigation-menu)[data-viewport=false] *)[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.group-data-\[viewport\=false\]\/navigation-menu\:data-\[state\=closed\]\:fade-out-0:is(:where(.group\/navigation-menu)[data-viewport=false] *)[data-state=closed]{--tw-exit-opacity:0}.group-data-\[viewport\=false\]\/navigation-menu\:data-\[state\=closed\]\:zoom-out-95:is(:where(.group\/navigation-menu)[data-viewport=false] *)[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=hidden\]\:animate-out[data-state=hidden]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=hidden\]\:fade-out[data-state=hidden]{--tw-exit-opacity:0}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open],.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:var(--secondary)}.data-\[state\=open\]\:bg-sidebar-accent[data-state=open]{background-color:var(--sidebar-accent)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--accent-foreground)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:text-sidebar-accent-foreground[data-state=open]{color:var(--sidebar-accent-foreground)}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-90[data-state=open]{--tw-enter-scale:.9}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.group-data-\[viewport\=false\]\/navigation-menu\:data-\[state\=open\]\:animate-in:is(:where(.group\/navigation-menu)[data-viewport=false] *)[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.group-data-\[viewport\=false\]\/navigation-menu\:data-\[state\=open\]\:fade-in-0:is(:where(.group\/navigation-menu)[data-viewport=false] *)[data-state=open]{--tw-enter-opacity:0}.group-data-\[viewport\=false\]\/navigation-menu\:data-\[state\=open\]\:zoom-in-95:is(:where(.group\/navigation-menu)[data-viewport=false] *)[data-state=open]{--tw-enter-scale:.95}@media (hover:hover){.data-\[state\=open\]\:hover\:bg-accent[data-state=open]:hover{background-color:var(--accent)}.data-\[state\=open\]\:hover\:bg-sidebar-accent[data-state=open]:hover{background-color:var(--sidebar-accent)}.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground[data-state=open]:hover{color:var(--sidebar-accent-foreground)}}.data-\[state\=open\]\:focus\:bg-accent[data-state=open]:focus{background-color:var(--accent)}.data-\[state\=visible\]\:animate-in[data-state=visible]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=visible\]\:fade-in[data-state=visible]{--tw-enter-opacity:0}.data-\[variant\=destructive\]\:text-destructive-foreground[data-variant=destructive]{color:var(--destructive-foreground)}.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab,var(--destructive)10%,transparent)}}.data-\[variant\=destructive\]\:focus\:text-destructive-foreground[data-variant=destructive]:focus{color:var(--destructive-foreground)}@media (min-width:40rem){.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:w-\[350px\]{width:350px}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:max-w-md{max-width:var(--container-md)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-1{flex:1}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:justify-start{justify-content:flex-start}.sm\:gap-2{gap:calc(var(--spacing)*2)}.sm\:gap-2\.5{gap:calc(var(--spacing)*2.5)}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:px-0{padding-inline:calc(var(--spacing)*0)}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}.sm\:pt-0{padding-top:calc(var(--spacing)*0)}.sm\:text-left{text-align:left}}@media (min-width:48rem){.md\:absolute{position:absolute}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-12{grid-column:span 12/span 12}.md\:block{display:block}.md\:flex{display:flex}.md\:min-h-min{min-height:min-content}.md\:w-\[var\(--reka-navigation-menu-viewport-width\)\]{width:var(--reka-navigation-menu-viewport-width)}.md\:w-auto{width:auto}.md\:w-full{width:100%}.md\:max-w-2xl{max-width:var(--container-2xl)}.md\:max-w-7xl{max-width:var(--container-7xl)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-\[160px\,1fr\]{grid-template-columns:160px,1fr}.md\:p-10{padding:calc(var(--spacing)*10)}.md\:px-4{padding-inline:calc(var(--spacing)*4)}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing)*2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing)*0)}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:var(--radius-xl)}.md\:peer-data-\[variant\=inset\]\:shadow-sm:is(:where(.peer)[data-variant=inset]~*){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.md\:peer-data-\[variant\=inset\]\:peer-data-\[state\=collapsed\]\:ml-0:is(:where(.peer)[data-variant=inset]~*):is(:where(.peer)[data-state=collapsed]~*){margin-left:calc(var(--spacing)*0)}.md\:after\:hidden:after{content:var(--tw-content);display:none}}@media (min-width:64rem){.lg\:-mt-\[6\.6rem\]{margin-top:-6.6rem}.lg\:mb-0{margin-bottom:calc(var(--spacing)*0)}.lg\:mb-6{margin-bottom:calc(var(--spacing)*6)}.lg\:-ml-px{margin-left:-1px}.lg\:ml-0{margin-left:calc(var(--spacing)*0)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:aspect-auto{aspect-ratio:auto}.lg\:w-48{width:calc(var(--spacing)*48)}.lg\:w-\[438px\]{width:438px}.lg\:max-w-4xl{max-width:var(--container-4xl)}.lg\:max-w-none{max-width:none}.lg\:flex-1{flex:1}.lg\:grow{flex-grow:1}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:justify-center{justify-content:center}:where(.lg\:space-x-12>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*12)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*12)*calc(1 - var(--tw-space-x-reverse)))}.lg\:overflow-hidden{overflow:hidden}.lg\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.lg\:rounded-tl-lg{border-top-left-radius:var(--radius)}.lg\:rounded-r-lg{border-top-right-radius:var(--radius);border-bottom-right-radius:var(--radius)}.lg\:rounded-br-none{border-bottom-right-radius:0}.lg\:p-8{padding:calc(var(--spacing)*8)}.lg\:p-20{padding:calc(var(--spacing)*20)}.lg\:px-0{padding-inline:calc(var(--spacing)*0)}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}}.rtl\:flex-row-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.dark\:block:is(.dark *){display:block}.dark\:hidden:is(.dark *){display:none}.dark\:border-r:is(.dark *){border-right-style:var(--tw-border-style);border-right-width:1px}.dark\:border-\[\#3E3E3A\]:is(.dark *){border-color:#3e3e3a}.dark\:border-\[\#eeeeec\]:is(.dark *){border-color:#eeeeec}.dark\:border-gray-600:is(.dark *){border-color:var(--color-gray-600)}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:border-red-200\/10:is(.dark *){border-color:#ffcaca1a}@supports (color:color-mix(in lab,red,red)){.dark\:border-red-200\/10:is(.dark *){border-color:color-mix(in oklab,var(--color-red-200)10%,transparent)}}.dark\:border-red-800:is(.dark *){border-color:var(--color-red-800)}.dark\:border-sidebar-border:is(.dark *){border-color:var(--sidebar-border)}.dark\:bg-\[\#0a0a0a\]:is(.dark *){background-color:#0a0a0a}.dark\:bg-\[\#1D0002\]:is(.dark *){background-color:#1d0002}.dark\:bg-\[\#3E3E3A\]:is(.dark *){background-color:#3e3e3a}.dark\:bg-\[\#161615\]:is(.dark *){background-color:#161615}.dark\:bg-\[\#eeeeec\]:is(.dark *){background-color:#eeeeec}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\:bg-gray-700:is(.dark *){background-color:var(--color-gray-700)}.dark\:bg-gray-800:is(.dark *){background-color:var(--color-gray-800)}.dark\:bg-gray-900:is(.dark *){background-color:var(--color-gray-900)}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\:bg-neutral-700:is(.dark *){background-color:var(--color-neutral-700)}.dark\:bg-neutral-800:is(.dark *){background-color:var(--color-neutral-800)}.dark\:bg-red-700\/10:is(.dark *){background-color:#bf000f1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-700\/10:is(.dark *){background-color:color-mix(in oklab,var(--color-red-700)10%,transparent)}}.dark\:bg-red-950:is(.dark *){background-color:var(--color-red-950)}.dark\:bg-white:is(.dark *){background-color:var(--color-white)}.dark\:stroke-neutral-100\/20:is(.dark *){stroke:#f5f5f533}@supports (color:color-mix(in lab,red,red)){.dark\:stroke-neutral-100\/20:is(.dark *){stroke:color-mix(in oklab,var(--color-neutral-100)20%,transparent)}}.dark\:text-\[\#1C1C1A\]:is(.dark *){color:#1c1c1a}.dark\:text-\[\#A1A09A\]:is(.dark *){color:#a1a09a}.dark\:text-\[\#EDEDEC\]:is(.dark *){color:#ededec}.dark\:text-\[\#F61500\]:is(.dark *){color:#f61500}.dark\:text-\[\#FF4433\]:is(.dark *){color:#f43}.dark\:text-black:is(.dark *){color:var(--color-black)}.dark\:text-gray-200:is(.dark *){color:var(--color-gray-200)}.dark\:text-gray-300:is(.dark *){color:var(--color-gray-300)}.dark\:text-gray-400:is(.dark *){color:var(--color-gray-400)}.dark\:text-gray-600:is(.dark *){color:var(--color-gray-600)}.dark\:text-neutral-100:is(.dark *){color:var(--color-neutral-100)}.dark\:text-neutral-300:is(.dark *){color:var(--color-neutral-300)}.dark\:text-neutral-400:is(.dark *){color:var(--color-neutral-400)}.dark\:text-red-100:is(.dark *){color:var(--color-red-100)}.dark\:text-red-200:is(.dark *){color:var(--color-red-200)}.dark\:text-red-500:is(.dark *){color:var(--color-red-500)}.dark\:text-white:is(.dark *){color:var(--color-white)}.dark\:decoration-neutral-500:is(.dark *){-webkit-text-decoration-color:var(--color-neutral-500);text-decoration-color:var(--color-neutral-500)}.dark\:shadow-\[inset_0px_0px_0px_1px_\#fffaed2d\]:is(.dark *){--tw-shadow:inset 0px 0px 0px 1px var(--tw-shadow-color,#fffaed2d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\:ring-ring\/20:is(.dark *){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.dark\:ring-ring\/20:is(.dark *){--tw-ring-color:color-mix(in oklab,var(--ring)20%,transparent)}}.dark\:outline-ring\/40:is(.dark *){outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.dark\:outline-ring\/40:is(.dark *){outline-color:color-mix(in oklab,var(--ring)40%,transparent)}}.dark\:before\:border-\[\#3E3E3A\]:is(.dark *):before{content:var(--tw-content);border-color:#3e3e3a}@media (hover:hover){.dark\:hover\:border-\[\#3E3E3A\]:is(.dark *):hover{border-color:#3e3e3a}.dark\:hover\:border-\[\#62605b\]:is(.dark *):hover{border-color:#62605b}.dark\:hover\:border-white:is(.dark *):hover{border-color:var(--color-white)}.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\:hover\:bg-gray-900:is(.dark *):hover{background-color:var(--color-gray-900)}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}.dark\:hover\:bg-neutral-700\/60:is(.dark *):hover{background-color:#40404099}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-neutral-700\/60:is(.dark *):hover{background-color:color-mix(in oklab,var(--color-neutral-700)60%,transparent)}}.dark\:hover\:bg-white:is(.dark *):hover{background-color:var(--color-white)}.dark\:hover\:text-gray-200:is(.dark *):hover{color:var(--color-gray-200)}.dark\:hover\:text-gray-300:is(.dark *):hover{color:var(--color-gray-300)}.dark\:hover\:text-neutral-100:is(.dark *):hover{color:var(--color-neutral-100)}}.dark\:focus\:border-blue-700:is(.dark *):focus{border-color:var(--color-blue-700)}.dark\:focus\:border-blue-800:is(.dark *):focus{border-color:var(--color-blue-800)}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:active\:bg-gray-700:is(.dark *):active{background-color:var(--color-gray-700)}.dark\:active\:text-gray-300:is(.dark *):active{color:var(--color-gray-300)}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:focus\:aria-invalid\:ring-destructive\/40:is(.dark *):focus[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus\:aria-invalid\:ring-destructive\/40:is(.dark *):focus[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/40:is(.dark *)[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/40:is(.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab,var(--destructive)40%,transparent)}}@starting-style{.starting\:translate-y-4{--tw-translate-y:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}}@starting-style{.starting\:translate-y-6{--tw-translate-y:calc(var(--spacing)*6);translate:var(--tw-translate-x)var(--tw-translate-y)}}@starting-style{.starting\:opacity-0{opacity:0}}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-full svg{width:100%;height:100%}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\[\&_svg\:not\(\[class\*\=\\\'size-\\\'\]\)\]\:size-4 svg:not([class*="'size-'"]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing)*6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing)*6)}:is(.data-\[variant\=destructive\]\:\*\:\[svg\]\:\!text-destructive-foreground[data-variant=destructive]>*):is(svg){color:var(--destructive-foreground)!important}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:translate-y-0\.5>svg{--tw-translate-y:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.\[\&\>svg\]\:text-current>svg{color:currentColor}.\[\&\>svg\]\:text-sidebar-accent-foreground>svg{color:var(--sidebar-accent-foreground)}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing)*-2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing)*-2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}@media (hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab,var(--secondary)90%,transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}}body,html{--font-sans:"Instrument Sans",ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--background:#fff;--foreground:#0a0a0a;--card:#fff;--card-foreground:#0a0a0a;--popover:#fff;--popover-foreground:#0a0a0a;--primary:#171717;--primary-foreground:#fafafa;--secondary:#ebebeb;--secondary-foreground:#171717;--muted:#f5f5f5;--muted-foreground:#737373;--accent:#f5f5f5;--accent-foreground:#171717;--destructive:#ef4444;--destructive-foreground:#fafafa;--border:#ededed;--input:#e5e5e5;--ring:#0a0a0a;--chart-1:#e76e50;--chart-2:#2a9d90;--chart-3:#274754;--chart-4:#e8c468;--chart-5:#f4a462;--radius:.5rem;--sidebar-background:#fafafa;--sidebar-foreground:#3f3f46;--sidebar-primary:#1a1a1a;--sidebar-primary-foreground:#fafafa;--sidebar-accent:#f0f0f0;--sidebar-accent-foreground:#4d4d4d;--sidebar-border:#e8e8e8;--sidebar-ring:#3b82f6;--sidebar:#fafafa}.dark{--background:#0a0a0a;--foreground:#fafafa;--card:#0a0a0a;--card-foreground:#fafafa;--popover:#0a0a0a;--popover-foreground:#fafafa;--primary:#fafafa;--primary-foreground:#171717;--secondary:#262626;--secondary-foreground:#fafafa;--muted:#292929;--muted-foreground:#a3a3a3;--accent:#262626;--accent-foreground:#fafafa;--destructive:#ef4343;--destructive-foreground:#fafafa;--border:#262626;--input:#262626;--ring:#d4d4d4;--chart-1:#2662d9;--chart-2:#2eb88a;--chart-3:#e88c30;--chart-4:#af57db;--chart-5:#e23670;--sidebar-background:#121212;--sidebar-foreground:#f5f5f5;--sidebar-primary:#fff;--sidebar-primary-foreground:#fff;--sidebar-accent:#292929;--sidebar-accent-foreground:#f4f4f5;--sidebar-border:#292929;--sidebar-ring:#3b82f6;--sidebar:#18181b}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}} diff --git a/public/build/assets/app-CClrM5Yi.js b/public/build/assets/app-CClrM5Yi.js new file mode 100644 index 0000000..ec75f54 --- /dev/null +++ b/public/build/assets/app-CClrM5Yi.js @@ -0,0 +1,75 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Dashboard-BZ90YdF3.js","assets/AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js","assets/AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js","assets/useForwardExpose-BhawR5VU.js","assets/VisuallyHidden-Cu70tzB6.js","assets/RovingFocusGroup-CNFroA6Y.js","assets/useArrowNavigation-C6Y-ieo6.js","assets/index-C4J_hXM0.js","assets/createLucideIcon-ZFd4jktC.js","assets/Welcome-1IB3Dtj8.js","assets/Show-BCIzyp2I.js","assets/_plugin-vue_export-helper-DlAUqK2U.js","assets/Show-Cm2t8bQb.css","assets/Edit-CORuyxK8.js","assets/Edit-CBkUZj2d.css","assets/Index-Dc3cIue4.js","assets/Index-BrX3yilR.css","assets/List-C_4Kh8Sa.js","assets/List-CVA9NIjL.css","assets/ConfirmPassword-wh4eUhzq.js","assets/InputError.vue_vue_type_script_setup_true_lang-DxwKzEqx.js","assets/Input.vue_vue_type_script_setup_true_lang-BcBrC1ED.js","assets/Label.vue_vue_type_script_setup_true_lang-Dbqibcwo.js","assets/Spinner.vue_vue_type_script_setup_true_lang-BPOcqWqa.js","assets/AuthLayout.vue_vue_type_script_setup_true_lang-B14CUTB5.js","assets/index-BCC4ahRc.js","assets/ForgotPassword-BI_N76PO.js","assets/TextLink.vue_vue_type_script_setup_true_lang-JYycsYY3.js","assets/index-vZYIBGLo.js","assets/Login-4gIV6O-Y.js","assets/VisuallyHiddenInput-Drd3EMOd.js","assets/check-BNffy8wt.js","assets/Register-kQGfWF-K.js","assets/ResetPassword-BPOrjW9k.js","assets/TwoFactorChallenge-BSzmROh9.js","assets/PinInputSlot.vue_vue_type_script_setup_true_lang-D_qQ1GfR.js","assets/index--H2rh_A_.js","assets/VerifyEmail-DZQcbTya.js","assets/index-DZxzsgmi.js","assets/Show-CLkQumZS.js","assets/Show-B-qGUz9l.css","assets/Show-y_rWxQ3Z.js","assets/Show-DB_iXr9H.css","assets/Index-CYUFIW2Y.js","assets/Index-BJjYncZL.css","assets/Show-B81d5hyh.js","assets/Show-u0mnbIJy.css","assets/Appearance-x5-Kktlh.js","assets/Layout.vue_vue_type_script_setup_true_lang-ROf3tZlv.js","assets/Password-Cz_oOx7m.js","assets/Profile-DvBzD9G7.js","assets/DialogTitle.vue_vue_type_script_setup_true_lang-Dg2xd9QK.js","assets/TwoFactor-CEzdBq7S.js","assets/Show-BGTgh0m1.js","assets/Show-Csw6sC-4.css"])))=>i.map(i=>d[i]); +const dh="modulepreload",hh=function(e){return"/build/"+e},Ba={},Ae=function(t,r,n){let s=Promise.resolve();if(r&&r.length>0){let l=function(f){return Promise.all(f.map(c=>Promise.resolve(c).then(u=>({status:"fulfilled",value:u}),u=>({status:"rejected",reason:u}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),a=o?.nonce||o?.getAttribute("nonce");s=l(r.map(f=>{if(f=hh(f),f in Ba)return;Ba[f]=!0;const c=f.endsWith(".css"),u=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${f}"]${u}`))return;const h=document.createElement("link");if(h.rel=c?"stylesheet":dh,c||(h.as="script"),h.crossOrigin="",h.href=f,a&&h.setAttribute("nonce",a),document.head.appendChild(h),c)return new Promise((p,d)=>{h.addEventListener("load",p),h.addEventListener("error",()=>d(new Error(`Unable to preload CSS for ${f}`)))})}))}function i(o){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=o,window.dispatchEvent(a),!a.defaultPrevented)throw o}return s.then(o=>{for(const a of o||[])a.status==="rejected"&&i(a.reason);return t().catch(i)})};var vu=typeof global=="object"&&global&&global.Object===Object&&global,ph=typeof self=="object"&&self&&self.Object===Object&&self,Dt=vu||ph||Function("return this")(),It=Dt.Symbol,bu=Object.prototype,yh=bu.hasOwnProperty,gh=bu.toString,Zr=It?It.toStringTag:void 0;function mh(e){var t=yh.call(e,Zr),r=e[Zr];try{e[Zr]=void 0;var n=!0}catch{}var s=gh.call(e);return n&&(t?e[Zr]=r:delete e[Zr]),s}var vh=Object.prototype,bh=vh.toString;function wh(e){return bh.call(e)}var Sh="[object Null]",_h="[object Undefined]",Ua=It?It.toStringTag:void 0;function zr(e){return e==null?e===void 0?_h:Sh:Ua&&Ua in Object(e)?mh(e):wh(e)}function or(e){return e!=null&&typeof e=="object"}var Eh="[object Symbol]";function ea(e){return typeof e=="symbol"||or(e)&&zr(e)==Eh}function Ph(e,t){for(var r=-1,n=e==null?0:e.length,s=Array(n);++r-1&&e%1==0&&e-1&&e%1==0&&e<=zh}function Jh(e){return e!=null&&na(e.length)&&!Su(e)}var Qh=Object.prototype;function Eu(e){var t=e&&e.constructor,r=typeof t=="function"&&t.prototype||Qh;return e===r}function Xh(e,t){for(var r=-1,n=Array(e);++r-1}function sy(e,t){var r=this.__data__,n=Rs(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this}function Jt(e){var t=-1,r=e==null?0:e.length;for(this.clear();++ta))return!1;var f=i.get(e),c=i.get(t);if(f&&c)return f==t&&c==e;var u=-1,h=!0,p=r&Zg?new hs:void 0;for(i.set(e,t),i.set(t,e);++u":">",'"':""","'":"'"},Am=wy(Pm),Nu=/[&<>"']/g,Tm=RegExp(Nu.source);function Om(e){return e=Ru(e),e&&Tm.test(e)?e.replace(Nu,Am):e}var xm=Object.prototype,Cm=xm.hasOwnProperty;function Rm(e,t){return e!=null&&Cm.call(e,t)}function Fm(e,t){return e!=null&&Em(e,t,Rm)}function qu(e,t){return Lu(e,t)}function $m(e,t,r,n){if(!Vr(e))return e;t=oa(t,e);for(var s=-1,i=t.length,o=i-1,a=e;a!=null&&++s-1e3&&E<1e3||C.call(/e/,P))return P;var ae=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if(typeof E=="number"){var he=E<0?-$(-E):$(E);if(he!==E){var we=String(he),re=w.call(P,we.length+1);return m.call(we,ae,"$&_")+"."+m.call(m.call(re,/([0-9]{3})/g,"$&_"),/_$/,"")}}return m.call(P,ae,"$&_")}var se=Lm,Ue=se.custom,_e=_(Ue)?Ue:null,ge={__proto__:null,double:'"',single:"'"},Ke={__proto__:null,double:/(["\\])/g,single:/(['\\])/g};pi=function E(P,ae,he,we){var re=ae||{};if(R(re,"quoteStyle")&&!R(ge,re.quoteStyle))throw new TypeError('option "quoteStyle" must be "single" or "double"');if(R(re,"maxStringLength")&&(typeof re.maxStringLength=="number"?re.maxStringLength<0&&re.maxStringLength!==1/0:re.maxStringLength!==null))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var Zt=R(re,"customInspect")?re.customInspect:!0;if(typeof Zt!="boolean"&&Zt!=="symbol")throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(R(re,"indent")&&re.indent!==null&&re.indent!==" "&&!(parseInt(re.indent,10)===re.indent&&re.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(R(re,"numericSeparator")&&typeof re.numericSeparator!="boolean")throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var fr=re.numericSeparator;if(typeof P>"u")return"undefined";if(P===null)return"null";if(typeof P=="boolean")return P?"true":"false";if(typeof P=="string")return ie(P,re);if(typeof P=="number"){if(P===0)return 1/0/P>0?"0":"-0";var lt=String(P);return fr?L(P,lt):lt}if(typeof P=="bigint"){var er=String(P)+"n";return fr?L(P,er):er}var ni=typeof re.depth>"u"?5:re.depth;if(typeof he>"u"&&(he=0),he>=ni&&ni>0&&typeof P=="object")return ot(P)?"[Array]":"[Object]";var Ir=ze(re,he);if(typeof we>"u")we=[];else if(B(we,P)>=0)return"[Circular]";function bt(Dr,Bn,fh){if(Bn&&(we=D.call(we),we.push(Bn)),fh){var ja={depth:re.depth};return R(re,"quoteStyle")&&(ja.quoteStyle=re.quoteStyle),E(Dr,ja,he+1,we)}return E(Dr,re,he+1,we)}if(typeof P=="function"&&!Oe(P)){var $a=U(P),Ia=ur(P,bt);return"[Function"+($a?": "+$a:" (anonymous)")+"]"+(Ia.length>0?" { "+j.call(Ia,", ")+" }":"")}if(_(P)){var Da=J?m.call(String(P),/^(Symbol\(.*\))_[^)]*$/,"$1"):W.call(P);return typeof P=="object"&&!J?oe(Da):Da}if(Y(P)){for(var Yr="<"+A.call(String(P.nodeName)),si=P.attributes||[],jn=0;jn",Yr}if(ot(P)){if(P.length===0)return"[]";var ii=ur(P,bt);return Ir&&!at(ii)?"["+Mt(ii,Ir)+"]":"[ "+j.call(ii,", ")+" ]"}if(te(P)){var oi=ur(P,bt);return!("cause"in Error.prototype)&&"cause"in P&&!V.call(P,"cause")?"{ ["+String(P)+"] "+j.call(F.call("[cause]: "+bt(P.cause),oi),", ")+" }":oi.length===0?"["+String(P)+"]":"{ ["+String(P)+"] "+j.call(oi,", ")+" }"}if(typeof P=="object"&&Zt){if(_e&&typeof P[_e]=="function"&&se)return se(P,{depth:ni-he});if(Zt!=="symbol"&&typeof P.inspect=="function")return P.inspect()}if(q(P)){var Ma=[];return n&&n.call(P,function(Dr,Bn){Ma.push(bt(Bn,P,!0)+" => "+bt(Dr,P))}),xe("Map",r.call(P),Ma,Ir)}if(H(P)){var La=[];return a&&a.call(P,function(Dr){La.push(bt(Dr,P))}),xe("Set",o.call(P),La,Ir)}if(N(P))return $e("WeakMap");if(G(P))return $e("WeakSet");if(K(P))return $e("WeakRef");if(fe(P))return oe(bt(Number(P)));if(O(P))return oe(bt(k.call(P)));if(y(P))return oe(d.call(P));if(be(P))return oe(bt(String(P)));if(typeof window<"u"&&P===window)return"{ [object Window] }";if(typeof globalThis<"u"&&P===globalThis||typeof hl<"u"&&P===hl)return"{ [object globalThis] }";if(!dt(P)&&!Oe(P)){var ai=ur(P,bt),Na=X?X(P)===Object.prototype:P instanceof Object||P.constructor===Object,li=P instanceof Object?"":"null prototype",qa=!Na&&ne&&Object(P)===P&&ne in P?w.call(I(P),8,-1):li?"Object":"",uh=Na||typeof P.constructor!="function"?"":P.constructor.name?P.constructor.name+" ":"",ci=uh+(qa||li?"["+j.call(F.call([],qa||[],li||[]),": ")+"] ":"");return ai.length===0?ci+"{}":Ir?ci+"{"+Mt(ai,Ir)+"}":ci+"{ "+j.call(ai,", ")+" }"}return String(P)};function Ge(E,P,ae){var he=ae.quoteStyle||P,we=ge[he];return we+E+we}function et(E){return m.call(String(E),/"/g,""")}function Fe(E){return!ne||!(typeof E=="object"&&(ne in E||typeof E[ne]<"u"))}function ot(E){return I(E)==="[object Array]"&&Fe(E)}function dt(E){return I(E)==="[object Date]"&&Fe(E)}function Oe(E){return I(E)==="[object RegExp]"&&Fe(E)}function te(E){return I(E)==="[object Error]"&&Fe(E)}function be(E){return I(E)==="[object String]"&&Fe(E)}function fe(E){return I(E)==="[object Number]"&&Fe(E)}function y(E){return I(E)==="[object Boolean]"&&Fe(E)}function _(E){if(J)return E&&typeof E=="object"&&E instanceof Symbol;if(typeof E=="symbol")return!0;if(!E||typeof E!="object"||!W)return!1;try{return W.call(E),!0}catch{}return!1}function O(E){if(!E||typeof E!="object"||!k)return!1;try{return k.call(E),!0}catch{}return!1}var M=Object.prototype.hasOwnProperty||function(E){return E in this};function R(E,P){return M.call(E,P)}function I(E){return v.call(E)}function U(E){if(E.name)return E.name;var P=S.call(g.call(E),/^function\s*([\w$]+)/);return P?P[1]:null}function B(E,P){if(E.indexOf)return E.indexOf(P);for(var ae=0,he=E.length;aeP.maxStringLength){var ae=E.length-P.maxStringLength,he="... "+ae+" more character"+(ae>1?"s":"");return ie(w.call(E,0,P.maxStringLength),P)+he}var we=Ke[P.quoteStyle||"single"];we.lastIndex=0;var re=m.call(m.call(E,we,"\\$1"),/[\x00-\x1f]/g,ye);return Ge(re,"single",P)}function ye(E){var P=E.charCodeAt(0),ae={8:"b",9:"t",10:"n",12:"f",13:"r"}[P];return ae?"\\"+ae:"\\x"+(P<16?"0":"")+b.call(P.toString(16))}function oe(E){return"Object("+E+")"}function $e(E){return E+" { ? }"}function xe(E,P,ae,he){var we=he?Mt(ae,he):j.call(ae,", ");return E+" ("+P+") {"+we+"}"}function at(E){for(var P=0;P=0)return!1;return!0}function ze(E,P){var ae;if(E.indent===" ")ae=" ";else if(typeof E.indent=="number"&&E.indent>0)ae=j.call(Array(E.indent+1)," ");else return null;return{base:ae,prev:j.call(Array(P+1),ae)}}function Mt(E,P){if(E.length===0)return"";var ae=` +`+P.prev+P.base;return ae+j.call(E,","+ae)+` +`+P.prev}function ur(E,P){var ae=ot(E),he=[];if(ae){he.length=E.length;for(var we=0;we"u"||!F?e:F(Uint8Array),J={__proto__:null,"%AggregateError%":typeof AggregateError>"u"?e:AggregateError,"%Array%":Array,"%ArrayBuffer%":typeof ArrayBuffer>"u"?e:ArrayBuffer,"%ArrayIteratorPrototype%":C&&F?F([][Symbol.iterator]()):e,"%AsyncFromSyncIteratorPrototype%":e,"%AsyncFunction%":x,"%AsyncGenerator%":x,"%AsyncGeneratorFunction%":x,"%AsyncIteratorPrototype%":x,"%Atomics%":typeof Atomics>"u"?e:Atomics,"%BigInt%":typeof BigInt>"u"?e:BigInt,"%BigInt64Array%":typeof BigInt64Array>"u"?e:BigInt64Array,"%BigUint64Array%":typeof BigUint64Array>"u"?e:BigUint64Array,"%Boolean%":Boolean,"%DataView%":typeof DataView>"u"?e:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":r,"%eval%":eval,"%EvalError%":n,"%Float16Array%":typeof Float16Array>"u"?e:Float16Array,"%Float32Array%":typeof Float32Array>"u"?e:Float32Array,"%Float64Array%":typeof Float64Array>"u"?e:Float64Array,"%FinalizationRegistry%":typeof FinalizationRegistry>"u"?e:FinalizationRegistry,"%Function%":g,"%GeneratorFunction%":x,"%Int8Array%":typeof Int8Array>"u"?e:Int8Array,"%Int16Array%":typeof Int16Array>"u"?e:Int16Array,"%Int32Array%":typeof Int32Array>"u"?e:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":C&&F?F(F([][Symbol.iterator]())):e,"%JSON%":typeof JSON=="object"?JSON:e,"%Map%":typeof Map>"u"?e:Map,"%MapIteratorPrototype%":typeof Map>"u"||!C||!F?e:F(new Map()[Symbol.iterator]()),"%Math%":Math,"%Number%":Number,"%Object%":t,"%Object.getOwnPropertyDescriptor%":w,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":typeof Promise>"u"?e:Promise,"%Proxy%":typeof Proxy>"u"?e:Proxy,"%RangeError%":s,"%ReferenceError%":i,"%Reflect%":typeof Reflect>"u"?e:Reflect,"%RegExp%":RegExp,"%Set%":typeof Set>"u"?e:Set,"%SetIteratorPrototype%":typeof Set>"u"||!C||!F?e:F(new Set()[Symbol.iterator]()),"%SharedArrayBuffer%":typeof SharedArrayBuffer>"u"?e:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":C&&F?F(""[Symbol.iterator]()):e,"%Symbol%":C?Symbol:e,"%SyntaxError%":o,"%ThrowTypeError%":A,"%TypedArray%":W,"%TypeError%":a,"%Uint8Array%":typeof Uint8Array>"u"?e:Uint8Array,"%Uint8ClampedArray%":typeof Uint8ClampedArray>"u"?e:Uint8ClampedArray,"%Uint16Array%":typeof Uint16Array>"u"?e:Uint16Array,"%Uint32Array%":typeof Uint32Array>"u"?e:Uint32Array,"%URIError%":l,"%WeakMap%":typeof WeakMap>"u"?e:WeakMap,"%WeakRef%":typeof WeakRef>"u"?e:WeakRef,"%WeakSet%":typeof WeakSet>"u"?e:WeakSet,"%Function.prototype.call%":k,"%Function.prototype.apply%":$,"%Object.defineProperty%":m,"%Object.getPrototypeOf%":j,"%Math.abs%":f,"%Math.floor%":c,"%Math.max%":u,"%Math.min%":h,"%Math.pow%":p,"%Math.round%":d,"%Math.sign%":v,"%Reflect.getPrototypeOf%":D};if(F)try{null.error}catch(Oe){var ne=F(F(Oe));J["%Error.prototype%"]=ne}var V=function Oe(te){var be;if(te==="%AsyncFunction%")be=S("async function () {}");else if(te==="%GeneratorFunction%")be=S("function* () {}");else if(te==="%AsyncGeneratorFunction%")be=S("async function* () {}");else if(te==="%AsyncGenerator%"){var fe=Oe("%AsyncGeneratorFunction%");fe&&(be=fe.prototype)}else if(te==="%AsyncIteratorPrototype%"){var y=Oe("%AsyncGenerator%");y&&F&&(be=F(y.prototype))}return J[te]=be,be},X={__proto__:null,"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},L=Is(),se=av(),Ue=L.call(k,Array.prototype.concat),_e=L.call($,Array.prototype.splice),ge=L.call(k,String.prototype.replace),Ke=L.call(k,String.prototype.slice),Ge=L.call(k,RegExp.prototype.exec),et=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,Fe=/\\(\\)?/g,ot=function(te){var be=Ke(te,0,1),fe=Ke(te,-1);if(be==="%"&&fe!=="%")throw new o("invalid intrinsic syntax, expected closing `%`");if(fe==="%"&&be!=="%")throw new o("invalid intrinsic syntax, expected opening `%`");var y=[];return ge(te,et,function(_,O,M,R){y[y.length]=M?ge(R,Fe,"$1"):O||_}),y},dt=function(te,be){var fe=te,y;if(se(X,fe)&&(y=X[fe],fe="%"+y[0]+"%"),se(J,fe)){var _=J[fe];if(_===x&&(_=V(fe)),typeof _>"u"&&!be)throw new a("intrinsic "+te+" exists, but is not available. Please file an issue!");return{alias:y,name:fe,value:_}}throw new o("intrinsic "+te+" does not exist!")};return zi=function(te,be){if(typeof te!="string"||te.length===0)throw new a("intrinsic name must be a non-empty string");if(arguments.length>1&&typeof be!="boolean")throw new a('"allowMissing" argument must be a boolean');if(Ge(/^%?[^%]*%?$/,te)===null)throw new o("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var fe=ot(te),y=fe.length>0?fe[0]:"",_=dt("%"+y+"%",be),O=_.name,M=_.value,R=!1,I=_.alias;I&&(y=I[0],_e(fe,Ue([0,1],I)));for(var U=1,B=!0;U=fe.length){var H=w(M,q);B=!!H,B&&"get"in H&&!("originalValue"in H.get)?M=H.get:M=M[q]}else B=se(M,q),M=M[q];B&&!R&&(J[O]=M)}}return M},zi}var Ji,Ql;function Wu(){if(Ql)return Ji;Ql=1;var e=ua(),t=Vu(),r=t([e("%String.prototype.indexOf%")]);return Ji=function(s,i){var o=e(s,!!i);return typeof o=="function"&&r(s,".prototype.")>-1?t([o]):o},Ji}var Qi,Xl;function Ku(){if(Xl)return Qi;Xl=1;var e=ua(),t=Wu(),r=$s(),n=Jr(),s=e("%Map%",!0),i=t("Map.prototype.get",!0),o=t("Map.prototype.set",!0),a=t("Map.prototype.has",!0),l=t("Map.prototype.delete",!0),f=t("Map.prototype.size",!0);return Qi=!!s&&function(){var u,h={assert:function(p){if(!h.has(p))throw new n("Side channel does not contain "+r(p))},delete:function(p){if(u){var d=l(u,p);return f(u)===0&&(u=void 0),d}return!1},get:function(p){if(u)return i(u,p)},has:function(p){return u?a(u,p):!1},set:function(p,d){u||(u=new s),o(u,p,d)}};return h},Qi}var Xi,Yl;function lv(){if(Yl)return Xi;Yl=1;var e=ua(),t=Wu(),r=$s(),n=Ku(),s=Jr(),i=e("%WeakMap%",!0),o=t("WeakMap.prototype.get",!0),a=t("WeakMap.prototype.set",!0),l=t("WeakMap.prototype.has",!0),f=t("WeakMap.prototype.delete",!0);return Xi=i?function(){var u,h,p={assert:function(d){if(!p.has(d))throw new s("Side channel does not contain "+r(d))},delete:function(d){if(i&&d&&(typeof d=="object"||typeof d=="function")){if(u)return f(u,d)}else if(n&&h)return h.delete(d);return!1},get:function(d){return i&&d&&(typeof d=="object"||typeof d=="function")&&u?o(u,d):h&&h.get(d)},has:function(d){return i&&d&&(typeof d=="object"||typeof d=="function")&&u?l(u,d):!!h&&h.has(d)},set:function(d,v){i&&d&&(typeof d=="object"||typeof d=="function")?(u||(u=new i),a(u,d,v)):n&&(h||(h=n()),h.set(d,v))}};return p}:n,Xi}var Yi,Zl;function cv(){if(Zl)return Yi;Zl=1;var e=Jr(),t=$s(),r=Nm(),n=Ku(),s=lv(),i=s||n||r;return Yi=function(){var a,l={assert:function(f){if(!l.has(f))throw new e("Side channel does not contain "+t(f))},delete:function(f){return!!a&&a.delete(f)},get:function(f){return a&&a.get(f)},has:function(f){return!!a&&a.has(f)},set:function(f,c){a||(a=i()),a.set(f,c)}};return l},Yi}var Zi,ec;function fa(){if(ec)return Zi;ec=1;var e=String.prototype.replace,t=/%20/g,r={RFC1738:"RFC1738",RFC3986:"RFC3986"};return Zi={default:r.RFC3986,formatters:{RFC1738:function(n){return e.call(n,t,"+")},RFC3986:function(n){return String(n)}},RFC1738:r.RFC1738,RFC3986:r.RFC3986},Zi}var eo,tc;function Gu(){if(tc)return eo;tc=1;var e=fa(),t=Object.prototype.hasOwnProperty,r=Array.isArray,n=(function(){for(var g=[],S=0;S<256;++S)g.push("%"+((S<16?"0":"")+S.toString(16)).toUpperCase());return g})(),s=function(S){for(;S.length>1;){var w=S.pop(),m=w.obj[w.prop];if(r(m)){for(var b=[],A=0;A=f?C.slice(j,j+f):C,$=[],k=0;k=48&&x<=57||x>=65&&x<=90||x>=97&&x<=122||A===e.RFC1738&&(x===40||x===41)){$[$.length]=D.charAt(k);continue}if(x<128){$[$.length]=n[x];continue}if(x<2048){$[$.length]=n[192|x>>6]+n[128|x&63];continue}if(x<55296||x>=57344){$[$.length]=n[224|x>>12]+n[128|x>>6&63]+n[128|x&63];continue}k+=1,x=65536+((x&1023)<<10|D.charCodeAt(k)&1023),$[$.length]=n[240|x>>18]+n[128|x>>12&63]+n[128|x>>6&63]+n[128|x&63]}F+=$.join("")}return F},u=function(S){for(var w=[{obj:{o:S},prop:"o"}],m=[],b=0;b"u"&&(Ue=0)}if(typeof D=="function"?L=D(S,L):L instanceof Date?L=x(L):w==="comma"&&i(L)&&(L=t.maybeMap(L,function(O){return O instanceof Date?x(O):O})),L===null){if(A)return j&&!ne?j(S,c.encoder,V,"key",W):S;L=""}if(u(L)||t.isBuffer(L)){if(j){var Ke=ne?S:j(S,c.encoder,V,"key",W);return[J(Ke)+"="+J(j(L,c.encoder,V,"value",W))]}return[J(S)+"="+J(String(L))]}var Ge=[];if(typeof L>"u")return Ge;var et;if(w==="comma"&&i(L))ne&&j&&(L=t.maybeMap(L,j)),et=[{value:L.length>0?L.join(",")||null:void 0}];else if(i(D))et=D;else{var Fe=Object.keys(L);et=$?Fe.sort($):Fe}var ot=F?String(S).replace(/\./g,"%2E"):String(S),dt=m&&i(L)&&L.length===1?ot+"[]":ot;if(b&&i(L)&&L.length===0)return dt+"[]";for(var Oe=0;Oe"u"?g.encodeDotInKeys===!0?!0:c.allowDots:!!g.allowDots;return{addQueryPrefix:typeof g.addQueryPrefix=="boolean"?g.addQueryPrefix:c.addQueryPrefix,allowDots:C,allowEmptyArrays:typeof g.allowEmptyArrays=="boolean"?!!g.allowEmptyArrays:c.allowEmptyArrays,arrayFormat:A,charset:S,charsetSentinel:typeof g.charsetSentinel=="boolean"?g.charsetSentinel:c.charsetSentinel,commaRoundTrip:!!g.commaRoundTrip,delimiter:typeof g.delimiter>"u"?c.delimiter:g.delimiter,encode:typeof g.encode=="boolean"?g.encode:c.encode,encodeDotInKeys:typeof g.encodeDotInKeys=="boolean"?g.encodeDotInKeys:c.encodeDotInKeys,encoder:typeof g.encoder=="function"?g.encoder:c.encoder,encodeValuesOnly:typeof g.encodeValuesOnly=="boolean"?g.encodeValuesOnly:c.encodeValuesOnly,filter:b,format:w,formatter:m,serializeDate:typeof g.serializeDate=="function"?g.serializeDate:c.serializeDate,skipNulls:typeof g.skipNulls=="boolean"?g.skipNulls:c.skipNulls,sort:typeof g.sort=="function"?g.sort:null,strictNullHandling:typeof g.strictNullHandling=="boolean"?g.strictNullHandling:c.strictNullHandling}};return to=function(v,g){var S=v,w=d(g),m,b;typeof w.filter=="function"?(b=w.filter,S=b("",S)):i(w.filter)&&(b=w.filter,m=b);var A=[];if(typeof S!="object"||S===null)return"";var C=s[w.arrayFormat],F=C==="comma"&&w.commaRoundTrip;m||(m=Object.keys(S)),w.sort&&m.sort(w.sort);for(var j=e(),D=0;D0?W+x:""},to}var ro,nc;function fv(){if(nc)return ro;nc=1;var e=Gu(),t=Object.prototype.hasOwnProperty,r=Array.isArray,n={allowDots:!1,allowEmptyArrays:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decodeDotInKeys:!1,decoder:e.decode,delimiter:"&",depth:5,duplicates:"combine",ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictDepth:!1,strictNullHandling:!1,throwOnLimitExceeded:!1},s=function(h){return h.replace(/&#(\d+);/g,function(p,d){return String.fromCharCode(parseInt(d,10))})},i=function(h,p,d){if(h&&typeof h=="string"&&p.comma&&h.indexOf(",")>-1)return h.split(",");if(p.throwOnLimitExceeded&&d>=p.arrayLimit)throw new RangeError("Array limit exceeded. Only "+p.arrayLimit+" element"+(p.arrayLimit===1?"":"s")+" allowed in an array.");return h},o="utf8=%26%2310003%3B",a="utf8=%E2%9C%93",l=function(p,d){var v={__proto__:null},g=d.ignoreQueryPrefix?p.replace(/^\?/,""):p;g=g.replace(/%5B/gi,"[").replace(/%5D/gi,"]");var S=d.parameterLimit===1/0?void 0:d.parameterLimit,w=g.split(d.delimiter,d.throwOnLimitExceeded?S+1:S);if(d.throwOnLimitExceeded&&w.length>S)throw new RangeError("Parameter limit exceeded. Only "+S+" parameter"+(S===1?"":"s")+" allowed.");var m=-1,b,A=d.charset;if(d.charsetSentinel)for(b=0;b-1&&($=r($)?[$]:$);var k=t.call(v,D);k&&d.duplicates==="combine"?v[D]=e.combine(v[D],$):(!k||d.duplicates==="last")&&(v[D]=$)}return v},f=function(h,p,d,v){var g=0;if(h.length>0&&h[h.length-1]==="[]"){var S=h.slice(0,-1).join("");g=Array.isArray(p)&&p[S]?p[S].length:0}for(var w=v?p:i(p,d,g),m=h.length-1;m>=0;--m){var b,A=h[m];if(A==="[]"&&d.parseArrays)b=d.allowEmptyArrays&&(w===""||d.strictNullHandling&&w===null)?[]:e.combine([],w);else{b=d.plainObjects?{__proto__:null}:{};var C=A.charAt(0)==="["&&A.charAt(A.length-1)==="]"?A.slice(1,-1):A,F=d.decodeDotInKeys?C.replace(/%2E/g,"."):C,j=parseInt(F,10);!d.parseArrays&&F===""?b={0:w}:!isNaN(j)&&A!==F&&String(j)===F&&j>=0&&d.parseArrays&&j<=d.arrayLimit?(b=[],b[j]=w):F!=="__proto__"&&(b[F]=w)}w=b}return w},c=function(p,d,v,g){if(p){var S=v.allowDots?p.replace(/\.([^.[]+)/g,"[$1]"):p,w=/(\[[^[\]]*])/,m=/(\[[^[\]]*])/g,b=v.depth>0&&w.exec(S),A=b?S.slice(0,b.index):S,C=[];if(A){if(!v.plainObjects&&t.call(Object.prototype,A)&&!v.allowPrototypes)return;C.push(A)}for(var F=0;v.depth>0&&(b=m.exec(S))!==null&&F"u"?n.charset:p.charset,v=typeof p.duplicates>"u"?n.duplicates:p.duplicates;if(v!=="combine"&&v!=="first"&&v!=="last")throw new TypeError("The duplicates option must be either combine, first, or last");var g=typeof p.allowDots>"u"?p.decodeDotInKeys===!0?!0:n.allowDots:!!p.allowDots;return{allowDots:g,allowEmptyArrays:typeof p.allowEmptyArrays=="boolean"?!!p.allowEmptyArrays:n.allowEmptyArrays,allowPrototypes:typeof p.allowPrototypes=="boolean"?p.allowPrototypes:n.allowPrototypes,allowSparse:typeof p.allowSparse=="boolean"?p.allowSparse:n.allowSparse,arrayLimit:typeof p.arrayLimit=="number"?p.arrayLimit:n.arrayLimit,charset:d,charsetSentinel:typeof p.charsetSentinel=="boolean"?p.charsetSentinel:n.charsetSentinel,comma:typeof p.comma=="boolean"?p.comma:n.comma,decodeDotInKeys:typeof p.decodeDotInKeys=="boolean"?p.decodeDotInKeys:n.decodeDotInKeys,decoder:typeof p.decoder=="function"?p.decoder:n.decoder,delimiter:typeof p.delimiter=="string"||e.isRegExp(p.delimiter)?p.delimiter:n.delimiter,depth:typeof p.depth=="number"||p.depth===!1?+p.depth:n.depth,duplicates:v,ignoreQueryPrefix:p.ignoreQueryPrefix===!0,interpretNumericEntities:typeof p.interpretNumericEntities=="boolean"?p.interpretNumericEntities:n.interpretNumericEntities,parameterLimit:typeof p.parameterLimit=="number"?p.parameterLimit:n.parameterLimit,parseArrays:p.parseArrays!==!1,plainObjects:typeof p.plainObjects=="boolean"?p.plainObjects:n.plainObjects,strictDepth:typeof p.strictDepth=="boolean"?!!p.strictDepth:n.strictDepth,strictNullHandling:typeof p.strictNullHandling=="boolean"?p.strictNullHandling:n.strictNullHandling,throwOnLimitExceeded:typeof p.throwOnLimitExceeded=="boolean"?p.throwOnLimitExceeded:!1}};return ro=function(h,p){var d=u(p);if(h===""||h===null||typeof h>"u")return d.plainObjects?{__proto__:null}:{};for(var v=typeof h=="string"?l(h,d):h,g=d.plainObjects?{__proto__:null}:{},S=Object.keys(v),w=0;wt=>{const r=hv.call(t);return e[r]||(e[r]=r.slice(8,-1).toLowerCase())})(Object.create(null)),Tt=e=>(e=e.toLowerCase(),t=>Ms(t)===e),Ls=e=>t=>typeof t===e,{isArray:Qr}=Array,Kr=Ls("undefined");function xn(e){return e!==null&&!Kr(e)&&e.constructor!==null&&!Kr(e.constructor)&&st(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Qu=Tt("ArrayBuffer");function pv(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Qu(e.buffer),t}const yv=Ls("string"),st=Ls("function"),Xu=Ls("number"),Cn=e=>e!==null&&typeof e=="object",gv=e=>e===!0||e===!1,es=e=>{if(Ms(e)!=="object")return!1;const t=da(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Ju in e)&&!(Ds in e)},mv=e=>{if(!Cn(e)||xn(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},vv=Tt("Date"),bv=Tt("File"),wv=Tt("Blob"),Sv=Tt("FileList"),_v=e=>Cn(e)&&st(e.pipe),Ev=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||st(e.append)&&((t=Ms(e))==="formdata"||t==="object"&&st(e.toString)&&e.toString()==="[object FormData]"))},Pv=Tt("URLSearchParams"),[Av,Tv,Ov,xv]=["ReadableStream","Request","Response","Headers"].map(Tt),Cv=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Rn(e,t,{allOwnKeys:r=!1}={}){if(e===null||typeof e>"u")return;let n,s;if(typeof e!="object"&&(e=[e]),Qr(e))for(n=0,s=e.length;n0;)if(s=r[n],t===s.toLowerCase())return s;return null}const vr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Zu=e=>!Kr(e)&&e!==vr;function xo(){const{caseless:e,skipUndefined:t}=Zu(this)&&this||{},r={},n=(s,i)=>{const o=e&&Yu(r,i)||i;es(r[o])&&es(s)?r[o]=xo(r[o],s):es(s)?r[o]=xo({},s):Qr(s)?r[o]=s.slice():(!t||!Kr(s))&&(r[o]=s)};for(let s=0,i=arguments.length;s(Rn(t,(s,i)=>{r&&st(s)?e[i]=zu(s,r):e[i]=s},{allOwnKeys:n}),e),Fv=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),$v=(e,t,r,n)=>{e.prototype=Object.create(t.prototype,n),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),r&&Object.assign(e.prototype,r)},Iv=(e,t,r,n)=>{let s,i,o;const a={};if(t=t||{},e==null)return t;do{for(s=Object.getOwnPropertyNames(e),i=s.length;i-- >0;)o=s[i],(!n||n(o,e,t))&&!a[o]&&(t[o]=e[o],a[o]=!0);e=r!==!1&&da(e)}while(e&&(!r||r(e,t))&&e!==Object.prototype);return t},Dv=(e,t,r)=>{e=String(e),(r===void 0||r>e.length)&&(r=e.length),r-=t.length;const n=e.indexOf(t,r);return n!==-1&&n===r},Mv=e=>{if(!e)return null;if(Qr(e))return e;let t=e.length;if(!Xu(t))return null;const r=new Array(t);for(;t-- >0;)r[t]=e[t];return r},Lv=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&da(Uint8Array)),Nv=(e,t)=>{const n=(e&&e[Ds]).call(e);let s;for(;(s=n.next())&&!s.done;){const i=s.value;t.call(e,i[0],i[1])}},qv=(e,t)=>{let r;const n=[];for(;(r=e.exec(t))!==null;)n.push(r);return n},jv=Tt("HTMLFormElement"),Bv=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(r,n,s){return n.toUpperCase()+s}),oc=(({hasOwnProperty:e})=>(t,r)=>e.call(t,r))(Object.prototype),Uv=Tt("RegExp"),ef=(e,t)=>{const r=Object.getOwnPropertyDescriptors(e),n={};Rn(r,(s,i)=>{let o;(o=t(s,i,e))!==!1&&(n[i]=o||s)}),Object.defineProperties(e,n)},Hv=e=>{ef(e,(t,r)=>{if(st(e)&&["arguments","caller","callee"].indexOf(r)!==-1)return!1;const n=e[r];if(st(n)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+r+"'")})}})},kv=(e,t)=>{const r={},n=s=>{s.forEach(i=>{r[i]=!0})};return Qr(e)?n(e):n(String(e).split(t)),r},Vv=()=>{},Wv=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Kv(e){return!!(e&&st(e.append)&&e[Ju]==="FormData"&&e[Ds])}const Gv=e=>{const t=new Array(10),r=(n,s)=>{if(Cn(n)){if(t.indexOf(n)>=0)return;if(xn(n))return n;if(!("toJSON"in n)){t[s]=n;const i=Qr(n)?[]:{};return Rn(n,(o,a)=>{const l=r(o,s+1);!Kr(l)&&(i[a]=l)}),t[s]=void 0,i}}return n};return r(e,0)},zv=Tt("AsyncFunction"),Jv=e=>e&&(Cn(e)||st(e))&&st(e.then)&&st(e.catch),tf=((e,t)=>e?setImmediate:t?((r,n)=>(vr.addEventListener("message",({source:s,data:i})=>{s===vr&&i===r&&n.length&&n.shift()()},!1),s=>{n.push(s),vr.postMessage(r,"*")}))(`axios@${Math.random()}`,[]):r=>setTimeout(r))(typeof setImmediate=="function",st(vr.postMessage)),Qv=typeof queueMicrotask<"u"?queueMicrotask.bind(vr):typeof process<"u"&&process.nextTick||tf,Xv=e=>e!=null&&st(e[Ds]),T={isArray:Qr,isArrayBuffer:Qu,isBuffer:xn,isFormData:Ev,isArrayBufferView:pv,isString:yv,isNumber:Xu,isBoolean:gv,isObject:Cn,isPlainObject:es,isEmptyObject:mv,isReadableStream:Av,isRequest:Tv,isResponse:Ov,isHeaders:xv,isUndefined:Kr,isDate:vv,isFile:bv,isBlob:wv,isRegExp:Uv,isFunction:st,isStream:_v,isURLSearchParams:Pv,isTypedArray:Lv,isFileList:Sv,forEach:Rn,merge:xo,extend:Rv,trim:Cv,stripBOM:Fv,inherits:$v,toFlatObject:Iv,kindOf:Ms,kindOfTest:Tt,endsWith:Dv,toArray:Mv,forEachEntry:Nv,matchAll:qv,isHTMLForm:jv,hasOwnProperty:oc,hasOwnProp:oc,reduceDescriptors:ef,freezeMethods:Hv,toObjectSet:kv,toCamelCase:Bv,noop:Vv,toFiniteNumber:Wv,findKey:Yu,global:vr,isContextDefined:Zu,isSpecCompliantForm:Kv,toJSONObject:Gv,isAsyncFn:zv,isThenable:Jv,setImmediate:tf,asap:Qv,isIterable:Xv};function ee(e,t,r,n,s){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),r&&(this.config=r),n&&(this.request=n),s&&(this.response=s,this.status=s.status?s.status:null)}T.inherits(ee,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:T.toJSONObject(this.config),code:this.code,status:this.status}}});const rf=ee.prototype,nf={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{nf[e]={value:e}});Object.defineProperties(ee,nf);Object.defineProperty(rf,"isAxiosError",{value:!0});ee.from=(e,t,r,n,s,i)=>{const o=Object.create(rf);T.toFlatObject(e,o,function(c){return c!==Error.prototype},f=>f!=="isAxiosError");const a=e&&e.message?e.message:"Error",l=t==null&&e?e.code:t;return ee.call(o,a,l,r,n,s),e&&o.cause==null&&Object.defineProperty(o,"cause",{value:e,configurable:!0}),o.name=e&&e.name||"Error",i&&Object.assign(o,i),o};const Yv=null;function Co(e){return T.isPlainObject(e)||T.isArray(e)}function sf(e){return T.endsWith(e,"[]")?e.slice(0,-2):e}function ac(e,t,r){return e?e.concat(t).map(function(s,i){return s=sf(s),!r&&i?"["+s+"]":s}).join(r?".":""):t}function Zv(e){return T.isArray(e)&&!e.some(Co)}const eb=T.toFlatObject(T,{},null,function(t){return/^is[A-Z]/.test(t)});function Ns(e,t,r){if(!T.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,r=T.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,function(v,g){return!T.isUndefined(g[v])});const n=r.metaTokens,s=r.visitor||c,i=r.dots,o=r.indexes,l=(r.Blob||typeof Blob<"u"&&Blob)&&T.isSpecCompliantForm(t);if(!T.isFunction(s))throw new TypeError("visitor must be a function");function f(d){if(d===null)return"";if(T.isDate(d))return d.toISOString();if(T.isBoolean(d))return d.toString();if(!l&&T.isBlob(d))throw new ee("Blob is not supported. Use a Buffer instead.");return T.isArrayBuffer(d)||T.isTypedArray(d)?l&&typeof Blob=="function"?new Blob([d]):Buffer.from(d):d}function c(d,v,g){let S=d;if(d&&!g&&typeof d=="object"){if(T.endsWith(v,"{}"))v=n?v:v.slice(0,-2),d=JSON.stringify(d);else if(T.isArray(d)&&Zv(d)||(T.isFileList(d)||T.endsWith(v,"[]"))&&(S=T.toArray(d)))return v=sf(v),S.forEach(function(m,b){!(T.isUndefined(m)||m===null)&&t.append(o===!0?ac([v],b,i):o===null?v:v+"[]",f(m))}),!1}return Co(d)?!0:(t.append(ac(g,v,i),f(d)),!1)}const u=[],h=Object.assign(eb,{defaultVisitor:c,convertValue:f,isVisitable:Co});function p(d,v){if(!T.isUndefined(d)){if(u.indexOf(d)!==-1)throw Error("Circular reference detected in "+v.join("."));u.push(d),T.forEach(d,function(S,w){(!(T.isUndefined(S)||S===null)&&s.call(t,S,T.isString(w)?w.trim():w,v,h))===!0&&p(S,v?v.concat(w):[w])}),u.pop()}}if(!T.isObject(e))throw new TypeError("data must be an object");return p(e),t}function lc(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(n){return t[n]})}function ha(e,t){this._pairs=[],e&&Ns(e,this,t)}const of=ha.prototype;of.append=function(t,r){this._pairs.push([t,r])};of.toString=function(t){const r=t?function(n){return t.call(this,n,lc)}:lc;return this._pairs.map(function(s){return r(s[0])+"="+r(s[1])},"").join("&")};function tb(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function af(e,t,r){if(!t)return e;const n=r&&r.encode||tb;T.isFunction(r)&&(r={serialize:r});const s=r&&r.serialize;let i;if(s?i=s(t,r):i=T.isURLSearchParams(t)?t.toString():new ha(t,r).toString(n),i){const o=e.indexOf("#");o!==-1&&(e=e.slice(0,o)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class cc{constructor(){this.handlers=[]}use(t,r,n){return this.handlers.push({fulfilled:t,rejected:r,synchronous:n?n.synchronous:!1,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){T.forEach(this.handlers,function(n){n!==null&&t(n)})}}const lf={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},rb=typeof URLSearchParams<"u"?URLSearchParams:ha,nb=typeof FormData<"u"?FormData:null,sb=typeof Blob<"u"?Blob:null,ib={isBrowser:!0,classes:{URLSearchParams:rb,FormData:nb,Blob:sb},protocols:["http","https","file","blob","url","data"]},pa=typeof window<"u"&&typeof document<"u",Ro=typeof navigator=="object"&&navigator||void 0,ob=pa&&(!Ro||["ReactNative","NativeScript","NS"].indexOf(Ro.product)<0),ab=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",lb=pa&&window.location.href||"http://localhost",cb=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:pa,hasStandardBrowserEnv:ob,hasStandardBrowserWebWorkerEnv:ab,navigator:Ro,origin:lb},Symbol.toStringTag,{value:"Module"})),Ve={...cb,...ib};function ub(e,t){return Ns(e,new Ve.classes.URLSearchParams,{visitor:function(r,n,s,i){return Ve.isNode&&T.isBuffer(r)?(this.append(n,r.toString("base64")),!1):i.defaultVisitor.apply(this,arguments)},...t})}function fb(e){return T.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function db(e){const t={},r=Object.keys(e);let n;const s=r.length;let i;for(n=0;n=r.length;return o=!o&&T.isArray(s)?s.length:o,l?(T.hasOwnProp(s,o)?s[o]=[s[o],n]:s[o]=n,!a):((!s[o]||!T.isObject(s[o]))&&(s[o]=[]),t(r,n,s[o],i)&&T.isArray(s[o])&&(s[o]=db(s[o])),!a)}if(T.isFormData(e)&&T.isFunction(e.entries)){const r={};return T.forEachEntry(e,(n,s)=>{t(fb(n),s,r,0)}),r}return null}function hb(e,t,r){if(T.isString(e))try{return(t||JSON.parse)(e),T.trim(e)}catch(n){if(n.name!=="SyntaxError")throw n}return(r||JSON.stringify)(e)}const Fn={transitional:lf,adapter:["xhr","http","fetch"],transformRequest:[function(t,r){const n=r.getContentType()||"",s=n.indexOf("application/json")>-1,i=T.isObject(t);if(i&&T.isHTMLForm(t)&&(t=new FormData(t)),T.isFormData(t))return s?JSON.stringify(cf(t)):t;if(T.isArrayBuffer(t)||T.isBuffer(t)||T.isStream(t)||T.isFile(t)||T.isBlob(t)||T.isReadableStream(t))return t;if(T.isArrayBufferView(t))return t.buffer;if(T.isURLSearchParams(t))return r.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(i){if(n.indexOf("application/x-www-form-urlencoded")>-1)return ub(t,this.formSerializer).toString();if((a=T.isFileList(t))||n.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Ns(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return i||s?(r.setContentType("application/json",!1),hb(t)):t}],transformResponse:[function(t){const r=this.transitional||Fn.transitional,n=r&&r.forcedJSONParsing,s=this.responseType==="json";if(T.isResponse(t)||T.isReadableStream(t))return t;if(t&&T.isString(t)&&(n&&!this.responseType||s)){const o=!(r&&r.silentJSONParsing)&&s;try{return JSON.parse(t,this.parseReviver)}catch(a){if(o)throw a.name==="SyntaxError"?ee.from(a,ee.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Ve.classes.FormData,Blob:Ve.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};T.forEach(["delete","get","head","post","put","patch"],e=>{Fn.headers[e]={}});const pb=T.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),yb=e=>{const t={};let r,n,s;return e&&e.split(` +`).forEach(function(o){s=o.indexOf(":"),r=o.substring(0,s).trim().toLowerCase(),n=o.substring(s+1).trim(),!(!r||t[r]&&pb[r])&&(r==="set-cookie"?t[r]?t[r].push(n):t[r]=[n]:t[r]=t[r]?t[r]+", "+n:n)}),t},uc=Symbol("internals");function en(e){return e&&String(e).trim().toLowerCase()}function ts(e){return e===!1||e==null?e:T.isArray(e)?e.map(ts):String(e)}function gb(e){const t=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let n;for(;n=r.exec(e);)t[n[1]]=n[2];return t}const mb=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function so(e,t,r,n,s){if(T.isFunction(n))return n.call(this,t,r);if(s&&(t=r),!!T.isString(t)){if(T.isString(n))return t.indexOf(n)!==-1;if(T.isRegExp(n))return n.test(t)}}function vb(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,r,n)=>r.toUpperCase()+n)}function bb(e,t){const r=T.toCamelCase(" "+t);["get","set","has"].forEach(n=>{Object.defineProperty(e,n+r,{value:function(s,i,o){return this[n].call(this,t,s,i,o)},configurable:!0})})}let it=class{constructor(t){t&&this.set(t)}set(t,r,n){const s=this;function i(a,l,f){const c=en(l);if(!c)throw new Error("header name must be a non-empty string");const u=T.findKey(s,c);(!u||s[u]===void 0||f===!0||f===void 0&&s[u]!==!1)&&(s[u||l]=ts(a))}const o=(a,l)=>T.forEach(a,(f,c)=>i(f,c,l));if(T.isPlainObject(t)||t instanceof this.constructor)o(t,r);else if(T.isString(t)&&(t=t.trim())&&!mb(t))o(yb(t),r);else if(T.isObject(t)&&T.isIterable(t)){let a={},l,f;for(const c of t){if(!T.isArray(c))throw TypeError("Object iterator must return a key-value pair");a[f=c[0]]=(l=a[f])?T.isArray(l)?[...l,c[1]]:[l,c[1]]:c[1]}o(a,r)}else t!=null&&i(r,t,n);return this}get(t,r){if(t=en(t),t){const n=T.findKey(this,t);if(n){const s=this[n];if(!r)return s;if(r===!0)return gb(s);if(T.isFunction(r))return r.call(this,s,n);if(T.isRegExp(r))return r.exec(s);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,r){if(t=en(t),t){const n=T.findKey(this,t);return!!(n&&this[n]!==void 0&&(!r||so(this,this[n],n,r)))}return!1}delete(t,r){const n=this;let s=!1;function i(o){if(o=en(o),o){const a=T.findKey(n,o);a&&(!r||so(n,n[a],a,r))&&(delete n[a],s=!0)}}return T.isArray(t)?t.forEach(i):i(t),s}clear(t){const r=Object.keys(this);let n=r.length,s=!1;for(;n--;){const i=r[n];(!t||so(this,this[i],i,t,!0))&&(delete this[i],s=!0)}return s}normalize(t){const r=this,n={};return T.forEach(this,(s,i)=>{const o=T.findKey(n,i);if(o){r[o]=ts(s),delete r[i];return}const a=t?vb(i):String(i).trim();a!==i&&delete r[i],r[a]=ts(s),n[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const r=Object.create(null);return T.forEach(this,(n,s)=>{n!=null&&n!==!1&&(r[s]=t&&T.isArray(n)?n.join(", "):n)}),r}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,r])=>t+": "+r).join(` +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...r){const n=new this(t);return r.forEach(s=>n.set(s)),n}static accessor(t){const n=(this[uc]=this[uc]={accessors:{}}).accessors,s=this.prototype;function i(o){const a=en(o);n[a]||(bb(s,o),n[a]=!0)}return T.isArray(t)?t.forEach(i):i(t),this}};it.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);T.reduceDescriptors(it.prototype,({value:e},t)=>{let r=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(n){this[r]=n}}});T.freezeMethods(it);function io(e,t){const r=this||Fn,n=t||r,s=it.from(n.headers);let i=n.data;return T.forEach(e,function(a){i=a.call(r,i,s.normalize(),t?t.status:void 0)}),s.normalize(),i}function uf(e){return!!(e&&e.__CANCEL__)}function Xr(e,t,r){ee.call(this,e??"canceled",ee.ERR_CANCELED,t,r),this.name="CanceledError"}T.inherits(Xr,ee,{__CANCEL__:!0});function ff(e,t,r){const n=r.config.validateStatus;!r.status||!n||n(r.status)?e(r):t(new ee("Request failed with status code "+r.status,[ee.ERR_BAD_REQUEST,ee.ERR_BAD_RESPONSE][Math.floor(r.status/100)-4],r.config,r.request,r))}function wb(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function Sb(e,t){e=e||10;const r=new Array(e),n=new Array(e);let s=0,i=0,o;return t=t!==void 0?t:1e3,function(l){const f=Date.now(),c=n[i];o||(o=f),r[s]=l,n[s]=f;let u=i,h=0;for(;u!==s;)h+=r[u++],u=u%e;if(s=(s+1)%e,s===i&&(i=(i+1)%e),f-o{r=c,s=null,i&&(clearTimeout(i),i=null),e(...f)};return[(...f)=>{const c=Date.now(),u=c-r;u>=n?o(f,c):(s=f,i||(i=setTimeout(()=>{i=null,o(s)},n-u)))},()=>s&&o(s)]}const ps=(e,t,r=3)=>{let n=0;const s=Sb(50,250);return _b(i=>{const o=i.loaded,a=i.lengthComputable?i.total:void 0,l=o-n,f=s(l),c=o<=a;n=o;const u={loaded:o,total:a,progress:a?o/a:void 0,bytes:l,rate:f||void 0,estimated:f&&a&&c?(a-o)/f:void 0,event:i,lengthComputable:a!=null,[t?"download":"upload"]:!0};e(u)},r)},fc=(e,t)=>{const r=e!=null;return[n=>t[0]({lengthComputable:r,total:e,loaded:n}),t[1]]},dc=e=>(...t)=>T.asap(()=>e(...t)),Eb=Ve.hasStandardBrowserEnv?((e,t)=>r=>(r=new URL(r,Ve.origin),e.protocol===r.protocol&&e.host===r.host&&(t||e.port===r.port)))(new URL(Ve.origin),Ve.navigator&&/(msie|trident)/i.test(Ve.navigator.userAgent)):()=>!0,Pb=Ve.hasStandardBrowserEnv?{write(e,t,r,n,s,i){const o=[e+"="+encodeURIComponent(t)];T.isNumber(r)&&o.push("expires="+new Date(r).toGMTString()),T.isString(n)&&o.push("path="+n),T.isString(s)&&o.push("domain="+s),i===!0&&o.push("secure"),document.cookie=o.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function Ab(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Tb(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function df(e,t,r){let n=!Ab(t);return e&&(n||r==!1)?Tb(e,t):t}const hc=e=>e instanceof it?{...e}:e;function Cr(e,t){t=t||{};const r={};function n(f,c,u,h){return T.isPlainObject(f)&&T.isPlainObject(c)?T.merge.call({caseless:h},f,c):T.isPlainObject(c)?T.merge({},c):T.isArray(c)?c.slice():c}function s(f,c,u,h){if(T.isUndefined(c)){if(!T.isUndefined(f))return n(void 0,f,u,h)}else return n(f,c,u,h)}function i(f,c){if(!T.isUndefined(c))return n(void 0,c)}function o(f,c){if(T.isUndefined(c)){if(!T.isUndefined(f))return n(void 0,f)}else return n(void 0,c)}function a(f,c,u){if(u in t)return n(f,c);if(u in e)return n(void 0,f)}const l={url:i,method:i,data:i,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:a,headers:(f,c,u)=>s(hc(f),hc(c),u,!0)};return T.forEach(Object.keys({...e,...t}),function(c){const u=l[c]||s,h=u(e[c],t[c],c);T.isUndefined(h)&&u!==a||(r[c]=h)}),r}const hf=e=>{const t=Cr({},e);let{data:r,withXSRFToken:n,xsrfHeaderName:s,xsrfCookieName:i,headers:o,auth:a}=t;if(t.headers=o=it.from(o),t.url=af(df(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),a&&o.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):""))),T.isFormData(r)){if(Ve.hasStandardBrowserEnv||Ve.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if(T.isFunction(r.getHeaders)){const l=r.getHeaders(),f=["content-type","content-length"];Object.entries(l).forEach(([c,u])=>{f.includes(c.toLowerCase())&&o.set(c,u)})}}if(Ve.hasStandardBrowserEnv&&(n&&T.isFunction(n)&&(n=n(t)),n||n!==!1&&Eb(t.url))){const l=s&&i&&Pb.read(i);l&&o.set(s,l)}return t},Ob=typeof XMLHttpRequest<"u",xb=Ob&&function(e){return new Promise(function(r,n){const s=hf(e);let i=s.data;const o=it.from(s.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:f}=s,c,u,h,p,d;function v(){p&&p(),d&&d(),s.cancelToken&&s.cancelToken.unsubscribe(c),s.signal&&s.signal.removeEventListener("abort",c)}let g=new XMLHttpRequest;g.open(s.method.toUpperCase(),s.url,!0),g.timeout=s.timeout;function S(){if(!g)return;const m=it.from("getAllResponseHeaders"in g&&g.getAllResponseHeaders()),A={data:!a||a==="text"||a==="json"?g.responseText:g.response,status:g.status,statusText:g.statusText,headers:m,config:e,request:g};ff(function(F){r(F),v()},function(F){n(F),v()},A),g=null}"onloadend"in g?g.onloadend=S:g.onreadystatechange=function(){!g||g.readyState!==4||g.status===0&&!(g.responseURL&&g.responseURL.indexOf("file:")===0)||setTimeout(S)},g.onabort=function(){g&&(n(new ee("Request aborted",ee.ECONNABORTED,e,g)),g=null)},g.onerror=function(b){const A=b&&b.message?b.message:"Network Error",C=new ee(A,ee.ERR_NETWORK,e,g);C.event=b||null,n(C),g=null},g.ontimeout=function(){let b=s.timeout?"timeout of "+s.timeout+"ms exceeded":"timeout exceeded";const A=s.transitional||lf;s.timeoutErrorMessage&&(b=s.timeoutErrorMessage),n(new ee(b,A.clarifyTimeoutError?ee.ETIMEDOUT:ee.ECONNABORTED,e,g)),g=null},i===void 0&&o.setContentType(null),"setRequestHeader"in g&&T.forEach(o.toJSON(),function(b,A){g.setRequestHeader(A,b)}),T.isUndefined(s.withCredentials)||(g.withCredentials=!!s.withCredentials),a&&a!=="json"&&(g.responseType=s.responseType),f&&([h,d]=ps(f,!0),g.addEventListener("progress",h)),l&&g.upload&&([u,p]=ps(l),g.upload.addEventListener("progress",u),g.upload.addEventListener("loadend",p)),(s.cancelToken||s.signal)&&(c=m=>{g&&(n(!m||m.type?new Xr(null,e,g):m),g.abort(),g=null)},s.cancelToken&&s.cancelToken.subscribe(c),s.signal&&(s.signal.aborted?c():s.signal.addEventListener("abort",c)));const w=wb(s.url);if(w&&Ve.protocols.indexOf(w)===-1){n(new ee("Unsupported protocol "+w+":",ee.ERR_BAD_REQUEST,e));return}g.send(i||null)})},Cb=(e,t)=>{const{length:r}=e=e?e.filter(Boolean):[];if(t||r){let n=new AbortController,s;const i=function(f){if(!s){s=!0,a();const c=f instanceof Error?f:this.reason;n.abort(c instanceof ee?c:new Xr(c instanceof Error?c.message:c))}};let o=t&&setTimeout(()=>{o=null,i(new ee(`timeout ${t} of ms exceeded`,ee.ETIMEDOUT))},t);const a=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach(f=>{f.unsubscribe?f.unsubscribe(i):f.removeEventListener("abort",i)}),e=null)};e.forEach(f=>f.addEventListener("abort",i));const{signal:l}=n;return l.unsubscribe=()=>T.asap(a),l}},Rb=function*(e,t){let r=e.byteLength;if(r{const s=Fb(e,t);let i=0,o,a=l=>{o||(o=!0,n&&n(l))};return new ReadableStream({async pull(l){try{const{done:f,value:c}=await s.next();if(f){a(),l.close();return}let u=c.byteLength;if(r){let h=i+=u;r(h)}l.enqueue(new Uint8Array(c))}catch(f){throw a(f),f}},cancel(l){return a(l),s.return()}},{highWaterMark:2})},yc=64*1024,{isFunction:Hn}=T,Ib=(({Request:e,Response:t})=>({Request:e,Response:t}))(T.global),{ReadableStream:gc,TextEncoder:mc}=T.global,vc=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Db=e=>{e=T.merge.call({skipUndefined:!0},Ib,e);const{fetch:t,Request:r,Response:n}=e,s=t?Hn(t):typeof fetch=="function",i=Hn(r),o=Hn(n);if(!s)return!1;const a=s&&Hn(gc),l=s&&(typeof mc=="function"?(d=>v=>d.encode(v))(new mc):async d=>new Uint8Array(await new r(d).arrayBuffer())),f=i&&a&&vc(()=>{let d=!1;const v=new r(Ve.origin,{body:new gc,method:"POST",get duplex(){return d=!0,"half"}}).headers.has("Content-Type");return d&&!v}),c=o&&a&&vc(()=>T.isReadableStream(new n("").body)),u={stream:c&&(d=>d.body)};s&&["text","arrayBuffer","blob","formData","stream"].forEach(d=>{!u[d]&&(u[d]=(v,g)=>{let S=v&&v[d];if(S)return S.call(v);throw new ee(`Response type '${d}' is not supported`,ee.ERR_NOT_SUPPORT,g)})});const h=async d=>{if(d==null)return 0;if(T.isBlob(d))return d.size;if(T.isSpecCompliantForm(d))return(await new r(Ve.origin,{method:"POST",body:d}).arrayBuffer()).byteLength;if(T.isArrayBufferView(d)||T.isArrayBuffer(d))return d.byteLength;if(T.isURLSearchParams(d)&&(d=d+""),T.isString(d))return(await l(d)).byteLength},p=async(d,v)=>{const g=T.toFiniteNumber(d.getContentLength());return g??h(v)};return async d=>{let{url:v,method:g,data:S,signal:w,cancelToken:m,timeout:b,onDownloadProgress:A,onUploadProgress:C,responseType:F,headers:j,withCredentials:D="same-origin",fetchOptions:$}=hf(d),k=t||fetch;F=F?(F+"").toLowerCase():"text";let x=Cb([w,m&&m.toAbortSignal()],b),W=null;const J=x&&x.unsubscribe&&(()=>{x.unsubscribe()});let ne;try{if(C&&f&&g!=="get"&&g!=="head"&&(ne=await p(j,S))!==0){let _e=new r(v,{method:"POST",body:S,duplex:"half"}),ge;if(T.isFormData(S)&&(ge=_e.headers.get("content-type"))&&j.setContentType(ge),_e.body){const[Ke,Ge]=fc(ne,ps(dc(C)));S=pc(_e.body,yc,Ke,Ge)}}T.isString(D)||(D=D?"include":"omit");const V=i&&"credentials"in r.prototype,X={...$,signal:x,method:g.toUpperCase(),headers:j.normalize().toJSON(),body:S,duplex:"half",credentials:V?D:void 0};W=i&&new r(v,X);let L=await(i?k(W,$):k(v,X));const se=c&&(F==="stream"||F==="response");if(c&&(A||se&&J)){const _e={};["status","statusText","headers"].forEach(et=>{_e[et]=L[et]});const ge=T.toFiniteNumber(L.headers.get("content-length")),[Ke,Ge]=A&&fc(ge,ps(dc(A),!0))||[];L=new n(pc(L.body,yc,Ke,()=>{Ge&&Ge(),J&&J()}),_e)}F=F||"text";let Ue=await u[T.findKey(u,F)||"text"](L,d);return!se&&J&&J(),await new Promise((_e,ge)=>{ff(_e,ge,{data:Ue,headers:it.from(L.headers),status:L.status,statusText:L.statusText,config:d,request:W})})}catch(V){throw J&&J(),V&&V.name==="TypeError"&&/Load failed|fetch/i.test(V.message)?Object.assign(new ee("Network Error",ee.ERR_NETWORK,d,W),{cause:V.cause||V}):ee.from(V,V&&V.code,d,W)}}},Mb=new Map,pf=e=>{let t=e?e.env:{};const{fetch:r,Request:n,Response:s}=t,i=[n,s,r];let o=i.length,a=o,l,f,c=Mb;for(;a--;)l=i[a],f=c.get(l),f===void 0&&c.set(l,f=a?new Map:Db(t)),c=f;return f};pf();const Fo={http:Yv,xhr:xb,fetch:{get:pf}};T.forEach(Fo,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const bc=e=>`- ${e}`,Lb=e=>T.isFunction(e)||e===null||e===!1,yf={getAdapter:(e,t)=>{e=T.isArray(e)?e:[e];const{length:r}=e;let n,s;const i={};for(let o=0;o`adapter ${l} `+(f===!1?"is not supported by the environment":"is not available in the build"));let a=r?o.length>1?`since : +`+o.map(bc).join(` +`):" "+bc(o[0]):"as no adapter specified";throw new ee("There is no suitable adapter to dispatch the request "+a,"ERR_NOT_SUPPORT")}return s},adapters:Fo};function oo(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Xr(null,e)}function wc(e){return oo(e),e.headers=it.from(e.headers),e.data=io.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),yf.getAdapter(e.adapter||Fn.adapter,e)(e).then(function(n){return oo(e),n.data=io.call(e,e.transformResponse,n),n.headers=it.from(n.headers),n},function(n){return uf(n)||(oo(e),n&&n.response&&(n.response.data=io.call(e,e.transformResponse,n.response),n.response.headers=it.from(n.response.headers))),Promise.reject(n)})}const gf="1.12.2",qs={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{qs[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}});const Sc={};qs.transitional=function(t,r,n){function s(i,o){return"[Axios v"+gf+"] Transitional option '"+i+"'"+o+(n?". "+n:"")}return(i,o,a)=>{if(t===!1)throw new ee(s(o," has been removed"+(r?" in "+r:"")),ee.ERR_DEPRECATED);return r&&!Sc[o]&&(Sc[o]=!0,console.warn(s(o," has been deprecated since v"+r+" and will be removed in the near future"))),t?t(i,o,a):!0}};qs.spelling=function(t){return(r,n)=>(console.warn(`${n} is likely a misspelling of ${t}`),!0)};function Nb(e,t,r){if(typeof e!="object")throw new ee("options must be an object",ee.ERR_BAD_OPTION_VALUE);const n=Object.keys(e);let s=n.length;for(;s-- >0;){const i=n[s],o=t[i];if(o){const a=e[i],l=a===void 0||o(a,i,e);if(l!==!0)throw new ee("option "+i+" must be "+l,ee.ERR_BAD_OPTION_VALUE);continue}if(r!==!0)throw new ee("Unknown option "+i,ee.ERR_BAD_OPTION)}}const rs={assertOptions:Nb,validators:qs},Ot=rs.validators;let Sr=class{constructor(t){this.defaults=t||{},this.interceptors={request:new cc,response:new cc}}async request(t,r){try{return await this._request(t,r)}catch(n){if(n instanceof Error){let s={};Error.captureStackTrace?Error.captureStackTrace(s):s=new Error;const i=s.stack?s.stack.replace(/^.+\n/,""):"";try{n.stack?i&&!String(n.stack).endsWith(i.replace(/^.+\n.+\n/,""))&&(n.stack+=` +`+i):n.stack=i}catch{}}throw n}}_request(t,r){typeof t=="string"?(r=r||{},r.url=t):r=t||{},r=Cr(this.defaults,r);const{transitional:n,paramsSerializer:s,headers:i}=r;n!==void 0&&rs.assertOptions(n,{silentJSONParsing:Ot.transitional(Ot.boolean),forcedJSONParsing:Ot.transitional(Ot.boolean),clarifyTimeoutError:Ot.transitional(Ot.boolean)},!1),s!=null&&(T.isFunction(s)?r.paramsSerializer={serialize:s}:rs.assertOptions(s,{encode:Ot.function,serialize:Ot.function},!0)),r.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?r.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:r.allowAbsoluteUrls=!0),rs.assertOptions(r,{baseUrl:Ot.spelling("baseURL"),withXsrfToken:Ot.spelling("withXSRFToken")},!0),r.method=(r.method||this.defaults.method||"get").toLowerCase();let o=i&&T.merge(i.common,i[r.method]);i&&T.forEach(["delete","get","head","post","put","patch","common"],d=>{delete i[d]}),r.headers=it.concat(o,i);const a=[];let l=!0;this.interceptors.request.forEach(function(v){typeof v.runWhen=="function"&&v.runWhen(r)===!1||(l=l&&v.synchronous,a.unshift(v.fulfilled,v.rejected))});const f=[];this.interceptors.response.forEach(function(v){f.push(v.fulfilled,v.rejected)});let c,u=0,h;if(!l){const d=[wc.bind(this),void 0];for(d.unshift(...a),d.push(...f),h=d.length,c=Promise.resolve(r);u{if(!n._listeners)return;let i=n._listeners.length;for(;i-- >0;)n._listeners[i](s);n._listeners=null}),this.promise.then=s=>{let i;const o=new Promise(a=>{n.subscribe(a),i=a}).then(s);return o.cancel=function(){n.unsubscribe(i)},o},t(function(i,o,a){n.reason||(n.reason=new Xr(i,o,a),r(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const r=this._listeners.indexOf(t);r!==-1&&this._listeners.splice(r,1)}toAbortSignal(){const t=new AbortController,r=n=>{t.abort(n)};return this.subscribe(r),t.signal.unsubscribe=()=>this.unsubscribe(r),t.signal}static source(){let t;return{token:new mf(function(s){t=s}),cancel:t}}};function jb(e){return function(r){return e.apply(null,r)}}function Bb(e){return T.isObject(e)&&e.isAxiosError===!0}const $o={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries($o).forEach(([e,t])=>{$o[t]=e});function vf(e){const t=new Sr(e),r=zu(Sr.prototype.request,t);return T.extend(r,Sr.prototype,t,{allOwnKeys:!0}),T.extend(r,t,null,{allOwnKeys:!0}),r.create=function(s){return vf(Cr(e,s))},r}const Te=vf(Fn);Te.Axios=Sr;Te.CanceledError=Xr;Te.CancelToken=qb;Te.isCancel=uf;Te.VERSION=gf;Te.toFormData=Ns;Te.AxiosError=ee;Te.Cancel=Te.CanceledError;Te.all=function(t){return Promise.all(t)};Te.spread=jb;Te.isAxiosError=Bb;Te.mergeConfig=Cr;Te.AxiosHeaders=it;Te.formToJSON=e=>cf(T.isHTMLForm(e)?new FormData(e):e);Te.getAdapter=yf.getAdapter;Te.HttpStatusCode=$o;Te.default=Te;const{Axios:jE,AxiosError:BE,CanceledError:UE,isCancel:HE,CancelToken:kE,VERSION:VE,all:WE,Cancel:KE,isAxiosError:GE,spread:zE,toFormData:JE,AxiosHeaders:QE,HttpStatusCode:XE,formToJSON:YE,getAdapter:ZE,mergeConfig:e0}=Te;function Io(e,t){let r;return function(...n){clearTimeout(r),r=setTimeout(()=>e.apply(this,n),t)}}function vt(e,t){return document.dispatchEvent(new CustomEvent(`inertia:${e}`,t))}var _c=e=>vt("before",{cancelable:!0,detail:{visit:e}}),Ub=e=>vt("error",{detail:{errors:e}}),Hb=e=>vt("exception",{cancelable:!0,detail:{exception:e}}),kb=e=>vt("finish",{detail:{visit:e}}),Vb=e=>vt("invalid",{cancelable:!0,detail:{response:e}}),Wb=e=>vt("beforeUpdate",{detail:{page:e}}),cn=e=>vt("navigate",{detail:{page:e}}),Kb=e=>vt("progress",{detail:{progress:e}}),Gb=e=>vt("start",{detail:{visit:e}}),zb=e=>vt("success",{detail:{page:e}}),Jb=(e,t)=>vt("prefetched",{detail:{fetchedAt:Date.now(),response:e.data,visit:t}}),Qb=e=>vt("prefetching",{detail:{visit:e}}),Xe=class{static set(e,t){typeof window<"u"&&window.sessionStorage.setItem(e,JSON.stringify(t))}static get(e){if(typeof window<"u")return JSON.parse(window.sessionStorage.getItem(e)||"null")}static merge(e,t){const r=this.get(e);r===null?this.set(e,t):this.set(e,{...r,...t})}static remove(e){typeof window<"u"&&window.sessionStorage.removeItem(e)}static removeNested(e,t){const r=this.get(e);r!==null&&(delete r[t],this.set(e,r))}static exists(e){try{return this.get(e)!==null}catch{return!1}}static clear(){typeof window<"u"&&window.sessionStorage.clear()}};Xe.locationVisitKey="inertiaLocationVisit";var Xb=async e=>{if(typeof window>"u")throw new Error("Unable to encrypt history");const t=bf(),r=await wf(),n=await nw(r);if(!n)throw new Error("Unable to encrypt history");return await Zb(t,n,e)},Gr={key:"historyKey",iv:"historyIv"},Yb=async e=>{const t=bf(),r=await wf();if(!r)throw new Error("Unable to decrypt history");return await ew(t,r,e)},Zb=async(e,t,r)=>{if(typeof window>"u")throw new Error("Unable to encrypt history");if(typeof window.crypto.subtle>"u")return console.warn("Encryption is not supported in this environment. SSL is required."),Promise.resolve(r);const n=new TextEncoder,s=JSON.stringify(r),i=new Uint8Array(s.length*3),o=n.encodeInto(s,i);return window.crypto.subtle.encrypt({name:"AES-GCM",iv:e},t,i.subarray(0,o.written))},ew=async(e,t,r)=>{if(typeof window.crypto.subtle>"u")return console.warn("Decryption is not supported in this environment. SSL is required."),Promise.resolve(r);const n=await window.crypto.subtle.decrypt({name:"AES-GCM",iv:e},t,r);return JSON.parse(new TextDecoder().decode(n))},bf=()=>{const e=Xe.get(Gr.iv);if(e)return new Uint8Array(e);const t=window.crypto.getRandomValues(new Uint8Array(12));return Xe.set(Gr.iv,Array.from(t)),t},tw=async()=>typeof window.crypto.subtle>"u"?(console.warn("Encryption is not supported in this environment. SSL is required."),Promise.resolve(null)):window.crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),rw=async e=>{if(typeof window.crypto.subtle>"u")return console.warn("Encryption is not supported in this environment. SSL is required."),Promise.resolve();const t=await window.crypto.subtle.exportKey("raw",e);Xe.set(Gr.key,Array.from(new Uint8Array(t)))},nw=async e=>{if(e)return e;const t=await tw();return t?(await rw(t),t):null},wf=async()=>{const e=Xe.get(Gr.key);return e?await window.crypto.subtle.importKey("raw",new Uint8Array(e),{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]):null},_t=class{static save(){le.saveScrollPositions(Array.from(this.regions()).map(e=>({top:e.scrollTop,left:e.scrollLeft})))}static regions(){return document.querySelectorAll("[scroll-region]")}static reset(){const e=typeof window<"u"?window.location.hash:null;e||window.scrollTo(0,0),this.regions().forEach(t=>{typeof t.scrollTo=="function"?t.scrollTo(0,0):(t.scrollTop=0,t.scrollLeft=0)}),this.save(),e&&setTimeout(()=>{const t=document.getElementById(e.slice(1));t?t.scrollIntoView():window.scrollTo(0,0)})}static restore(e){typeof window>"u"||window.requestAnimationFrame(()=>{this.restoreDocument(),this.regions().forEach((t,r)=>{const n=e[r];n&&(typeof t.scrollTo=="function"?t.scrollTo(n.left,n.top):(t.scrollTop=n.top,t.scrollLeft=n.left))})})}static restoreDocument(){const e=le.getDocumentScrollPosition();window.scrollTo(e.left,e.top)}static onScroll(e){const t=e.target;typeof t.hasAttribute=="function"&&t.hasAttribute("scroll-region")&&this.save()}static onWindowScroll(){le.saveDocumentScrollPosition({top:window.scrollY,left:window.scrollX})}};function Do(e){return e instanceof File||e instanceof Blob||e instanceof FileList&&e.length>0||e instanceof FormData&&Array.from(e.values()).some(t=>Do(t))||typeof e=="object"&&e!==null&&Object.values(e).some(t=>Do(t))}var Mo=e=>e instanceof FormData;function Sf(e,t=new FormData,r=null){e=e||{};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&Ef(t,_f(r,n),e[n]);return t}function _f(e,t){return e?e+"["+t+"]":t}function Ef(e,t,r){if(Array.isArray(r))return Array.from(r.keys()).forEach(n=>Ef(e,_f(t,n.toString()),r[n]));if(r instanceof Date)return e.append(t,r.toISOString());if(r instanceof File)return e.append(t,r,r.name);if(r instanceof Blob)return e.append(t,r);if(typeof r=="boolean")return e.append(t,r?"1":"0");if(typeof r=="string")return e.append(t,r);if(typeof r=="number")return e.append(t,`${r}`);if(r==null)return e.append(t,"");Sf(r,e,t)}function sr(e){return new URL(e.toString(),typeof window>"u"?void 0:window.location.toString())}var sw=(e,t,r,n,s)=>{let i=typeof e=="string"?sr(e):e;if((Do(t)||n)&&!Mo(t)&&(t=Sf(t)),Mo(t))return[i,t];const[o,a]=ya(r,i,t,s);return[sr(o),a]};function ya(e,t,r,n="brackets"){const s=e==="get"&&!Mo(r)&&Object.keys(r).length>0,i=iw(t.toString()),o=i||t.toString().startsWith("/")||t.toString()==="",a=!o&&!t.toString().startsWith("#")&&!t.toString().startsWith("?"),l=/^[.]{1,2}([/]|$)/.test(t.toString()),f=t.toString().includes("?")||s,c=t.toString().includes("#"),u=new URL(t.toString(),typeof window>"u"?"http://localhost":window.location.toString());if(s){const h={ignoreQueryPrefix:!0,parseArrays:!1};u.search=ic.stringify({...ic.parse(u.search,h),...r},{encodeValuesOnly:!0,arrayFormat:n})}return[[i?`${u.protocol}//${u.host}`:"",o?u.pathname:"",a?u.pathname.substring(l?0:1):"",f?u.search:"",c?u.hash:""].join(""),s?{}:r]}function ys(e){return e=new URL(e.href),e.hash="",e}var Ec=(e,t)=>{e.hash&&!t.hash&&ys(e).href===t.href&&(t.hash=e.hash)},Lo=(e,t)=>ys(e).href===ys(t).href;function _r(e){return e!==null&&typeof e=="object"&&e!==void 0&&"url"in e&&"method"in e}function iw(e){return/^[a-z][a-z0-9+.-]*:\/\//i.test(e)}var ow=class{constructor(){this.componentId={},this.listeners=[],this.isFirstPageLoad=!0,this.cleared=!1,this.pendingDeferredProps=null}init({initialPage:e,swapComponent:t,resolveComponent:r}){return this.page=e,this.swapComponent=t,this.resolveComponent=r,this}set(e,{replace:t=!1,preserveScroll:r=!1,preserveState:n=!1}={}){Object.keys(e.deferredProps||{}).length&&(this.pendingDeferredProps={deferredProps:e.deferredProps,component:e.component,url:e.url}),this.componentId={};const s=this.componentId;return e.clearHistory&&le.clear(),this.resolve(e.component).then(i=>{if(s!==this.componentId)return;e.rememberedState??(e.rememberedState={});const o=typeof window<"u"?window.location:new URL(e.url);return t=t||Lo(sr(e.url),o),new Promise(a=>{t?le.replaceState(e,()=>a(null)):le.pushState(e,()=>a(null))}).then(()=>{const a=!this.isTheSame(e);return this.page=e,this.cleared=!1,a&&this.fireEventsFor("newComponent"),this.isFirstPageLoad&&this.fireEventsFor("firstLoad"),this.isFirstPageLoad=!1,this.swap({component:i,page:e,preserveState:n}).then(()=>{r||_t.reset(),this.pendingDeferredProps&&this.pendingDeferredProps.component===e.component&&this.pendingDeferredProps.url===e.url&&br.fireInternalEvent("loadDeferredProps",this.pendingDeferredProps.deferredProps),this.pendingDeferredProps=null,t||cn(e)})})})}setQuietly(e,{preserveState:t=!1}={}){return this.resolve(e.component).then(r=>(this.page=e,this.cleared=!1,le.setCurrent(e),this.swap({component:r,page:e,preserveState:t})))}clear(){this.cleared=!0}isCleared(){return this.cleared}get(){return this.page}merge(e){this.page={...this.page,...e}}setUrlHash(e){this.page.url.includes(e)||(this.page.url+=e)}remember(e){this.page.rememberedState=e}swap({component:e,page:t,preserveState:r}){return this.swapComponent({component:e,page:t,preserveState:r})}resolve(e){return Promise.resolve(this.resolveComponent(e))}isTheSame(e){return this.page.component===e.component}on(e,t){return this.listeners.push({event:e,callback:t}),()=>{this.listeners=this.listeners.filter(r=>r.event!==e&&r.callback!==t)}}fireEventsFor(e){this.listeners.filter(t=>t.event===e).forEach(t=>t.callback())}},Q=new ow,Pf=class{constructor(){this.items=[],this.processingPromise=null}add(e){return this.items.push(e),this.process()}process(){return this.processingPromise??(this.processingPromise=this.processNext().finally(()=>{this.processingPromise=null})),this.processingPromise}processNext(){const e=this.items.shift();return e?Promise.resolve(e()).then(()=>this.processNext()):Promise.resolve()}},on=typeof window>"u",tn=new Pf,Pc=!on&&/CriOS/.test(window.navigator.userAgent),aw=class{constructor(){this.rememberedState="rememberedState",this.scrollRegions="scrollRegions",this.preserveUrl=!1,this.current={},this.initialState=null}remember(e,t){this.replaceState({...Q.get(),rememberedState:{...Q.get()?.rememberedState??{},[t]:e}})}restore(e){if(!on)return this.current[this.rememberedState]?this.current[this.rememberedState]?.[e]:this.initialState?.[this.rememberedState]?.[e]}pushState(e,t=null){if(!on){if(this.preserveUrl){t&&t();return}this.current=e,tn.add(()=>this.getPageData(e).then(r=>{const n=()=>this.doPushState({page:r},e.url).then(()=>t?.());return Pc?new Promise(s=>{setTimeout(()=>n().then(s))}):n()}))}}getPageData(e){return new Promise(t=>e.encryptHistory?Xb(e).then(t):t(e))}processQueue(){return tn.process()}decrypt(e=null){if(on)return Promise.resolve(e??Q.get());const t=e??window.history.state?.page;return this.decryptPageData(t).then(r=>{if(!r)throw new Error("Unable to decrypt history");return this.initialState===null?this.initialState=r??void 0:this.current=r??{},r})}decryptPageData(e){return e instanceof ArrayBuffer?Yb(e):Promise.resolve(e)}saveScrollPositions(e){tn.add(()=>Promise.resolve().then(()=>{if(window.history.state?.page)return this.doReplaceState({page:window.history.state.page,scrollRegions:e})}))}saveDocumentScrollPosition(e){tn.add(()=>Promise.resolve().then(()=>{if(window.history.state?.page)return this.doReplaceState({page:window.history.state.page,documentScrollPosition:e})}))}getScrollRegions(){return window.history.state?.scrollRegions||[]}getDocumentScrollPosition(){return window.history.state?.documentScrollPosition||{top:0,left:0}}replaceState(e,t=null){if(Q.merge(e),!on){if(this.preserveUrl){t&&t();return}this.current=e,tn.add(()=>this.getPageData(e).then(r=>{const n=()=>this.doReplaceState({page:r},e.url).then(()=>t?.());return Pc?new Promise(s=>{setTimeout(()=>n().then(s))}):n()}))}}doReplaceState(e,t){return Promise.resolve().then(()=>window.history.replaceState({...e,scrollRegions:e.scrollRegions??window.history.state?.scrollRegions,documentScrollPosition:e.documentScrollPosition??window.history.state?.documentScrollPosition},"",t))}doPushState(e,t){return Promise.resolve().then(()=>window.history.pushState(e,"",t))}getState(e,t){return this.current?.[e]??t}deleteState(e){this.current[e]!==void 0&&(delete this.current[e],this.replaceState(this.current))}clearInitialState(e){this.initialState&&this.initialState[e]!==void 0&&delete this.initialState[e]}hasAnyState(){return!!this.getAllState()}clear(){Xe.remove(Gr.key),Xe.remove(Gr.iv)}setCurrent(e){this.current=e}isValidState(e){return!!e.page}getAllState(){return this.current}};typeof window<"u"&&window.history.scrollRestoration&&(window.history.scrollRestoration="manual");var le=new aw,lw=class{constructor(){this.internalListeners=[]}init(){typeof window<"u"&&(window.addEventListener("popstate",this.handlePopstateEvent.bind(this)),window.addEventListener("scroll",Io(_t.onWindowScroll.bind(_t),100),!0)),typeof document<"u"&&document.addEventListener("scroll",Io(_t.onScroll.bind(_t),100),!0)}onGlobalEvent(e,t){const r=(n=>{const s=t(n);n.cancelable&&!n.defaultPrevented&&s===!1&&n.preventDefault()});return this.registerListener(`inertia:${e}`,r)}on(e,t){return this.internalListeners.push({event:e,listener:t}),()=>{this.internalListeners=this.internalListeners.filter(r=>r.listener!==t)}}onMissingHistoryItem(){Q.clear(),this.fireInternalEvent("missingHistoryItem")}fireInternalEvent(e,...t){this.internalListeners.filter(r=>r.event===e).forEach(r=>r.listener(...t))}registerListener(e,t){return document.addEventListener(e,t),()=>document.removeEventListener(e,t)}handlePopstateEvent(e){const t=e.state||null;if(t===null){const r=sr(Q.get().url);r.hash=window.location.hash,le.replaceState({...Q.get(),url:r.href}),_t.reset();return}if(!le.isValidState(t))return this.onMissingHistoryItem();le.decrypt(t.page).then(r=>{if(Q.get().version!==r.version){this.onMissingHistoryItem();return}De.cancelAll(),Q.setQuietly(r,{preserveState:!1}).then(()=>{_t.restore(le.getScrollRegions()),cn(Q.get())})}).catch(()=>{this.onMissingHistoryItem()})}},br=new lw,cw=class{constructor(){this.type=this.resolveType()}resolveType(){return typeof window>"u"?"navigate":window.performance&&window.performance.getEntriesByType&&window.performance.getEntriesByType("navigation").length>0?window.performance.getEntriesByType("navigation")[0].type:"navigate"}get(){return this.type}isBackForward(){return this.type==="back_forward"}isReload(){return this.type==="reload"}},ao=new cw,uw=class{static handle(){this.clearRememberedStateOnReload(),[this.handleBackForward,this.handleLocation,this.handleDefault].find(t=>t.bind(this)())}static clearRememberedStateOnReload(){ao.isReload()&&(le.deleteState(le.rememberedState),le.clearInitialState(le.rememberedState))}static handleBackForward(){if(!ao.isBackForward()||!le.hasAnyState())return!1;const e=le.getScrollRegions();return le.decrypt().then(t=>{Q.set(t,{preserveScroll:!0,preserveState:!0}).then(()=>{_t.restore(e),cn(Q.get())})}).catch(()=>{br.onMissingHistoryItem()}),!0}static handleLocation(){if(!Xe.exists(Xe.locationVisitKey))return!1;const e=Xe.get(Xe.locationVisitKey)||{};return Xe.remove(Xe.locationVisitKey),typeof window<"u"&&Q.setUrlHash(window.location.hash),le.decrypt(Q.get()).then(()=>{const t=le.getState(le.rememberedState,{}),r=le.getScrollRegions();Q.remember(t),Q.set(Q.get(),{preserveScroll:e.preserveScroll,preserveState:!0}).then(()=>{e.preserveScroll&&_t.restore(r),cn(Q.get())})}).catch(()=>{br.onMissingHistoryItem()}),!0}static handleDefault(){typeof window<"u"&&Q.setUrlHash(window.location.hash),Q.set(Q.get(),{preserveScroll:!0,preserveState:!0}).then(()=>{ao.isReload()&&_t.restore(le.getScrollRegions()),cn(Q.get())})}},fw=class{constructor(e,t,r){this.id=null,this.throttle=!1,this.keepAlive=!1,this.cbCount=0,this.keepAlive=r.keepAlive??!1,this.cb=t,this.interval=e,(r.autoStart??!0)&&this.start()}stop(){this.id&&clearInterval(this.id)}start(){typeof window>"u"||(this.stop(),this.id=window.setInterval(()=>{(!this.throttle||this.cbCount%10===0)&&this.cb(),this.throttle&&this.cbCount++},this.interval))}isInBackground(e){this.throttle=this.keepAlive?!1:e,this.throttle&&(this.cbCount=0)}},dw=class{constructor(){this.polls=[],this.setupVisibilityListener()}add(e,t,r){const n=new fw(e,t,r);return this.polls.push(n),{stop:()=>n.stop(),start:()=>n.start()}}clear(){this.polls.forEach(e=>e.stop()),this.polls=[]}setupVisibilityListener(){typeof document>"u"||document.addEventListener("visibilitychange",()=>{this.polls.forEach(e=>e.isInBackground(document.hidden))},!1)}},hw=new dw,Af=(e,t,r)=>{if(e===t)return!0;for(const n in e)if(!r.includes(n)&&e[n]!==t[n]&&!pw(e[n],t[n]))return!1;return!0},pw=(e,t)=>{switch(typeof e){case"object":return Af(e,t,[]);case"function":return e.toString()===t.toString();default:return e===t}},yw={ms:1,s:1e3,m:1e3*60,h:1e3*60*60,d:1e3*60*60*24},Ac=e=>{if(typeof e=="number")return e;for(const[t,r]of Object.entries(yw))if(e.endsWith(t))return parseFloat(e)*r;return parseInt(e)},gw=class{constructor(){this.cached=[],this.inFlightRequests=[],this.removalTimers=[],this.currentUseId=null}add(e,t,{cacheFor:r,cacheTags:n}){if(this.findInFlight(e))return Promise.resolve();const i=this.findCached(e);if(!e.fresh&&i&&i.staleTimestamp>Date.now())return Promise.resolve();const[o,a]=this.extractStaleValues(r),l=new Promise((f,c)=>{t({...e,onCancel:()=>{this.remove(e),e.onCancel(),c()},onError:u=>{this.remove(e),e.onError(u),c()},onPrefetching(u){e.onPrefetching(u)},onPrefetched(u,h){e.onPrefetched(u,h)},onPrefetchResponse(u){f(u)},onPrefetchError(u){jt.removeFromInFlight(e),c(u)}})}).then(f=>(this.remove(e),this.cached.push({params:{...e},staleTimestamp:Date.now()+o,response:l,singleUse:a===0,timestamp:Date.now(),inFlight:!1,tags:Array.isArray(n)?n:[n]}),this.scheduleForRemoval(e,a),this.removeFromInFlight(e),f.handlePrefetch(),f));return this.inFlightRequests.push({params:{...e},response:l,staleTimestamp:null,inFlight:!0}),l}removeAll(){this.cached=[],this.removalTimers.forEach(e=>{clearTimeout(e.timer)}),this.removalTimers=[]}removeByTags(e){this.cached=this.cached.filter(t=>!t.tags.some(r=>e.includes(r)))}remove(e){this.cached=this.cached.filter(t=>!this.paramsAreEqual(t.params,e)),this.clearTimer(e)}removeFromInFlight(e){this.inFlightRequests=this.inFlightRequests.filter(t=>!this.paramsAreEqual(t.params,e))}extractStaleValues(e){const[t,r]=this.cacheForToStaleAndExpires(e);return[Ac(t),Ac(r)]}cacheForToStaleAndExpires(e){if(!Array.isArray(e))return[e,e];switch(e.length){case 0:return[0,0];case 1:return[e[0],e[0]];default:return[e[0],e[1]]}}clearTimer(e){const t=this.removalTimers.find(r=>this.paramsAreEqual(r.params,e));t&&(clearTimeout(t.timer),this.removalTimers=this.removalTimers.filter(r=>r!==t))}scheduleForRemoval(e,t){if(!(typeof window>"u")&&(this.clearTimer(e),t>0)){const r=window.setTimeout(()=>this.remove(e),t);this.removalTimers.push({params:e,timer:r})}}get(e){return this.findCached(e)||this.findInFlight(e)}use(e,t){const r=`${t.url.pathname}-${Date.now()}-${Math.random().toString(36).substring(7)}`;return this.currentUseId=r,e.response.then(n=>{if(this.currentUseId===r)return n.mergeParams({...t,onPrefetched:()=>{}}),this.removeSingleUseItems(t),n.handle()})}removeSingleUseItems(e){this.cached=this.cached.filter(t=>this.paramsAreEqual(t.params,e)?!t.singleUse:!0)}findCached(e){return this.cached.find(t=>this.paramsAreEqual(t.params,e))||null}findInFlight(e){return this.inFlightRequests.find(t=>this.paramsAreEqual(t.params,e))||null}withoutPurposePrefetchHeader(e){const t=tt(e);return t.headers.Purpose==="prefetch"&&delete t.headers.Purpose,t}paramsAreEqual(e,t){return Af(this.withoutPurposePrefetchHeader(e),this.withoutPurposePrefetchHeader(t),["showProgress","replace","prefetch","onBefore","onBeforeUpdate","onStart","onProgress","onFinish","onCancel","onSuccess","onError","onPrefetched","onCancelToken","onPrefetching","async"])}},jt=new gw,mw=class Tf{constructor(t){if(this.callbacks=[],!t.prefetch)this.params=t;else{const r={onBefore:this.wrapCallback(t,"onBefore"),onBeforeUpdate:this.wrapCallback(t,"onBeforeUpdate"),onStart:this.wrapCallback(t,"onStart"),onProgress:this.wrapCallback(t,"onProgress"),onFinish:this.wrapCallback(t,"onFinish"),onCancel:this.wrapCallback(t,"onCancel"),onSuccess:this.wrapCallback(t,"onSuccess"),onError:this.wrapCallback(t,"onError"),onCancelToken:this.wrapCallback(t,"onCancelToken"),onPrefetched:this.wrapCallback(t,"onPrefetched"),onPrefetching:this.wrapCallback(t,"onPrefetching")};this.params={...t,...r,onPrefetchResponse:t.onPrefetchResponse||(()=>{}),onPrefetchError:t.onPrefetchError||(()=>{})}}}static create(t){return new Tf(t)}data(){return this.params.method==="get"?null:this.params.data}queryParams(){return this.params.method==="get"?this.params.data:{}}isPartial(){return this.params.only.length>0||this.params.except.length>0||this.params.reset.length>0}onCancelToken(t){this.params.onCancelToken({cancel:t})}markAsFinished(){this.params.completed=!0,this.params.cancelled=!1,this.params.interrupted=!1}markAsCancelled({cancelled:t=!0,interrupted:r=!1}){this.params.onCancel(),this.params.completed=!1,this.params.cancelled=t,this.params.interrupted=r}wasCancelledAtAll(){return this.params.cancelled||this.params.interrupted}onFinish(){this.params.onFinish(this.params)}onStart(){this.params.onStart(this.params)}onPrefetching(){this.params.onPrefetching(this.params)}onPrefetchResponse(t){this.params.onPrefetchResponse&&this.params.onPrefetchResponse(t)}onPrefetchError(t){this.params.onPrefetchError&&this.params.onPrefetchError(t)}all(){return this.params}headers(){const t={...this.params.headers};this.isPartial()&&(t["X-Inertia-Partial-Component"]=Q.get().component);const r=this.params.only.concat(this.params.reset);return r.length>0&&(t["X-Inertia-Partial-Data"]=r.join(",")),this.params.except.length>0&&(t["X-Inertia-Partial-Except"]=this.params.except.join(",")),this.params.reset.length>0&&(t["X-Inertia-Reset"]=this.params.reset.join(",")),this.params.errorBag&&this.params.errorBag.length>0&&(t["X-Inertia-Error-Bag"]=this.params.errorBag),t}setPreserveOptions(t){this.params.preserveScroll=this.resolvePreserveOption(this.params.preserveScroll,t),this.params.preserveState=this.resolvePreserveOption(this.params.preserveState,t)}runCallbacks(){this.callbacks.forEach(({name:t,args:r})=>{this.params[t](...r)})}merge(t){this.params={...this.params,...t}}wrapCallback(t,r){return(...n)=>{this.recordCallback(r,n),t[r](...n)}}recordCallback(t,r){this.callbacks.push({name:t,args:r})}resolvePreserveOption(t,r){return typeof t=="function"?t(r):t==="errors"?Object.keys(r.props.errors||{}).length>0:t}},vw={modal:null,listener:null,show(e){typeof e=="object"&&(e=`All Inertia requests must receive a valid Inertia response, however a plain JSON response was received.
${JSON.stringify(e)}`);const t=document.createElement("html");t.innerHTML=e,t.querySelectorAll("a").forEach(n=>n.setAttribute("target","_top")),this.modal=document.createElement("div"),this.modal.style.position="fixed",this.modal.style.width="100vw",this.modal.style.height="100vh",this.modal.style.padding="50px",this.modal.style.boxSizing="border-box",this.modal.style.backgroundColor="rgba(0, 0, 0, .6)",this.modal.style.zIndex=2e5,this.modal.addEventListener("click",()=>this.hide());const r=document.createElement("iframe");if(r.style.backgroundColor="white",r.style.borderRadius="5px",r.style.width="100%",r.style.height="100%",this.modal.appendChild(r),document.body.prepend(this.modal),document.body.style.overflow="hidden",!r.contentWindow)throw new Error("iframe not yet ready.");r.contentWindow.document.open(),r.contentWindow.document.write(t.outerHTML),r.contentWindow.document.close(),this.listener=this.hideOnEscape.bind(this),document.addEventListener("keydown",this.listener)},hide(){this.modal.outerHTML="",this.modal=null,document.body.style.overflow="visible",document.removeEventListener("keydown",this.listener)},hideOnEscape(e){e.keyCode===27&&this.hide()}},bw=new Pf,Tc=class Of{constructor(t,r,n){this.requestParams=t,this.response=r,this.originatingPage=n,this.wasPrefetched=!1}static create(t,r,n){return new Of(t,r,n)}async handlePrefetch(){Lo(this.requestParams.all().url,window.location)&&this.handle()}async handle(){return bw.add(()=>this.process())}async process(){if(this.requestParams.all().prefetch)return this.wasPrefetched=!0,this.requestParams.all().prefetch=!1,this.requestParams.all().onPrefetched(this.response,this.requestParams.all()),Jb(this.response,this.requestParams.all()),Promise.resolve();if(this.requestParams.runCallbacks(),!this.isInertiaResponse())return this.handleNonInertiaResponse();await le.processQueue(),le.preserveUrl=this.requestParams.all().preserveUrl,await this.setPage();const t=Q.get().props.errors||{};if(Object.keys(t).length>0){const r=this.getScopedErrors(t);return Ub(r),this.requestParams.all().onError(r)}De.flushByCacheTags(this.requestParams.all().invalidateCacheTags||[]),this.wasPrefetched||De.flush(Q.get().url),zb(Q.get()),await this.requestParams.all().onSuccess(Q.get()),le.preserveUrl=!1}mergeParams(t){this.requestParams.merge(t)}async handleNonInertiaResponse(){if(this.isLocationVisit()){const r=sr(this.getHeader("x-inertia-location"));return Ec(this.requestParams.all().url,r),this.locationVisit(r)}const t={...this.response,data:this.getDataFromResponse(this.response.data)};if(Vb(t))return vw.show(t.data)}isInertiaResponse(){return this.hasHeader("x-inertia")}hasStatus(t){return this.response.status===t}getHeader(t){return this.response.headers[t]}hasHeader(t){return this.getHeader(t)!==void 0}isLocationVisit(){return this.hasStatus(409)&&this.hasHeader("x-inertia-location")}locationVisit(t){try{if(Xe.set(Xe.locationVisitKey,{preserveScroll:this.requestParams.all().preserveScroll===!0}),typeof window>"u")return;Lo(window.location,t)?window.location.reload():window.location.href=t.href}catch{return!1}}async setPage(){const t=this.getDataFromResponse(this.response.data);return this.shouldSetPage(t)?(this.mergeProps(t),await this.setRememberedState(t),this.requestParams.setPreserveOptions(t),t.url=le.preserveUrl?Q.get().url:this.pageUrl(t),this.requestParams.all().onBeforeUpdate(t),Wb(t),Q.set(t,{replace:this.requestParams.all().replace,preserveScroll:this.requestParams.all().preserveScroll,preserveState:this.requestParams.all().preserveState})):Promise.resolve()}getDataFromResponse(t){if(typeof t!="string")return t;try{return JSON.parse(t)}catch{return t}}shouldSetPage(t){if(!this.requestParams.all().async||this.originatingPage.component!==t.component)return!0;if(this.originatingPage.component!==Q.get().component)return!1;const r=sr(this.originatingPage.url),n=sr(Q.get().url);return r.origin===n.origin&&r.pathname===n.pathname}pageUrl(t){const r=sr(t.url);return Ec(this.requestParams.all().url,r),r.pathname+r.search+r.hash}mergeProps(t){if(!this.requestParams.isPartial()||t.component!==Q.get().component)return;const r=t.mergeProps||[],n=t.prependProps||[],s=t.deepMergeProps||[],i=t.matchPropsOn||[],o=(a,l)=>{const f=wr(Q.get().props,a),c=wr(t.props,a);if(Array.isArray(c)){const u=this.mergeOrMatchItems(f||[],c,a,i,l);Vt(t.props,a,u)}else if(typeof c=="object"&&c!==null){const u={...f||{},...c};Vt(t.props,a,u)}};r.forEach(a=>o(a,!0)),n.forEach(a=>o(a,!1)),s.forEach(a=>{const l=Q.get().props[a],f=t.props[a],c=(u,h,p)=>Array.isArray(h)?this.mergeOrMatchItems(u,h,p,i):typeof h=="object"&&h!==null?Object.keys(h).reduce((d,v)=>(d[v]=c(u?u[v]:void 0,h[v],`${p}.${v}`),d),{...u}):h;t.props[a]=c(l,f,a)}),t.props={...Q.get().props,...t.props},Q.get().scrollProps&&(t.scrollProps={...Q.get().scrollProps||{},...t.scrollProps||{}})}mergeOrMatchItems(t,r,n,s,i=!0){const o=Array.isArray(t)?t:[],a=s.find(c=>c.split(".").slice(0,-1).join(".")===n);if(!a)return i?[...o,...r]:[...r,...o];const l=a.split(".").pop()||"",f=new Map;return r.forEach(c=>{this.hasUniqueProperty(c,l)&&f.set(c[l],c)}),i?this.appendWithMatching(o,r,f,l):this.prependWithMatching(o,r,f,l)}appendWithMatching(t,r,n,s){const i=t.map(a=>this.hasUniqueProperty(a,s)&&n.has(a[s])?n.get(a[s]):a),o=r.filter(a=>this.hasUniqueProperty(a,s)?!t.some(l=>this.hasUniqueProperty(l,s)&&l[s]===a[s]):!0);return[...i,...o]}prependWithMatching(t,r,n,s){const i=t.filter(o=>this.hasUniqueProperty(o,s)?!n.has(o[s]):!0);return[...r,...i]}hasUniqueProperty(t,r){return t&&typeof t=="object"&&r in t}async setRememberedState(t){const r=await le.getState(le.rememberedState,{});this.requestParams.all().preserveState&&r&&t.component===Q.get().component&&(t.rememberedState=r)}getScopedErrors(t){return this.requestParams.all().errorBag?t[this.requestParams.all().errorBag||""]||{}:t}},Oc=class xf{constructor(t,r){this.page=r,this.requestHasFinished=!1,this.requestParams=mw.create(t),this.cancelToken=new AbortController}static create(t,r){return new xf(t,r)}async send(){this.requestParams.onCancelToken(()=>this.cancel({cancelled:!0})),Gb(this.requestParams.all()),this.requestParams.onStart(),this.requestParams.all().prefetch&&(this.requestParams.onPrefetching(),Qb(this.requestParams.all()));const t=this.requestParams.all().prefetch;return Te({method:this.requestParams.all().method,url:ys(this.requestParams.all().url).href,data:this.requestParams.data(),params:this.requestParams.queryParams(),signal:this.cancelToken.signal,headers:this.getHeaders(),onUploadProgress:this.onProgress.bind(this),responseType:"text"}).then(r=>(this.response=Tc.create(this.requestParams,r,this.page),this.response.handle())).catch(r=>r?.response?(this.response=Tc.create(this.requestParams,r.response,this.page),this.response.handle()):Promise.reject(r)).catch(r=>{if(!Te.isCancel(r)&&Hb(r))return t&&this.requestParams.onPrefetchError(r),Promise.reject(r)}).finally(()=>{this.finish(),t&&this.response&&this.requestParams.onPrefetchResponse(this.response)})}finish(){this.requestParams.wasCancelledAtAll()||(this.requestParams.markAsFinished(),this.fireFinishEvents())}fireFinishEvents(){this.requestHasFinished||(this.requestHasFinished=!0,kb(this.requestParams.all()),this.requestParams.onFinish())}cancel({cancelled:t=!1,interrupted:r=!1}){this.requestHasFinished||(this.cancelToken.abort(),this.requestParams.markAsCancelled({cancelled:t,interrupted:r}),this.fireFinishEvents())}onProgress(t){this.requestParams.data()instanceof FormData&&(t.percentage=t.progress?Math.round(t.progress*100):0,Kb(t),this.requestParams.all().onProgress(t))}getHeaders(){const t={...this.requestParams.headers(),Accept:"text/html, application/xhtml+xml","X-Requested-With":"XMLHttpRequest","X-Inertia":!0};return Q.get().version&&(t["X-Inertia-Version"]=Q.get().version),t}},xc=class{constructor({maxConcurrent:e,interruptible:t}){this.requests=[],this.maxConcurrent=e,this.interruptible=t}send(e){this.requests.push(e),e.send().then(()=>{this.requests=this.requests.filter(t=>t!==e)})}interruptInFlight(){this.cancel({interrupted:!0},!1)}cancelInFlight(){this.cancel({cancelled:!0},!0)}cancel({cancelled:e=!1,interrupted:t=!1}={},r){if(!this.shouldCancel(r))return;this.requests.shift()?.cancel({interrupted:t,cancelled:e})}shouldCancel(e){return e?!0:this.interruptible&&this.requests.length>=this.maxConcurrent}},ww=class{constructor(){this.syncRequestStream=new xc({maxConcurrent:1,interruptible:!0}),this.asyncRequestStream=new xc({maxConcurrent:1/0,interruptible:!1})}init({initialPage:e,resolveComponent:t,swapComponent:r}){Q.init({initialPage:e,resolveComponent:t,swapComponent:r}),uw.handle(),br.init(),br.on("missingHistoryItem",()=>{typeof window<"u"&&this.visit(window.location.href,{preserveState:!0,preserveScroll:!0,replace:!0})}),br.on("loadDeferredProps",n=>{this.loadDeferredProps(n)})}get(e,t={},r={}){return this.visit(e,{...r,method:"get",data:t})}post(e,t={},r={}){return this.visit(e,{preserveState:!0,...r,method:"post",data:t})}put(e,t={},r={}){return this.visit(e,{preserveState:!0,...r,method:"put",data:t})}patch(e,t={},r={}){return this.visit(e,{preserveState:!0,...r,method:"patch",data:t})}delete(e,t={}){return this.visit(e,{preserveState:!0,...t,method:"delete"})}reload(e={}){if(!(typeof window>"u"))return this.visit(window.location.href,{...e,preserveScroll:!0,preserveState:!0,async:!0,headers:{...e.headers||{},"Cache-Control":"no-cache"}})}remember(e,t="default"){le.remember(e,t)}restore(e="default"){return le.restore(e)}on(e,t){return typeof window>"u"?()=>{}:br.onGlobalEvent(e,t)}cancel(){this.syncRequestStream.cancelInFlight()}cancelAll(){this.asyncRequestStream.cancelInFlight(),this.syncRequestStream.cancelInFlight()}poll(e,t={},r={}){return hw.add(e,()=>this.reload(t),{autoStart:r.autoStart??!0,keepAlive:r.keepAlive??!1})}visit(e,t={}){const r=this.getPendingVisit(e,{...t,showProgress:t.showProgress??!t.async}),n=this.getVisitEvents(t);if(n.onBefore(r)===!1||!_c(r))return;const s=r.async?this.asyncRequestStream:this.syncRequestStream;s.interruptInFlight(),!Q.isCleared()&&!r.preserveUrl&&_t.save();const i={...r,...n},o=jt.get(i);o?(nt.reveal(o.inFlight),jt.use(o,i)):(nt.reveal(!0),s.send(Oc.create(i,Q.get())))}getCached(e,t={}){return jt.findCached(this.getPrefetchParams(e,t))}flush(e,t={}){jt.remove(this.getPrefetchParams(e,t))}flushAll(){jt.removeAll()}flushByCacheTags(e){jt.removeByTags(Array.isArray(e)?e:[e])}getPrefetching(e,t={}){return jt.findInFlight(this.getPrefetchParams(e,t))}prefetch(e,t={},r={}){if((t.method??(_r(e)?e.method:"get"))!=="get")throw new Error("Prefetch requests must use the GET method");const s=this.getPendingVisit(e,{...t,async:!0,showProgress:!1,prefetch:!0}),i=s.url.origin+s.url.pathname+s.url.search,o=window.location.origin+window.location.pathname+window.location.search;if(i===o)return;const a=this.getVisitEvents(t);if(a.onBefore(s)===!1||!_c(s))return;nt.hide(),this.asyncRequestStream.interruptInFlight();const l={...s,...a};new Promise(c=>{const u=()=>{Q.get()?c():setTimeout(u,50)};u()}).then(()=>{jt.add(l,c=>{this.asyncRequestStream.send(Oc.create(c,Q.get()))},{cacheFor:3e4,cacheTags:[],...r})})}clearHistory(){le.clear()}decryptHistory(){return le.decrypt()}resolveComponent(e){return Q.resolve(e)}replace(e){this.clientVisit(e,{replace:!0})}replaceProp(e,t,r){this.replace({preserveScroll:!0,preserveState:!0,props(n){const s=typeof t=="function"?t(wr(n,e),n):t;return Vt(tt(n),e,s)},...r||{}})}appendToProp(e,t,r){this.replaceProp(e,(n,s)=>{const i=typeof t=="function"?t(n,s):t;return Array.isArray(n)||(n=n!==void 0?[n]:[]),[...n,i]},r)}prependToProp(e,t,r){this.replaceProp(e,(n,s)=>{const i=typeof t=="function"?t(n,s):t;return Array.isArray(n)||(n=n!==void 0?[n]:[]),[i,...n]},r)}push(e){this.clientVisit(e)}clientVisit(e,{replace:t=!1}={}){const r=Q.get(),n=typeof e.props=="function"?e.props(r.props):e.props??r.props,{onError:s,onFinish:i,onSuccess:o,...a}=e;Q.set({...r,...a,props:n},{replace:t,preserveScroll:e.preserveScroll,preserveState:e.preserveState}).then(()=>{const l=Q.get().props.errors||{};if(Object.keys(l).length===0)return o?.(Q.get());const f=e.errorBag?l[e.errorBag||""]||{}:l;return s?.(f)}).finally(()=>i?.(e))}getPrefetchParams(e,t){return{...this.getPendingVisit(e,{...t,async:!0,showProgress:!1,prefetch:!0}),...this.getVisitEvents(t)}}getPendingVisit(e,t,r={}){if(_r(e)){const a=e;e=a.url,t.method=t.method??a.method}const n={method:"get",data:{},replace:!1,preserveScroll:!1,preserveState:!1,only:[],except:[],headers:{},errorBag:"",forceFormData:!1,queryStringArrayFormat:"brackets",async:!1,showProgress:!0,fresh:!1,reset:[],preserveUrl:!1,prefetch:!1,invalidateCacheTags:[],...t},[s,i]=sw(e,n.data,n.method,n.forceFormData,n.queryStringArrayFormat),o={cancelled:!1,completed:!1,interrupted:!1,...n,...r,url:s,data:i};return o.prefetch&&(o.headers.Purpose="prefetch"),o}getVisitEvents(e){return{onCancelToken:e.onCancelToken||(()=>{}),onBefore:e.onBefore||(()=>{}),onBeforeUpdate:e.onBeforeUpdate||(()=>{}),onStart:e.onStart||(()=>{}),onProgress:e.onProgress||(()=>{}),onFinish:e.onFinish||(()=>{}),onCancel:e.onCancel||(()=>{}),onSuccess:e.onSuccess||(()=>{}),onError:e.onError||(()=>{}),onPrefetched:e.onPrefetched||(()=>{}),onPrefetching:e.onPrefetching||(()=>{})}}loadDeferredProps(e){e&&Object.entries(e).forEach(([t,r])=>{this.reload({only:r})})}};function Sw(e){if(!e.includes("."))return e;const t=r=>r.startsWith("[")&&r.endsWith("]")?r:r.split(".").reduce((n,s,i)=>i===0?s:`${n}[${s}]`);return e.replace(/\\\./g,"__ESCAPED_DOT__").split(/(\[[^\]]*\])/).filter(Boolean).map(t).join("").replace(/__ESCAPED_DOT__/g,".")}function _w(e){const t=[],r=/([^\[\]]+)|\[(\d*)\]/g;let n;for(;(n=r.exec(e))!==null;)n[1]!==void 0?t.push(n[1]):n[2]!==void 0&&t.push(n[2]===""?"":Number(n[2]));return t}function Cc(e){const t={};for(const[r,n]of e.entries()){if(n instanceof File&&n.size===0&&n.name==="")continue;const s=_w(Sw(r));if(s[s.length-1]===""){const i=s.slice(0,-1),o=wr(t,i);Array.isArray(o)?o.push(n):Vt(t,i,[n]);continue}Vt(t,s,n)}return t}var Ew={buildDOMElement(e){const t=document.createElement("template");t.innerHTML=e;const r=t.content.firstChild;if(!e.startsWith(" + + diff --git a/resources/js/components/AppContent.vue b/resources/js/components/AppContent.vue new file mode 100644 index 0000000..9b6f13f --- /dev/null +++ b/resources/js/components/AppContent.vue @@ -0,0 +1,25 @@ + + + diff --git a/resources/js/components/AppHeader.vue b/resources/js/components/AppHeader.vue new file mode 100644 index 0000000..40e454f --- /dev/null +++ b/resources/js/components/AppHeader.vue @@ -0,0 +1,282 @@ + + + diff --git a/resources/js/components/AppLogo.vue b/resources/js/components/AppLogo.vue new file mode 100644 index 0000000..3292f3e --- /dev/null +++ b/resources/js/components/AppLogo.vue @@ -0,0 +1,16 @@ + + + diff --git a/resources/js/components/AppLogoIcon.vue b/resources/js/components/AppLogoIcon.vue new file mode 100644 index 0000000..4300b81 --- /dev/null +++ b/resources/js/components/AppLogoIcon.vue @@ -0,0 +1,29 @@ + + + diff --git a/resources/js/components/AppShell.vue b/resources/js/components/AppShell.vue new file mode 100644 index 0000000..261cd77 --- /dev/null +++ b/resources/js/components/AppShell.vue @@ -0,0 +1,21 @@ + + + diff --git a/resources/js/components/AppSidebar.vue b/resources/js/components/AppSidebar.vue new file mode 100644 index 0000000..3da7636 --- /dev/null +++ b/resources/js/components/AppSidebar.vue @@ -0,0 +1,71 @@ + + + diff --git a/resources/js/components/AppSidebarHeader.vue b/resources/js/components/AppSidebarHeader.vue new file mode 100644 index 0000000..3fd430c --- /dev/null +++ b/resources/js/components/AppSidebarHeader.vue @@ -0,0 +1,27 @@ + + + diff --git a/resources/js/components/AppearanceTabs.vue b/resources/js/components/AppearanceTabs.vue new file mode 100644 index 0000000..5ac7f8c --- /dev/null +++ b/resources/js/components/AppearanceTabs.vue @@ -0,0 +1,33 @@ + + + diff --git a/resources/js/components/Breadcrumbs.vue b/resources/js/components/Breadcrumbs.vue new file mode 100644 index 0000000..879046f --- /dev/null +++ b/resources/js/components/Breadcrumbs.vue @@ -0,0 +1,42 @@ + + + diff --git a/resources/js/components/DeleteUser.vue b/resources/js/components/DeleteUser.vue new file mode 100644 index 0000000..9482e2c --- /dev/null +++ b/resources/js/components/DeleteUser.vue @@ -0,0 +1,115 @@ + + + diff --git a/resources/js/components/Heading.vue b/resources/js/components/Heading.vue new file mode 100644 index 0000000..f50187a --- /dev/null +++ b/resources/js/components/Heading.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/HeadingSmall.vue b/resources/js/components/HeadingSmall.vue new file mode 100644 index 0000000..d1602ba --- /dev/null +++ b/resources/js/components/HeadingSmall.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/Icon.vue b/resources/js/components/Icon.vue new file mode 100644 index 0000000..31047fd --- /dev/null +++ b/resources/js/components/Icon.vue @@ -0,0 +1,36 @@ + + + diff --git a/resources/js/components/InputError.vue b/resources/js/components/InputError.vue new file mode 100644 index 0000000..3db9519 --- /dev/null +++ b/resources/js/components/InputError.vue @@ -0,0 +1,13 @@ + + + diff --git a/resources/js/components/NavFooter.vue b/resources/js/components/NavFooter.vue new file mode 100644 index 0000000..6ae1d5f --- /dev/null +++ b/resources/js/components/NavFooter.vue @@ -0,0 +1,44 @@ + + + diff --git a/resources/js/components/NavMain.vue b/resources/js/components/NavMain.vue new file mode 100644 index 0000000..ab7cab2 --- /dev/null +++ b/resources/js/components/NavMain.vue @@ -0,0 +1,38 @@ + + + diff --git a/resources/js/components/NavUser.vue b/resources/js/components/NavUser.vue new file mode 100644 index 0000000..b5bfcdf --- /dev/null +++ b/resources/js/components/NavUser.vue @@ -0,0 +1,54 @@ + + + diff --git a/resources/js/components/PlaceholderPattern.vue b/resources/js/components/PlaceholderPattern.vue new file mode 100644 index 0000000..95556e3 --- /dev/null +++ b/resources/js/components/PlaceholderPattern.vue @@ -0,0 +1,33 @@ + + + diff --git a/resources/js/components/TextLink.vue b/resources/js/components/TextLink.vue new file mode 100644 index 0000000..36bab4f --- /dev/null +++ b/resources/js/components/TextLink.vue @@ -0,0 +1,25 @@ + + + diff --git a/resources/js/components/TwoFactorRecoveryCodes.vue b/resources/js/components/TwoFactorRecoveryCodes.vue new file mode 100644 index 0000000..efb38c4 --- /dev/null +++ b/resources/js/components/TwoFactorRecoveryCodes.vue @@ -0,0 +1,123 @@ + + + diff --git a/resources/js/components/TwoFactorSetupModal.vue b/resources/js/components/TwoFactorSetupModal.vue new file mode 100644 index 0000000..3e4bc35 --- /dev/null +++ b/resources/js/components/TwoFactorSetupModal.vue @@ -0,0 +1,300 @@ + + + diff --git a/resources/js/components/UserInfo.vue b/resources/js/components/UserInfo.vue new file mode 100644 index 0000000..ab56274 --- /dev/null +++ b/resources/js/components/UserInfo.vue @@ -0,0 +1,38 @@ + + + diff --git a/resources/js/components/UserMenuContent.vue b/resources/js/components/UserMenuContent.vue new file mode 100644 index 0000000..b0c15d0 --- /dev/null +++ b/resources/js/components/UserMenuContent.vue @@ -0,0 +1,54 @@ + + + diff --git a/resources/js/components/ui/alert/Alert.vue b/resources/js/components/ui/alert/Alert.vue new file mode 100644 index 0000000..a9d336f --- /dev/null +++ b/resources/js/components/ui/alert/Alert.vue @@ -0,0 +1,21 @@ + + + diff --git a/resources/js/components/ui/alert/AlertDescription.vue b/resources/js/components/ui/alert/AlertDescription.vue new file mode 100644 index 0000000..9f7d24d --- /dev/null +++ b/resources/js/components/ui/alert/AlertDescription.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/alert/AlertTitle.vue b/resources/js/components/ui/alert/AlertTitle.vue new file mode 100644 index 0000000..b218384 --- /dev/null +++ b/resources/js/components/ui/alert/AlertTitle.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/alert/index.ts b/resources/js/components/ui/alert/index.ts new file mode 100644 index 0000000..42d07b6 --- /dev/null +++ b/resources/js/components/ui/alert/index.ts @@ -0,0 +1,24 @@ +import type { VariantProps } from "class-variance-authority" +import { cva } from "class-variance-authority" + +export { default as Alert } from "./Alert.vue" +export { default as AlertDescription } from "./AlertDescription.vue" +export { default as AlertTitle } from "./AlertTitle.vue" + +export const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", + { + variants: { + variant: { + default: "bg-card text-card-foreground", + destructive: + "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +) + +export type AlertVariants = VariantProps diff --git a/resources/js/components/ui/avatar/Avatar.vue b/resources/js/components/ui/avatar/Avatar.vue new file mode 100644 index 0000000..1aa6462 --- /dev/null +++ b/resources/js/components/ui/avatar/Avatar.vue @@ -0,0 +1,18 @@ + + + diff --git a/resources/js/components/ui/avatar/AvatarFallback.vue b/resources/js/components/ui/avatar/AvatarFallback.vue new file mode 100644 index 0000000..b0f3398 --- /dev/null +++ b/resources/js/components/ui/avatar/AvatarFallback.vue @@ -0,0 +1,23 @@ + + + diff --git a/resources/js/components/ui/avatar/AvatarImage.vue b/resources/js/components/ui/avatar/AvatarImage.vue new file mode 100644 index 0000000..801392b --- /dev/null +++ b/resources/js/components/ui/avatar/AvatarImage.vue @@ -0,0 +1,16 @@ + + + diff --git a/resources/js/components/ui/avatar/index.ts b/resources/js/components/ui/avatar/index.ts new file mode 100644 index 0000000..6a90410 --- /dev/null +++ b/resources/js/components/ui/avatar/index.ts @@ -0,0 +1,3 @@ +export { default as Avatar } from './Avatar.vue' +export { default as AvatarFallback } from './AvatarFallback.vue' +export { default as AvatarImage } from './AvatarImage.vue' diff --git a/resources/js/components/ui/badge/Badge.vue b/resources/js/components/ui/badge/Badge.vue new file mode 100644 index 0000000..d894dfe --- /dev/null +++ b/resources/js/components/ui/badge/Badge.vue @@ -0,0 +1,26 @@ + + + diff --git a/resources/js/components/ui/badge/index.ts b/resources/js/components/ui/badge/index.ts new file mode 100644 index 0000000..ac4c001 --- /dev/null +++ b/resources/js/components/ui/badge/index.ts @@ -0,0 +1,26 @@ +import type { VariantProps } from "class-variance-authority" +import { cva } from "class-variance-authority" + +export { default as Badge } from "./Badge.vue" + +export const badgeVariants = cva( + "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: + "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +) +export type BadgeVariants = VariantProps diff --git a/resources/js/components/ui/breadcrumb/Breadcrumb.vue b/resources/js/components/ui/breadcrumb/Breadcrumb.vue new file mode 100644 index 0000000..b99dcea --- /dev/null +++ b/resources/js/components/ui/breadcrumb/Breadcrumb.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/breadcrumb/BreadcrumbEllipsis.vue b/resources/js/components/ui/breadcrumb/BreadcrumbEllipsis.vue new file mode 100644 index 0000000..fc1353f --- /dev/null +++ b/resources/js/components/ui/breadcrumb/BreadcrumbEllipsis.vue @@ -0,0 +1,23 @@ + + + diff --git a/resources/js/components/ui/breadcrumb/BreadcrumbItem.vue b/resources/js/components/ui/breadcrumb/BreadcrumbItem.vue new file mode 100644 index 0000000..f50f69d --- /dev/null +++ b/resources/js/components/ui/breadcrumb/BreadcrumbItem.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/breadcrumb/BreadcrumbLink.vue b/resources/js/components/ui/breadcrumb/BreadcrumbLink.vue new file mode 100644 index 0000000..7edc1be --- /dev/null +++ b/resources/js/components/ui/breadcrumb/BreadcrumbLink.vue @@ -0,0 +1,20 @@ + + + diff --git a/resources/js/components/ui/breadcrumb/BreadcrumbList.vue b/resources/js/components/ui/breadcrumb/BreadcrumbList.vue new file mode 100644 index 0000000..3a92c48 --- /dev/null +++ b/resources/js/components/ui/breadcrumb/BreadcrumbList.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/breadcrumb/BreadcrumbPage.vue b/resources/js/components/ui/breadcrumb/BreadcrumbPage.vue new file mode 100644 index 0000000..cc667bc --- /dev/null +++ b/resources/js/components/ui/breadcrumb/BreadcrumbPage.vue @@ -0,0 +1,20 @@ + + + diff --git a/resources/js/components/ui/breadcrumb/BreadcrumbSeparator.vue b/resources/js/components/ui/breadcrumb/BreadcrumbSeparator.vue new file mode 100644 index 0000000..132dacf --- /dev/null +++ b/resources/js/components/ui/breadcrumb/BreadcrumbSeparator.vue @@ -0,0 +1,22 @@ + + + diff --git a/resources/js/components/ui/breadcrumb/index.ts b/resources/js/components/ui/breadcrumb/index.ts new file mode 100644 index 0000000..0590983 --- /dev/null +++ b/resources/js/components/ui/breadcrumb/index.ts @@ -0,0 +1,7 @@ +export { default as Breadcrumb } from './Breadcrumb.vue' +export { default as BreadcrumbEllipsis } from './BreadcrumbEllipsis.vue' +export { default as BreadcrumbItem } from './BreadcrumbItem.vue' +export { default as BreadcrumbLink } from './BreadcrumbLink.vue' +export { default as BreadcrumbList } from './BreadcrumbList.vue' +export { default as BreadcrumbPage } from './BreadcrumbPage.vue' +export { default as BreadcrumbSeparator } from './BreadcrumbSeparator.vue' diff --git a/resources/js/components/ui/button/Button.vue b/resources/js/components/ui/button/Button.vue new file mode 100644 index 0000000..c6691f6 --- /dev/null +++ b/resources/js/components/ui/button/Button.vue @@ -0,0 +1,27 @@ + + + diff --git a/resources/js/components/ui/button/index.ts b/resources/js/components/ui/button/index.ts new file mode 100644 index 0000000..616d1d3 --- /dev/null +++ b/resources/js/components/ui/button/index.ts @@ -0,0 +1,36 @@ +import { cva, type VariantProps } from 'class-variance-authority' + +export { default as Button } from './Button.vue' + +export const buttonVariants = cva( + 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*=\'size-\'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive', + { + variants: { + variant: { + default: + 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90', + destructive: + 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + outline: + 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50', + secondary: + 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80', + ghost: + 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-9 px-4 py-2 has-[>svg]:px-3', + sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5', + lg: 'h-10 rounded-md px-6 has-[>svg]:px-4', + icon: 'size-9', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +export type ButtonVariants = VariantProps diff --git a/resources/js/components/ui/card/Card.vue b/resources/js/components/ui/card/Card.vue new file mode 100644 index 0000000..9154a6a --- /dev/null +++ b/resources/js/components/ui/card/Card.vue @@ -0,0 +1,22 @@ + + + diff --git a/resources/js/components/ui/card/CardAction.vue b/resources/js/components/ui/card/CardAction.vue new file mode 100644 index 0000000..c2beb20 --- /dev/null +++ b/resources/js/components/ui/card/CardAction.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/card/CardContent.vue b/resources/js/components/ui/card/CardContent.vue new file mode 100644 index 0000000..6bff4bc --- /dev/null +++ b/resources/js/components/ui/card/CardContent.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/card/CardDescription.vue b/resources/js/components/ui/card/CardDescription.vue new file mode 100644 index 0000000..2a0a755 --- /dev/null +++ b/resources/js/components/ui/card/CardDescription.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/card/CardFooter.vue b/resources/js/components/ui/card/CardFooter.vue new file mode 100644 index 0000000..1f3648d --- /dev/null +++ b/resources/js/components/ui/card/CardFooter.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/card/CardHeader.vue b/resources/js/components/ui/card/CardHeader.vue new file mode 100644 index 0000000..f693a6c --- /dev/null +++ b/resources/js/components/ui/card/CardHeader.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/card/CardTitle.vue b/resources/js/components/ui/card/CardTitle.vue new file mode 100644 index 0000000..caa7e06 --- /dev/null +++ b/resources/js/components/ui/card/CardTitle.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/card/index.ts b/resources/js/components/ui/card/index.ts new file mode 100644 index 0000000..73d985f --- /dev/null +++ b/resources/js/components/ui/card/index.ts @@ -0,0 +1,7 @@ +export { default as Card } from './Card.vue' +export { default as CardAction } from './CardAction.vue' +export { default as CardContent } from './CardContent.vue' +export { default as CardDescription } from './CardDescription.vue' +export { default as CardFooter } from './CardFooter.vue' +export { default as CardHeader } from './CardHeader.vue' +export { default as CardTitle } from './CardTitle.vue' diff --git a/resources/js/components/ui/checkbox/Checkbox.vue b/resources/js/components/ui/checkbox/Checkbox.vue new file mode 100644 index 0000000..d43b7a4 --- /dev/null +++ b/resources/js/components/ui/checkbox/Checkbox.vue @@ -0,0 +1,37 @@ + + + diff --git a/resources/js/components/ui/checkbox/index.ts b/resources/js/components/ui/checkbox/index.ts new file mode 100644 index 0000000..8c28c28 --- /dev/null +++ b/resources/js/components/ui/checkbox/index.ts @@ -0,0 +1 @@ +export { default as Checkbox } from './Checkbox.vue' diff --git a/resources/js/components/ui/collapsible/Collapsible.vue b/resources/js/components/ui/collapsible/Collapsible.vue new file mode 100644 index 0000000..dcd58e2 --- /dev/null +++ b/resources/js/components/ui/collapsible/Collapsible.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/components/ui/collapsible/CollapsibleContent.vue b/resources/js/components/ui/collapsible/CollapsibleContent.vue new file mode 100644 index 0000000..4120d2f --- /dev/null +++ b/resources/js/components/ui/collapsible/CollapsibleContent.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/components/ui/collapsible/CollapsibleTrigger.vue b/resources/js/components/ui/collapsible/CollapsibleTrigger.vue new file mode 100644 index 0000000..be603a4 --- /dev/null +++ b/resources/js/components/ui/collapsible/CollapsibleTrigger.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/components/ui/collapsible/index.ts b/resources/js/components/ui/collapsible/index.ts new file mode 100644 index 0000000..abab956 --- /dev/null +++ b/resources/js/components/ui/collapsible/index.ts @@ -0,0 +1,3 @@ +export { default as Collapsible } from './Collapsible.vue' +export { default as CollapsibleContent } from './CollapsibleContent.vue' +export { default as CollapsibleTrigger } from './CollapsibleTrigger.vue' diff --git a/resources/js/components/ui/dialog/Dialog.vue b/resources/js/components/ui/dialog/Dialog.vue new file mode 100644 index 0000000..bb8bf72 --- /dev/null +++ b/resources/js/components/ui/dialog/Dialog.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/dialog/DialogClose.vue b/resources/js/components/ui/dialog/DialogClose.vue new file mode 100644 index 0000000..7574168 --- /dev/null +++ b/resources/js/components/ui/dialog/DialogClose.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/components/ui/dialog/DialogContent.vue b/resources/js/components/ui/dialog/DialogContent.vue new file mode 100644 index 0000000..1226459 --- /dev/null +++ b/resources/js/components/ui/dialog/DialogContent.vue @@ -0,0 +1,49 @@ + + + diff --git a/resources/js/components/ui/dialog/DialogDescription.vue b/resources/js/components/ui/dialog/DialogDescription.vue new file mode 100644 index 0000000..dc5be12 --- /dev/null +++ b/resources/js/components/ui/dialog/DialogDescription.vue @@ -0,0 +1,25 @@ + + + diff --git a/resources/js/components/ui/dialog/DialogFooter.vue b/resources/js/components/ui/dialog/DialogFooter.vue new file mode 100644 index 0000000..c3b4b55 --- /dev/null +++ b/resources/js/components/ui/dialog/DialogFooter.vue @@ -0,0 +1,15 @@ + + + diff --git a/resources/js/components/ui/dialog/DialogHeader.vue b/resources/js/components/ui/dialog/DialogHeader.vue new file mode 100644 index 0000000..0fc2f5f --- /dev/null +++ b/resources/js/components/ui/dialog/DialogHeader.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/dialog/DialogOverlay.vue b/resources/js/components/ui/dialog/DialogOverlay.vue new file mode 100644 index 0000000..da8d0b4 --- /dev/null +++ b/resources/js/components/ui/dialog/DialogOverlay.vue @@ -0,0 +1,23 @@ + + + diff --git a/resources/js/components/ui/dialog/DialogScrollContent.vue b/resources/js/components/ui/dialog/DialogScrollContent.vue new file mode 100644 index 0000000..017cbd2 --- /dev/null +++ b/resources/js/components/ui/dialog/DialogScrollContent.vue @@ -0,0 +1,59 @@ + + + diff --git a/resources/js/components/ui/dialog/DialogTitle.vue b/resources/js/components/ui/dialog/DialogTitle.vue new file mode 100644 index 0000000..bf5b47a --- /dev/null +++ b/resources/js/components/ui/dialog/DialogTitle.vue @@ -0,0 +1,25 @@ + + + diff --git a/resources/js/components/ui/dialog/DialogTrigger.vue b/resources/js/components/ui/dialog/DialogTrigger.vue new file mode 100644 index 0000000..a870f66 --- /dev/null +++ b/resources/js/components/ui/dialog/DialogTrigger.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/components/ui/dialog/index.ts b/resources/js/components/ui/dialog/index.ts new file mode 100644 index 0000000..baa7d61 --- /dev/null +++ b/resources/js/components/ui/dialog/index.ts @@ -0,0 +1,10 @@ +export { default as Dialog } from './Dialog.vue' +export { default as DialogClose } from './DialogClose.vue' +export { default as DialogContent } from './DialogContent.vue' +export { default as DialogDescription } from './DialogDescription.vue' +export { default as DialogFooter } from './DialogFooter.vue' +export { default as DialogHeader } from './DialogHeader.vue' +export { default as DialogOverlay } from './DialogOverlay.vue' +export { default as DialogScrollContent } from './DialogScrollContent.vue' +export { default as DialogTitle } from './DialogTitle.vue' +export { default as DialogTrigger } from './DialogTrigger.vue' diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenu.vue b/resources/js/components/ui/dropdown-menu/DropdownMenu.vue new file mode 100644 index 0000000..e386052 --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenu.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue new file mode 100644 index 0000000..09b6da3 --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue @@ -0,0 +1,41 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuContent.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuContent.vue new file mode 100644 index 0000000..a4d4c15 --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuContent.vue @@ -0,0 +1,39 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuGroup.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuGroup.vue new file mode 100644 index 0000000..c7eb308 --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuGroup.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuItem.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuItem.vue new file mode 100644 index 0000000..76299c6 --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuItem.vue @@ -0,0 +1,30 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuLabel.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuLabel.vue new file mode 100644 index 0000000..50987ab --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuLabel.vue @@ -0,0 +1,22 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue new file mode 100644 index 0000000..d205d0b --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue @@ -0,0 +1,22 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuRadioItem.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuRadioItem.vue new file mode 100644 index 0000000..d2a0e86 --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuRadioItem.vue @@ -0,0 +1,42 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuSeparator.vue new file mode 100644 index 0000000..a65c50c --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuSeparator.vue @@ -0,0 +1,26 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuShortcut.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuShortcut.vue new file mode 100644 index 0000000..1bcbb88 --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuShortcut.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuSub.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuSub.vue new file mode 100644 index 0000000..7329bca --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuSub.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuSubContent.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuSubContent.vue new file mode 100644 index 0000000..d199c91 --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuSubContent.vue @@ -0,0 +1,31 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue new file mode 100644 index 0000000..df93e3d --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue @@ -0,0 +1,30 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/DropdownMenuTrigger.vue b/resources/js/components/ui/dropdown-menu/DropdownMenuTrigger.vue new file mode 100644 index 0000000..7bc7339 --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/DropdownMenuTrigger.vue @@ -0,0 +1,16 @@ + + + diff --git a/resources/js/components/ui/dropdown-menu/index.ts b/resources/js/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..f488d39 --- /dev/null +++ b/resources/js/components/ui/dropdown-menu/index.ts @@ -0,0 +1,16 @@ +export { default as DropdownMenu } from './DropdownMenu.vue' + +export { default as DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem.vue' +export { default as DropdownMenuContent } from './DropdownMenuContent.vue' +export { default as DropdownMenuGroup } from './DropdownMenuGroup.vue' +export { default as DropdownMenuItem } from './DropdownMenuItem.vue' +export { default as DropdownMenuLabel } from './DropdownMenuLabel.vue' +export { default as DropdownMenuRadioGroup } from './DropdownMenuRadioGroup.vue' +export { default as DropdownMenuRadioItem } from './DropdownMenuRadioItem.vue' +export { default as DropdownMenuSeparator } from './DropdownMenuSeparator.vue' +export { default as DropdownMenuShortcut } from './DropdownMenuShortcut.vue' +export { default as DropdownMenuSub } from './DropdownMenuSub.vue' +export { default as DropdownMenuSubContent } from './DropdownMenuSubContent.vue' +export { default as DropdownMenuSubTrigger } from './DropdownMenuSubTrigger.vue' +export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.vue' +export { DropdownMenuPortal } from 'reka-ui' diff --git a/resources/js/components/ui/input/Input.vue b/resources/js/components/ui/input/Input.vue new file mode 100644 index 0000000..899535e --- /dev/null +++ b/resources/js/components/ui/input/Input.vue @@ -0,0 +1,33 @@ + + + diff --git a/resources/js/components/ui/input/index.ts b/resources/js/components/ui/input/index.ts new file mode 100644 index 0000000..a691dd6 --- /dev/null +++ b/resources/js/components/ui/input/index.ts @@ -0,0 +1 @@ +export { default as Input } from './Input.vue' diff --git a/resources/js/components/ui/label/Label.vue b/resources/js/components/ui/label/Label.vue new file mode 100644 index 0000000..33e5c6c --- /dev/null +++ b/resources/js/components/ui/label/Label.vue @@ -0,0 +1,28 @@ + + + diff --git a/resources/js/components/ui/label/index.ts b/resources/js/components/ui/label/index.ts new file mode 100644 index 0000000..572c2f0 --- /dev/null +++ b/resources/js/components/ui/label/index.ts @@ -0,0 +1 @@ +export { default as Label } from './Label.vue' diff --git a/resources/js/components/ui/navigation-menu/NavigationMenu.vue b/resources/js/components/ui/navigation-menu/NavigationMenu.vue new file mode 100644 index 0000000..af2c623 --- /dev/null +++ b/resources/js/components/ui/navigation-menu/NavigationMenu.vue @@ -0,0 +1,35 @@ + + + diff --git a/resources/js/components/ui/navigation-menu/NavigationMenuContent.vue b/resources/js/components/ui/navigation-menu/NavigationMenuContent.vue new file mode 100644 index 0000000..447a523 --- /dev/null +++ b/resources/js/components/ui/navigation-menu/NavigationMenuContent.vue @@ -0,0 +1,35 @@ + + + diff --git a/resources/js/components/ui/navigation-menu/NavigationMenuIndicator.vue b/resources/js/components/ui/navigation-menu/NavigationMenuIndicator.vue new file mode 100644 index 0000000..9827540 --- /dev/null +++ b/resources/js/components/ui/navigation-menu/NavigationMenuIndicator.vue @@ -0,0 +1,25 @@ + + + diff --git a/resources/js/components/ui/navigation-menu/NavigationMenuItem.vue b/resources/js/components/ui/navigation-menu/NavigationMenuItem.vue new file mode 100644 index 0000000..38d0e1c --- /dev/null +++ b/resources/js/components/ui/navigation-menu/NavigationMenuItem.vue @@ -0,0 +1,20 @@ + + + diff --git a/resources/js/components/ui/navigation-menu/NavigationMenuLink.vue b/resources/js/components/ui/navigation-menu/NavigationMenuLink.vue new file mode 100644 index 0000000..df449cc --- /dev/null +++ b/resources/js/components/ui/navigation-menu/NavigationMenuLink.vue @@ -0,0 +1,27 @@ + + + diff --git a/resources/js/components/ui/navigation-menu/NavigationMenuList.vue b/resources/js/components/ui/navigation-menu/NavigationMenuList.vue new file mode 100644 index 0000000..a88c052 --- /dev/null +++ b/resources/js/components/ui/navigation-menu/NavigationMenuList.vue @@ -0,0 +1,30 @@ + + + diff --git a/resources/js/components/ui/navigation-menu/NavigationMenuTrigger.vue b/resources/js/components/ui/navigation-menu/NavigationMenuTrigger.vue new file mode 100644 index 0000000..c48f660 --- /dev/null +++ b/resources/js/components/ui/navigation-menu/NavigationMenuTrigger.vue @@ -0,0 +1,35 @@ + + + diff --git a/resources/js/components/ui/navigation-menu/NavigationMenuViewport.vue b/resources/js/components/ui/navigation-menu/NavigationMenuViewport.vue new file mode 100644 index 0000000..d60c128 --- /dev/null +++ b/resources/js/components/ui/navigation-menu/NavigationMenuViewport.vue @@ -0,0 +1,34 @@ + + + diff --git a/resources/js/components/ui/navigation-menu/index.ts b/resources/js/components/ui/navigation-menu/index.ts new file mode 100644 index 0000000..90e0e2d --- /dev/null +++ b/resources/js/components/ui/navigation-menu/index.ts @@ -0,0 +1,14 @@ +import { cva } from 'class-variance-authority' + +export { default as NavigationMenu } from './NavigationMenu.vue' +export { default as NavigationMenuContent } from './NavigationMenuContent.vue' +export { default as NavigationMenuIndicator } from './NavigationMenuIndicator.vue' +export { default as NavigationMenuItem } from './NavigationMenuItem.vue' +export { default as NavigationMenuLink } from './NavigationMenuLink.vue' +export { default as NavigationMenuList } from './NavigationMenuList.vue' +export { default as NavigationMenuTrigger } from './NavigationMenuTrigger.vue' +export { default as NavigationMenuViewport } from './NavigationMenuViewport.vue' + +export const navigationMenuTriggerStyle = cva( + 'group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:hover:bg-accent data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent data-[state=open]:bg-accent/50 focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1', +) diff --git a/resources/js/components/ui/pin-input/PinInput.vue b/resources/js/components/ui/pin-input/PinInput.vue new file mode 100644 index 0000000..95fd4d9 --- /dev/null +++ b/resources/js/components/ui/pin-input/PinInput.vue @@ -0,0 +1,25 @@ + + + diff --git a/resources/js/components/ui/pin-input/PinInputGroup.vue b/resources/js/components/ui/pin-input/PinInputGroup.vue new file mode 100644 index 0000000..f5aff44 --- /dev/null +++ b/resources/js/components/ui/pin-input/PinInputGroup.vue @@ -0,0 +1,21 @@ + + + diff --git a/resources/js/components/ui/pin-input/PinInputSeparator.vue b/resources/js/components/ui/pin-input/PinInputSeparator.vue new file mode 100644 index 0000000..1d46418 --- /dev/null +++ b/resources/js/components/ui/pin-input/PinInputSeparator.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/components/ui/pin-input/PinInputSlot.vue b/resources/js/components/ui/pin-input/PinInputSlot.vue new file mode 100644 index 0000000..c9a3c95 --- /dev/null +++ b/resources/js/components/ui/pin-input/PinInputSlot.vue @@ -0,0 +1,21 @@ + + + diff --git a/resources/js/components/ui/pin-input/index.ts b/resources/js/components/ui/pin-input/index.ts new file mode 100644 index 0000000..74faa6c --- /dev/null +++ b/resources/js/components/ui/pin-input/index.ts @@ -0,0 +1,4 @@ +export { default as PinInput } from "./PinInput.vue" +export { default as PinInputGroup } from "./PinInputGroup.vue" +export { default as PinInputSeparator } from "./PinInputSeparator.vue" +export { default as PinInputSlot } from "./PinInputSlot.vue" diff --git a/resources/js/components/ui/separator/Separator.vue b/resources/js/components/ui/separator/Separator.vue new file mode 100644 index 0000000..9d28574 --- /dev/null +++ b/resources/js/components/ui/separator/Separator.vue @@ -0,0 +1,28 @@ + + + diff --git a/resources/js/components/ui/separator/index.ts b/resources/js/components/ui/separator/index.ts new file mode 100644 index 0000000..2287bcb --- /dev/null +++ b/resources/js/components/ui/separator/index.ts @@ -0,0 +1 @@ +export { default as Separator } from './Separator.vue' diff --git a/resources/js/components/ui/sheet/Sheet.vue b/resources/js/components/ui/sheet/Sheet.vue new file mode 100644 index 0000000..e2a3374 --- /dev/null +++ b/resources/js/components/ui/sheet/Sheet.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/sheet/SheetClose.vue b/resources/js/components/ui/sheet/SheetClose.vue new file mode 100644 index 0000000..05077ea --- /dev/null +++ b/resources/js/components/ui/sheet/SheetClose.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/components/ui/sheet/SheetContent.vue b/resources/js/components/ui/sheet/SheetContent.vue new file mode 100644 index 0000000..98d4bf5 --- /dev/null +++ b/resources/js/components/ui/sheet/SheetContent.vue @@ -0,0 +1,63 @@ + + + diff --git a/resources/js/components/ui/sheet/SheetDescription.vue b/resources/js/components/ui/sheet/SheetDescription.vue new file mode 100644 index 0000000..bf9e277 --- /dev/null +++ b/resources/js/components/ui/sheet/SheetDescription.vue @@ -0,0 +1,23 @@ + + + diff --git a/resources/js/components/ui/sheet/SheetFooter.vue b/resources/js/components/ui/sheet/SheetFooter.vue new file mode 100644 index 0000000..d2ac823 --- /dev/null +++ b/resources/js/components/ui/sheet/SheetFooter.vue @@ -0,0 +1,16 @@ + + + diff --git a/resources/js/components/ui/sheet/SheetHeader.vue b/resources/js/components/ui/sheet/SheetHeader.vue new file mode 100644 index 0000000..ab20557 --- /dev/null +++ b/resources/js/components/ui/sheet/SheetHeader.vue @@ -0,0 +1,15 @@ + + + diff --git a/resources/js/components/ui/sheet/SheetOverlay.vue b/resources/js/components/ui/sheet/SheetOverlay.vue new file mode 100644 index 0000000..61fd8db --- /dev/null +++ b/resources/js/components/ui/sheet/SheetOverlay.vue @@ -0,0 +1,23 @@ + + + diff --git a/resources/js/components/ui/sheet/SheetTitle.vue b/resources/js/components/ui/sheet/SheetTitle.vue new file mode 100644 index 0000000..dc694b8 --- /dev/null +++ b/resources/js/components/ui/sheet/SheetTitle.vue @@ -0,0 +1,23 @@ + + + diff --git a/resources/js/components/ui/sheet/SheetTrigger.vue b/resources/js/components/ui/sheet/SheetTrigger.vue new file mode 100644 index 0000000..5981f8e --- /dev/null +++ b/resources/js/components/ui/sheet/SheetTrigger.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/components/ui/sheet/index.ts b/resources/js/components/ui/sheet/index.ts new file mode 100644 index 0000000..ee33431 --- /dev/null +++ b/resources/js/components/ui/sheet/index.ts @@ -0,0 +1,8 @@ +export { default as Sheet } from './Sheet.vue' +export { default as SheetClose } from './SheetClose.vue' +export { default as SheetContent } from './SheetContent.vue' +export { default as SheetDescription } from './SheetDescription.vue' +export { default as SheetFooter } from './SheetFooter.vue' +export { default as SheetHeader } from './SheetHeader.vue' +export { default as SheetTitle } from './SheetTitle.vue' +export { default as SheetTrigger } from './SheetTrigger.vue' diff --git a/resources/js/components/ui/sidebar/Sidebar.vue b/resources/js/components/ui/sidebar/Sidebar.vue new file mode 100644 index 0000000..c75db5d --- /dev/null +++ b/resources/js/components/ui/sidebar/Sidebar.vue @@ -0,0 +1,96 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarContent.vue b/resources/js/components/ui/sidebar/SidebarContent.vue new file mode 100644 index 0000000..3b7536c --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarContent.vue @@ -0,0 +1,18 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarFooter.vue b/resources/js/components/ui/sidebar/SidebarFooter.vue new file mode 100644 index 0000000..c324dff --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarFooter.vue @@ -0,0 +1,18 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarGroup.vue b/resources/js/components/ui/sidebar/SidebarGroup.vue new file mode 100644 index 0000000..57a099f --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarGroup.vue @@ -0,0 +1,18 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarGroupAction.vue b/resources/js/components/ui/sidebar/SidebarGroupAction.vue new file mode 100644 index 0000000..35713bb --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarGroupAction.vue @@ -0,0 +1,27 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarGroupContent.vue b/resources/js/components/ui/sidebar/SidebarGroupContent.vue new file mode 100644 index 0000000..5d5e2dd --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarGroupContent.vue @@ -0,0 +1,18 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarGroupLabel.vue b/resources/js/components/ui/sidebar/SidebarGroupLabel.vue new file mode 100644 index 0000000..19e1117 --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarGroupLabel.vue @@ -0,0 +1,25 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarHeader.vue b/resources/js/components/ui/sidebar/SidebarHeader.vue new file mode 100644 index 0000000..00673f7 --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarHeader.vue @@ -0,0 +1,18 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarInput.vue b/resources/js/components/ui/sidebar/SidebarInput.vue new file mode 100644 index 0000000..ecaa977 --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarInput.vue @@ -0,0 +1,22 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarInset.vue b/resources/js/components/ui/sidebar/SidebarInset.vue new file mode 100644 index 0000000..947331a --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarInset.vue @@ -0,0 +1,21 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarMenu.vue b/resources/js/components/ui/sidebar/SidebarMenu.vue new file mode 100644 index 0000000..59ec071 --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarMenu.vue @@ -0,0 +1,18 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarMenuAction.vue b/resources/js/components/ui/sidebar/SidebarMenuAction.vue new file mode 100644 index 0000000..2429433 --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarMenuAction.vue @@ -0,0 +1,34 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarMenuBadge.vue b/resources/js/components/ui/sidebar/SidebarMenuBadge.vue new file mode 100644 index 0000000..3984b33 --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarMenuBadge.vue @@ -0,0 +1,26 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarMenuButton.vue b/resources/js/components/ui/sidebar/SidebarMenuButton.vue new file mode 100644 index 0000000..ac6926b --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarMenuButton.vue @@ -0,0 +1,49 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarMenuButtonChild.vue b/resources/js/components/ui/sidebar/SidebarMenuButtonChild.vue new file mode 100644 index 0000000..0b8979c --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarMenuButtonChild.vue @@ -0,0 +1,34 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarMenuItem.vue b/resources/js/components/ui/sidebar/SidebarMenuItem.vue new file mode 100644 index 0000000..b7b4d3f --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarMenuItem.vue @@ -0,0 +1,18 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarMenuSkeleton.vue b/resources/js/components/ui/sidebar/SidebarMenuSkeleton.vue new file mode 100644 index 0000000..6be4243 --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarMenuSkeleton.vue @@ -0,0 +1,34 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarMenuSub.vue b/resources/js/components/ui/sidebar/SidebarMenuSub.vue new file mode 100644 index 0000000..11aec64 --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarMenuSub.vue @@ -0,0 +1,22 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarMenuSubButton.vue b/resources/js/components/ui/sidebar/SidebarMenuSubButton.vue new file mode 100644 index 0000000..98e8e56 --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarMenuSubButton.vue @@ -0,0 +1,36 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarMenuSubItem.vue b/resources/js/components/ui/sidebar/SidebarMenuSubItem.vue new file mode 100644 index 0000000..f0c35bc --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarMenuSubItem.vue @@ -0,0 +1,18 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarProvider.vue b/resources/js/components/ui/sidebar/SidebarProvider.vue new file mode 100644 index 0000000..a4ba362 --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarProvider.vue @@ -0,0 +1,81 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarRail.vue b/resources/js/components/ui/sidebar/SidebarRail.vue new file mode 100644 index 0000000..07e59be --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarRail.vue @@ -0,0 +1,33 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarSeparator.vue b/resources/js/components/ui/sidebar/SidebarSeparator.vue new file mode 100644 index 0000000..1803bff --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarSeparator.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/components/ui/sidebar/SidebarTrigger.vue b/resources/js/components/ui/sidebar/SidebarTrigger.vue new file mode 100644 index 0000000..0e4fcbc --- /dev/null +++ b/resources/js/components/ui/sidebar/SidebarTrigger.vue @@ -0,0 +1,27 @@ + + + diff --git a/resources/js/components/ui/sidebar/index.ts b/resources/js/components/ui/sidebar/index.ts new file mode 100644 index 0000000..accd624 --- /dev/null +++ b/resources/js/components/ui/sidebar/index.ts @@ -0,0 +1,60 @@ +import type { VariantProps } from 'class-variance-authority' +import type { HTMLAttributes } from 'vue' +import { cva } from 'class-variance-authority' + +export interface SidebarProps { + side?: 'left' | 'right' + variant?: 'sidebar' | 'floating' | 'inset' + collapsible?: 'offcanvas' | 'icon' | 'none' + class?: HTMLAttributes['class'] +} + +export { default as Sidebar } from './Sidebar.vue' +export { default as SidebarContent } from './SidebarContent.vue' +export { default as SidebarFooter } from './SidebarFooter.vue' +export { default as SidebarGroup } from './SidebarGroup.vue' +export { default as SidebarGroupAction } from './SidebarGroupAction.vue' +export { default as SidebarGroupContent } from './SidebarGroupContent.vue' +export { default as SidebarGroupLabel } from './SidebarGroupLabel.vue' +export { default as SidebarHeader } from './SidebarHeader.vue' +export { default as SidebarInput } from './SidebarInput.vue' +export { default as SidebarInset } from './SidebarInset.vue' +export { default as SidebarMenu } from './SidebarMenu.vue' +export { default as SidebarMenuAction } from './SidebarMenuAction.vue' +export { default as SidebarMenuBadge } from './SidebarMenuBadge.vue' +export { default as SidebarMenuButton } from './SidebarMenuButton.vue' +export { default as SidebarMenuItem } from './SidebarMenuItem.vue' +export { default as SidebarMenuSkeleton } from './SidebarMenuSkeleton.vue' +export { default as SidebarMenuSub } from './SidebarMenuSub.vue' +export { default as SidebarMenuSubButton } from './SidebarMenuSubButton.vue' +export { default as SidebarMenuSubItem } from './SidebarMenuSubItem.vue' +export { default as SidebarProvider } from './SidebarProvider.vue' +export { default as SidebarRail } from './SidebarRail.vue' +export { default as SidebarSeparator } from './SidebarSeparator.vue' +export { default as SidebarTrigger } from './SidebarTrigger.vue' + +export { useSidebar } from './utils' + +export const sidebarMenuButtonVariants = cva( + 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:pr-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0', + { + variants: { + variant: { + default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground', + outline: + 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]', + }, + size: { + default: 'h-8 text-sm', + sm: 'h-7 text-xs', + lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +export type SidebarMenuButtonVariants = VariantProps diff --git a/resources/js/components/ui/sidebar/utils.ts b/resources/js/components/ui/sidebar/utils.ts new file mode 100644 index 0000000..6edb140 --- /dev/null +++ b/resources/js/components/ui/sidebar/utils.ts @@ -0,0 +1,19 @@ +import type { ComputedRef, Ref } from 'vue' +import { createContext } from 'reka-ui' + +export const SIDEBAR_COOKIE_NAME = 'sidebar_state' +export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 +export const SIDEBAR_WIDTH = '16rem' +export const SIDEBAR_WIDTH_MOBILE = '18rem' +export const SIDEBAR_WIDTH_ICON = '3rem' +export const SIDEBAR_KEYBOARD_SHORTCUT = 'b' + +export const [useSidebar, provideSidebarContext] = createContext<{ + state: ComputedRef<'expanded' | 'collapsed'> + open: Ref + setOpen: (value: boolean) => void + isMobile: Ref + openMobile: Ref + setOpenMobile: (value: boolean) => void + toggleSidebar: () => void +}>('Sidebar') diff --git a/resources/js/components/ui/skeleton/Skeleton.vue b/resources/js/components/ui/skeleton/Skeleton.vue new file mode 100644 index 0000000..153fe2c --- /dev/null +++ b/resources/js/components/ui/skeleton/Skeleton.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/skeleton/index.ts b/resources/js/components/ui/skeleton/index.ts new file mode 100644 index 0000000..be21fad --- /dev/null +++ b/resources/js/components/ui/skeleton/index.ts @@ -0,0 +1 @@ +export { default as Skeleton } from './Skeleton.vue' diff --git a/resources/js/components/ui/spinner/Spinner.vue b/resources/js/components/ui/spinner/Spinner.vue new file mode 100644 index 0000000..57cd1a9 --- /dev/null +++ b/resources/js/components/ui/spinner/Spinner.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/spinner/index.ts b/resources/js/components/ui/spinner/index.ts new file mode 100644 index 0000000..aa63007 --- /dev/null +++ b/resources/js/components/ui/spinner/index.ts @@ -0,0 +1 @@ +export { default as Spinner } from "./Spinner.vue" diff --git a/resources/js/components/ui/tooltip/Tooltip.vue b/resources/js/components/ui/tooltip/Tooltip.vue new file mode 100644 index 0000000..3ebeecc --- /dev/null +++ b/resources/js/components/ui/tooltip/Tooltip.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/components/ui/tooltip/TooltipContent.vue b/resources/js/components/ui/tooltip/TooltipContent.vue new file mode 100644 index 0000000..2441afd --- /dev/null +++ b/resources/js/components/ui/tooltip/TooltipContent.vue @@ -0,0 +1,33 @@ + + + diff --git a/resources/js/components/ui/tooltip/TooltipProvider.vue b/resources/js/components/ui/tooltip/TooltipProvider.vue new file mode 100644 index 0000000..4b4203e --- /dev/null +++ b/resources/js/components/ui/tooltip/TooltipProvider.vue @@ -0,0 +1,13 @@ + + + diff --git a/resources/js/components/ui/tooltip/TooltipTrigger.vue b/resources/js/components/ui/tooltip/TooltipTrigger.vue new file mode 100644 index 0000000..36253c6 --- /dev/null +++ b/resources/js/components/ui/tooltip/TooltipTrigger.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/components/ui/tooltip/index.ts b/resources/js/components/ui/tooltip/index.ts new file mode 100644 index 0000000..5ab9653 --- /dev/null +++ b/resources/js/components/ui/tooltip/index.ts @@ -0,0 +1,4 @@ +export { default as Tooltip } from './Tooltip.vue' +export { default as TooltipContent } from './TooltipContent.vue' +export { default as TooltipProvider } from './TooltipProvider.vue' +export { default as TooltipTrigger } from './TooltipTrigger.vue' diff --git a/resources/js/composables/useAppearance.ts b/resources/js/composables/useAppearance.ts new file mode 100644 index 0000000..22bd855 --- /dev/null +++ b/resources/js/composables/useAppearance.ts @@ -0,0 +1,99 @@ +import { onMounted, ref } from 'vue'; + +type Appearance = 'light' | 'dark' | 'system'; + +export function updateTheme(value: Appearance) { + if (typeof window === 'undefined') { + return; + } + + if (value === 'system') { + const mediaQueryList = window.matchMedia( + '(prefers-color-scheme: dark)', + ); + const systemTheme = mediaQueryList.matches ? 'dark' : 'light'; + + document.documentElement.classList.toggle( + 'dark', + systemTheme === 'dark', + ); + } else { + document.documentElement.classList.toggle('dark', value === 'dark'); + } +} + +const setCookie = (name: string, value: string, days = 365) => { + if (typeof document === 'undefined') { + return; + } + + const maxAge = days * 24 * 60 * 60; + + document.cookie = `${name}=${value};path=/;max-age=${maxAge};SameSite=Lax`; +}; + +const mediaQuery = () => { + if (typeof window === 'undefined') { + return null; + } + + return window.matchMedia('(prefers-color-scheme: dark)'); +}; + +const getStoredAppearance = () => { + if (typeof window === 'undefined') { + return null; + } + + return localStorage.getItem('appearance') as Appearance | null; +}; + +const handleSystemThemeChange = () => { + const currentAppearance = getStoredAppearance(); + + updateTheme(currentAppearance || 'system'); +}; + +export function initializeTheme() { + if (typeof window === 'undefined') { + return; + } + + // Initialize theme from saved preference or default to system... + const savedAppearance = getStoredAppearance(); + updateTheme(savedAppearance || 'system'); + + // Set up system theme change listener... + mediaQuery()?.addEventListener('change', handleSystemThemeChange); +} + +const appearance = ref('system'); + +export function useAppearance() { + onMounted(() => { + const savedAppearance = localStorage.getItem( + 'appearance', + ) as Appearance | null; + + if (savedAppearance) { + appearance.value = savedAppearance; + } + }); + + function updateAppearance(value: Appearance) { + appearance.value = value; + + // Store in localStorage for client-side persistence... + localStorage.setItem('appearance', value); + + // Store in cookie for SSR... + setCookie('appearance', value); + + updateTheme(value); + } + + return { + appearance, + updateAppearance, + }; +} diff --git a/resources/js/composables/useInitials.ts b/resources/js/composables/useInitials.ts new file mode 100644 index 0000000..b5d9410 --- /dev/null +++ b/resources/js/composables/useInitials.ts @@ -0,0 +1,14 @@ +export function getInitials(fullName?: string): string { + if (!fullName) return ''; + + const names = fullName.trim().split(' '); + + if (names.length === 0) return ''; + if (names.length === 1) return names[0].charAt(0).toUpperCase(); + + return `${names[0].charAt(0)}${names[names.length - 1].charAt(0)}`.toUpperCase(); +} + +export function useInitials() { + return { getInitials }; +} diff --git a/resources/js/composables/useTwoFactorAuth.ts b/resources/js/composables/useTwoFactorAuth.ts new file mode 100644 index 0000000..79daa0f --- /dev/null +++ b/resources/js/composables/useTwoFactorAuth.ts @@ -0,0 +1,104 @@ +import { qrCode, recoveryCodes, secretKey } from '@/routes/two-factor'; +import { computed, ref } from 'vue'; + +const fetchJson = async (url: string): Promise => { + const response = await fetch(url, { + headers: { Accept: 'application/json' }, + }); + + if (!response.ok) { + throw new Error(`Failed to fetch: ${response.status}`); + } + + return response.json(); +}; + +const errors = ref([]); +const manualSetupKey = ref(null); +const qrCodeSvg = ref(null); +const recoveryCodesList = ref([]); + +const hasSetupData = computed( + () => qrCodeSvg.value !== null && manualSetupKey.value !== null, +); + +export const useTwoFactorAuth = () => { + const fetchQrCode = async (): Promise => { + try { + const { svg } = await fetchJson<{ svg: string; url: string }>( + qrCode.url(), + ); + + qrCodeSvg.value = svg; + } catch { + errors.value.push('Failed to fetch QR code'); + qrCodeSvg.value = null; + } + }; + + const fetchSetupKey = async (): Promise => { + try { + const { secretKey: key } = await fetchJson<{ secretKey: string }>( + secretKey.url(), + ); + + manualSetupKey.value = key; + } catch { + errors.value.push('Failed to fetch a setup key'); + manualSetupKey.value = null; + } + }; + + const clearSetupData = (): void => { + manualSetupKey.value = null; + qrCodeSvg.value = null; + clearErrors(); + }; + + const clearErrors = (): void => { + errors.value = []; + }; + + const clearTwoFactorAuthData = (): void => { + clearSetupData(); + clearErrors(); + recoveryCodesList.value = []; + }; + + const fetchRecoveryCodes = async (): Promise => { + try { + clearErrors(); + recoveryCodesList.value = await fetchJson( + recoveryCodes.url(), + ); + } catch { + errors.value.push('Failed to fetch recovery codes'); + recoveryCodesList.value = []; + } + }; + + const fetchSetupData = async (): Promise => { + try { + clearErrors(); + await Promise.all([fetchQrCode(), fetchSetupKey()]); + } catch { + qrCodeSvg.value = null; + manualSetupKey.value = null; + } + }; + + return { + qrCodeSvg, + manualSetupKey, + recoveryCodesList, + errors, + hasSetupData, + clearSetupData, + clearErrors, + clearTwoFactorAuthData, + fetchQrCode, + fetchSetupKey, + fetchSetupData, + fetchRecoveryCodes, + }; +}; diff --git a/resources/js/layouts/AppLayout.vue b/resources/js/layouts/AppLayout.vue new file mode 100644 index 0000000..77c9396 --- /dev/null +++ b/resources/js/layouts/AppLayout.vue @@ -0,0 +1,18 @@ + + + diff --git a/resources/js/layouts/AuthLayout.vue b/resources/js/layouts/AuthLayout.vue new file mode 100644 index 0000000..4b09455 --- /dev/null +++ b/resources/js/layouts/AuthLayout.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/layouts/app/AppHeaderLayout.vue b/resources/js/layouts/app/AppHeaderLayout.vue new file mode 100644 index 0000000..0f0f84e --- /dev/null +++ b/resources/js/layouts/app/AppHeaderLayout.vue @@ -0,0 +1,23 @@ + + + diff --git a/resources/js/layouts/app/AppSidebarLayout.vue b/resources/js/layouts/app/AppSidebarLayout.vue new file mode 100644 index 0000000..fe9855d --- /dev/null +++ b/resources/js/layouts/app/AppSidebarLayout.vue @@ -0,0 +1,25 @@ + + + diff --git a/resources/js/layouts/auth/AuthCardLayout.vue b/resources/js/layouts/auth/AuthCardLayout.vue new file mode 100644 index 0000000..af3ef00 --- /dev/null +++ b/resources/js/layouts/auth/AuthCardLayout.vue @@ -0,0 +1,50 @@ + + + diff --git a/resources/js/layouts/auth/AuthSimpleLayout.vue b/resources/js/layouts/auth/AuthSimpleLayout.vue new file mode 100644 index 0000000..c938420 --- /dev/null +++ b/resources/js/layouts/auth/AuthSimpleLayout.vue @@ -0,0 +1,43 @@ + + + diff --git a/resources/js/layouts/auth/AuthSplitLayout.vue b/resources/js/layouts/auth/AuthSplitLayout.vue new file mode 100644 index 0000000..3da79a4 --- /dev/null +++ b/resources/js/layouts/auth/AuthSplitLayout.vue @@ -0,0 +1,56 @@ + + + diff --git a/resources/js/layouts/settings/Layout.vue b/resources/js/layouts/settings/Layout.vue new file mode 100644 index 0000000..a3eab3d --- /dev/null +++ b/resources/js/layouts/settings/Layout.vue @@ -0,0 +1,72 @@ + + + diff --git a/resources/js/lib/utils.ts b/resources/js/lib/utils.ts new file mode 100644 index 0000000..fdee36a --- /dev/null +++ b/resources/js/lib/utils.ts @@ -0,0 +1,18 @@ +import { InertiaLinkProps } from '@inertiajs/vue3'; +import { clsx, type ClassValue } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +export function urlIsActive( + urlToCheck: NonNullable, + currentUrl: string, +) { + return toUrl(urlToCheck) === currentUrl; +} + +export function toUrl(href: NonNullable) { + return typeof href === 'string' ? href : href?.url; +} diff --git a/resources/js/pages/Dashboard.vue b/resources/js/pages/Dashboard.vue new file mode 100644 index 0000000..9d82b41 --- /dev/null +++ b/resources/js/pages/Dashboard.vue @@ -0,0 +1,129 @@ + + + diff --git a/resources/js/pages/Welcome.vue b/resources/js/pages/Welcome.vue new file mode 100644 index 0000000..405e00c --- /dev/null +++ b/resources/js/pages/Welcome.vue @@ -0,0 +1,842 @@ + + + diff --git a/resources/js/pages/actors/Show.vue b/resources/js/pages/actors/Show.vue new file mode 100644 index 0000000..6815a5e --- /dev/null +++ b/resources/js/pages/actors/Show.vue @@ -0,0 +1,227 @@ + + + + + diff --git a/resources/js/pages/admin/movies/Edit.vue b/resources/js/pages/admin/movies/Edit.vue new file mode 100644 index 0000000..dcbd6cd --- /dev/null +++ b/resources/js/pages/admin/movies/Edit.vue @@ -0,0 +1,286 @@ + + +