From da918835c25bae12a9c59672075268a4f4acf98b Mon Sep 17 00:00:00 2001 From: User Date: Fri, 27 Dec 2024 20:43:18 -0500 Subject: [PATCH] Initial --- app/Enum/MimeType.php | 17 + .../Auth/NewPasswordController.php | 2 +- .../Auth/PasswordResetLinkController.php | 2 +- .../Auth/RegisteredUserController.php | 6 +- app/Http/Controllers/ComicController.php | 230 +++ app/Http/Middleware/HandleInertiaRequests.php | 5 +- app/Http/Requests/Auth/LoginRequest.php | 7 +- app/Http/Requests/ProfileUpdateRequest.php | 4 +- app/Http/Resources/UserCollection.php | 24 + app/Models/Author.php | 21 + app/Models/Chapter.php | 30 + app/Models/Comic.php | 31 + app/Models/Image.php | 36 + app/Models/ReadingHistory.php | 26 + app/Models/User.php | 20 +- app/Remote/CopyManga.php | 336 ++++ app/Remote/ImageFetcher.php | 86 + bootstrap/app.php | 9 +- bun.lockb | Bin 0 -> 151983 bytes components.json | 21 + composer.json | 4 +- composer.lock | 160 +- config/cors.php | 34 + config/sanctum.php | 83 + database/factories/UserFactory.php | 3 +- ...24_create_personal_access_tokens_table.php | 33 + .../2024_12_20_221845_create_comics_table.php | 28 + ...024_12_20_231732_create_chapters_table.php | 26 + .../2024_12_21_002228_create_images_table.php | 25 + ...2024_12_26_161200_create_authors_table.php | 30 + ...024_12_26_235510_create_user_favourite.php | 22 + ..._160045_create_reading_histories_table.php | 23 + jsconfig.json | 1 + package-lock.json | 1574 +++++++++++++---- package.json | 49 +- resources/css/app.css | 79 + resources/js/Components/ThemeProvider.tsx | 75 + resources/js/Components/ui/alert.jsx | 47 + resources/js/Components/ui/app-sidebar.jsx | 134 ++ resources/js/Components/ui/avatar.jsx | 33 + resources/js/Components/ui/badge.jsx | 34 + resources/js/Components/ui/breadcrumb.jsx | 92 + resources/js/Components/ui/button.jsx | 48 + resources/js/Components/ui/card.jsx | 50 + resources/js/Components/ui/checkbox.jsx | 22 + resources/js/Components/ui/collapsible.jsx | 9 + resources/js/Components/ui/dialog.jsx | 94 + resources/js/Components/ui/dropdown-menu.jsx | 156 ++ resources/js/Components/ui/form.jsx | 133 ++ resources/js/Components/ui/input.jsx | 19 + resources/js/Components/ui/label.jsx | 16 + resources/js/Components/ui/pagination.jsx | 101 ++ resources/js/Components/ui/separator.jsx | 23 + resources/js/Components/ui/sheet.jsx | 109 ++ resources/js/Components/ui/sidebar.jsx | 619 +++++++ resources/js/Components/ui/skeleton.jsx | 14 + resources/js/Components/ui/switch.jsx | 22 + resources/js/Components/ui/table.jsx | 86 + resources/js/Components/ui/tabs.jsx | 41 + resources/js/Components/ui/toast.jsx | 85 + resources/js/Components/ui/toaster.jsx | 33 + resources/js/Components/ui/tooltip.jsx | 26 + resources/js/Layouts/AppLayout.jsx | 87 + resources/js/Layouts/GuestLayout.jsx | 13 +- resources/js/Pages/Auth/ConfirmPassword.jsx | 60 +- resources/js/Pages/Auth/ForgotPassword.jsx | 76 +- resources/js/Pages/Auth/Login.jsx | 143 +- resources/js/Pages/Auth/Register.jsx | 145 +- resources/js/Pages/Auth/ResetPassword.jsx | 105 +- resources/js/Pages/Comic/Chapters.jsx | 161 ++ resources/js/Pages/Comic/Favourites.jsx | 89 + resources/js/Pages/Comic/Index.jsx | 78 + resources/js/Pages/Comic/Read.jsx | 291 +++ resources/js/Pages/Profile/Edit.jsx | 58 +- .../Pages/Profile/Partials/DeleteUserForm.jsx | 135 +- .../Profile/Partials/UpdatePasswordForm.jsx | 145 +- .../Partials/UpdateProfileInformationForm.jsx | 143 +- resources/js/hooks/use-mobile.jsx | 19 + resources/js/hooks/use-toast.js | 155 ++ resources/js/lib/utils.js | 6 + resources/views/app.blade.php | 7 - routes/api.php | 8 + routes/web.php | 23 +- tailwind.config.js | 73 +- 84 files changed, 6160 insertions(+), 1068 deletions(-) create mode 100644 app/Enum/MimeType.php create mode 100644 app/Http/Controllers/ComicController.php create mode 100644 app/Http/Resources/UserCollection.php create mode 100644 app/Models/Author.php create mode 100644 app/Models/Chapter.php create mode 100644 app/Models/Comic.php create mode 100644 app/Models/Image.php create mode 100644 app/Models/ReadingHistory.php create mode 100644 app/Remote/CopyManga.php create mode 100644 app/Remote/ImageFetcher.php create mode 100755 bun.lockb create mode 100644 components.json create mode 100644 config/cors.php create mode 100644 config/sanctum.php create mode 100644 database/migrations/2024_12_18_021724_create_personal_access_tokens_table.php create mode 100644 database/migrations/2024_12_20_221845_create_comics_table.php create mode 100644 database/migrations/2024_12_20_231732_create_chapters_table.php create mode 100644 database/migrations/2024_12_21_002228_create_images_table.php create mode 100644 database/migrations/2024_12_26_161200_create_authors_table.php create mode 100644 database/migrations/2024_12_26_235510_create_user_favourite.php create mode 100644 database/migrations/2024_12_27_160045_create_reading_histories_table.php create mode 100644 resources/js/Components/ThemeProvider.tsx create mode 100644 resources/js/Components/ui/alert.jsx create mode 100644 resources/js/Components/ui/app-sidebar.jsx create mode 100644 resources/js/Components/ui/avatar.jsx create mode 100644 resources/js/Components/ui/badge.jsx create mode 100644 resources/js/Components/ui/breadcrumb.jsx create mode 100644 resources/js/Components/ui/button.jsx create mode 100644 resources/js/Components/ui/card.jsx create mode 100644 resources/js/Components/ui/checkbox.jsx create mode 100644 resources/js/Components/ui/collapsible.jsx create mode 100644 resources/js/Components/ui/dialog.jsx create mode 100644 resources/js/Components/ui/dropdown-menu.jsx create mode 100644 resources/js/Components/ui/form.jsx create mode 100644 resources/js/Components/ui/input.jsx create mode 100644 resources/js/Components/ui/label.jsx create mode 100644 resources/js/Components/ui/pagination.jsx create mode 100644 resources/js/Components/ui/separator.jsx create mode 100644 resources/js/Components/ui/sheet.jsx create mode 100644 resources/js/Components/ui/sidebar.jsx create mode 100644 resources/js/Components/ui/skeleton.jsx create mode 100644 resources/js/Components/ui/switch.jsx create mode 100644 resources/js/Components/ui/table.jsx create mode 100644 resources/js/Components/ui/tabs.jsx create mode 100644 resources/js/Components/ui/toast.jsx create mode 100644 resources/js/Components/ui/toaster.jsx create mode 100644 resources/js/Components/ui/tooltip.jsx create mode 100644 resources/js/Layouts/AppLayout.jsx create mode 100644 resources/js/Pages/Comic/Chapters.jsx create mode 100644 resources/js/Pages/Comic/Favourites.jsx create mode 100644 resources/js/Pages/Comic/Index.jsx create mode 100644 resources/js/Pages/Comic/Read.jsx create mode 100644 resources/js/hooks/use-mobile.jsx create mode 100644 resources/js/hooks/use-toast.js create mode 100644 resources/js/lib/utils.js create mode 100644 routes/api.php diff --git a/app/Enum/MimeType.php b/app/Enum/MimeType.php new file mode 100644 index 0000000..6c2041d --- /dev/null +++ b/app/Enum/MimeType.php @@ -0,0 +1,17 @@ +validate([ 'name' => 'required|string|max:255', - 'email' => 'required|string|lowercase|email|max:255|unique:'.User::class, + 'email' => 'required|string|lowercase|email|max:255|contains:yumj.in|unique:'.User::class, 'password' => ['required', 'confirmed', Rules\Password::defaults()], ]); diff --git a/app/Http/Controllers/ComicController.php b/app/Http/Controllers/ComicController.php new file mode 100644 index 0000000..21fd55e --- /dev/null +++ b/app/Http/Controllers/ComicController.php @@ -0,0 +1,230 @@ +user()->favourites()->with(['authors'])->orderBy('upstream_updated_at', 'desc')->get(); + + return Inertia::render('Comic/Favourites', [ + 'favourites' => $favourites, + ]); + } + + public function postFavourite(Request $request): JsonResponse + { + try { + // Get pathname to comic_id + $comic = Comic::where('pathword', $request->pathword)->firstOrFail(); + } catch (ModelNotFoundException $e) { + // Fetch from remote + $remoteComic = $this->copyManga->comic($request->pathword); + + $comic = new Comic; + $comic->pathword = $remoteComic['comic']['path_word']; + $comic->name = $remoteComic['comic']['name']; + $comic->cover = $remoteComic['comic']['cover']; + $comic->upstream_updated_at = $remoteComic['comic']['datetime_updated']; + $comic->uuid = $remoteComic['comic']['uuid']; + $comic->alias = explode(',', $remoteComic['comic']['alias']); + $comic->description = $remoteComic['comic']['brief']; + $comic->metadata = $remoteComic; + $comic->save(); + } + + // Set favourite + if ($request->user()->favourites()->where('comic_id', $comic->id)->exists()) { + $request->user()->favourites()->detach($comic->id); + } else { + $request->user()->favourites()->attach($comic->id); + } + + return response()->json($request->user()->favourites()->get(['pathword'])->pluck('pathword')); + } + + public function image(Request $request, string $url): ResponseFactory|Application|IlluminateHttpResponse + { + // TODO: Ref check and make it require auth + $fetcher = new ImageFetcher(base64_decode($url)); + + return response($fetcher->fetch())->withHeaders([ + 'Content-Type' => $fetcher->getMimeType()->value, + 'Cache-Control' => 'max-age=604800', + ]); + } + + public function index(Request $request): Response + { + $params = []; + if ($request->has('tag')) { + $params['theme'] = $request->get('tag'); + } + + $comics = $this->copyManga->comics(30, $request->header('offset', 0), $request->get('top', 'all'), $params); + + // Prep the array for upsert + $comicsUpsertArray = []; + $authorsUpsertArray = []; + + foreach ($comics['list'] as $comic) { + $comicsUpsertArray[] = [ + 'pathword' => $comic['path_word'], + 'uuid' => '', + 'name' => $comic['name'], + 'alias' => '{}', + 'description' => '', + 'cover' => $comic['cover'], + 'upstream_updated_at' => $comic['datetime_updated'], + ]; + + foreach ($comic['author'] as $author) { + $authorsUpsertArray[] = [ + 'name' => $author['name'] + ]; + } + } + + // Do an upsert for comics + Comic::upsert($comicsUpsertArray, uniqueBy: 'pathword', update: ['upstream_updated_at']); + Author::upsert($authorsUpsertArray, uniqueBy: 'name'); + + // Had to do a second pass to insert the relationships + foreach ($comics['list'] as $comic) { + // Get the comic id + $comicObj = Comic::where('pathword', $comic['path_word'])->first(); + + foreach ($comic['author'] as $author) { + $authorObj = Author::where('name', $author['name'])->first(); + $comicObj->authors()->sync($authorObj); + } + } + + return Inertia::render('Comic/Index', [ + 'comics' => $comics, + 'offset' => $request->header('offset', 0) + ]); + } + + public function chapters(Request $request, string $pathword = ''): Response + { + $comic = $this->copyManga->comic($pathword); + $chapters = $this->copyManga->chapters($pathword, 200, 0, [], $request->get('group', 'default')); + + // Get the comic object and fill other parameters + $comicObject = Comic::where('pathword', $pathword)->first(); + $comicObject->uuid = $comic['comic']['uuid']; + $comicObject->alias = explode(',', $comic['comic']['alias']); + $comicObject->description = $comic['comic']['brief']; + $comicObject->metadata = $comic; + $comicObject->save(); + + // Get the authors and update the pathword + foreach ($comic['comic']['author'] as $author) { + $authorObj = Author::where('name', $author['name'])->whereNull('pathword')->first(); + + if ($authorObj) { + // Do nothing if pathword already exist + $authorObj->pathword = $author['path_word']; + $authorObj->save(); + } + } + + // Do the Chapters + // Prep the array for upsert + $arrayForUpsert = []; + foreach ($chapters['list'] as $chapter) { + $arrayForUpsert[] = [ + 'comic_id' => $comicObject->id, + 'chapter_uuid' => $chapter['uuid'], + 'name' => $chapter['name'], + 'order' => $chapter['index'], + 'upstream_created_at' => $chapter['datetime_created'], + 'metadata' => json_encode($chapter), + ]; + } + + // Do an upsert + Chapter::upsert($arrayForUpsert, uniqueBy: 'chapter_uuid'); + + return Inertia::render('Comic/Chapters', [ + 'comic' => $comic, + 'chapters' => $chapters, + ]); + } + + public function read(Request $request, string $pathword = '', string $uuid = ''): Response + { + $comic = $this->copyManga->comic($pathword); + $chapter = $this->copyManga->chapter($pathword, $uuid); + + // Get the authors and update the pathword + foreach ($comic['comic']['author'] as $author) { + $authorObj = Author::where('name', $author['name'])->whereNull('pathword')->first(); + + if ($authorObj) { + // Do nothing if pathword already exist + $authorObj->pathword = $author['path_word']; + $authorObj->save(); + } + } + + $chapterObj = Chapter::where('chapter_uuid', $chapter['chapter']['uuid'])->first(); + $comicObj = Comic::where('pathword', $pathword)->first(); + + $arrayForUpsert = []; + + foreach ($chapter['sorted'] as $k => $image) { + $metadata = $chapter; + unset($metadata['sorted']); + unset($metadata['chapter']['contents'], $metadata['chapter']['words']); + + $arrayForUpsert[] = [ + 'comic_id' => $comicObj->id, + 'chapter_id' => $chapterObj->id, + 'order' => $k, + 'url' => $image['url'], + 'metadata' => json_encode($metadata), + ]; + } + + // Do an upsert + Image::upsert($arrayForUpsert, uniqueBy: 'url'); + + return Inertia::render('Comic/Read', [ + 'comic' => $comic, + 'chapter' => $chapter, + ]); + } + + public function tags() + { + // TODO + $tags = $this->copyManga->tags(); + Cache::forever('tags', $tags); + + return response()->json($tags); + } +} diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 3867f22..6f2359e 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -2,7 +2,9 @@ namespace App\Http\Middleware; +use App\Http\Resources\UserCollection; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Cache; use Inertia\Middleware; class HandleInertiaRequests extends Middleware @@ -31,8 +33,9 @@ class HandleInertiaRequests extends Middleware { return [ ...parent::share($request), + 'tags' => Cache::get('tags'), 'auth' => [ - 'user' => $request->user(), + 'user' => $request->user() ? (new UserCollection($request->user()))->toArray($request) : null, ], ]; } diff --git a/app/Http/Requests/Auth/LoginRequest.php b/app/Http/Requests/Auth/LoginRequest.php index 2574642..711e0a1 100644 --- a/app/Http/Requests/Auth/LoginRequest.php +++ b/app/Http/Requests/Auth/LoginRequest.php @@ -3,6 +3,7 @@ namespace App\Http\Requests\Auth; use Illuminate\Auth\Events\Lockout; +use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\RateLimiter; @@ -22,7 +23,7 @@ class LoginRequest extends FormRequest /** * Get the validation rules that apply to the request. * - * @return array|string> + * @return array|string> */ public function rules(): array { @@ -35,7 +36,7 @@ class LoginRequest extends FormRequest /** * Attempt to authenticate the request's credentials. * - * @throws \Illuminate\Validation\ValidationException + * @throws ValidationException */ public function authenticate(): void { @@ -55,7 +56,7 @@ class LoginRequest extends FormRequest /** * Ensure the login request is not rate limited. * - * @throws \Illuminate\Validation\ValidationException + * @throws ValidationException */ public function ensureIsNotRateLimited(): void { diff --git a/app/Http/Requests/ProfileUpdateRequest.php b/app/Http/Requests/ProfileUpdateRequest.php index 3622a8f..e41248e 100644 --- a/app/Http/Requests/ProfileUpdateRequest.php +++ b/app/Http/Requests/ProfileUpdateRequest.php @@ -3,6 +3,7 @@ namespace App\Http\Requests; use App\Models\User; +use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; @@ -11,7 +12,7 @@ class ProfileUpdateRequest extends FormRequest /** * Get the validation rules that apply to the request. * - * @return array|string> + * @return array|string> */ public function rules(): array { @@ -19,6 +20,7 @@ class ProfileUpdateRequest extends FormRequest 'name' => ['required', 'string', 'max:255'], 'email' => [ 'required', + 'contains:@yumj.in', 'string', 'lowercase', 'email', diff --git a/app/Http/Resources/UserCollection.php b/app/Http/Resources/UserCollection.php new file mode 100644 index 0000000..10917dd --- /dev/null +++ b/app/Http/Resources/UserCollection.php @@ -0,0 +1,24 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'id' => $request->user()->id, + 'name' => $request->user()->name, + 'email' => $request->user()->email, + 'favourites' => $request->user()->favourites()->get(['pathword'])->pluck('pathword') + ]; + } +} diff --git a/app/Models/Author.php b/app/Models/Author.php new file mode 100644 index 0000000..2670173 --- /dev/null +++ b/app/Models/Author.php @@ -0,0 +1,21 @@ +belongsToMany(Comic::class); + } + +} diff --git a/app/Models/Chapter.php b/app/Models/Chapter.php new file mode 100644 index 0000000..82b1756 --- /dev/null +++ b/app/Models/Chapter.php @@ -0,0 +1,30 @@ + 'string', + 'upstream_created_at' => 'date', + 'metadata' => 'json', + ]; + } + + public function comic(): BelongsTo + { + return $this->belongsTo(Comic::class); + } + + public function images(): HasMany + { + return $this->hasMany(Image::class); + } + +} diff --git a/app/Models/Comic.php b/app/Models/Comic.php new file mode 100644 index 0000000..f3c9c9f --- /dev/null +++ b/app/Models/Comic.php @@ -0,0 +1,31 @@ + 'string', + 'alias' => 'array', + 'upstream_updated_at' => 'datetime:Y-m-d', + 'metadata' => 'json', + ]; + } + + public function authors(): BelongsToMany + { + return $this->belongsToMany(Author::class); + } + + public function chapters(): HasMany + { + return $this->hasMany(Chapter::class); + } + +} diff --git a/app/Models/Image.php b/app/Models/Image.php new file mode 100644 index 0000000..44f4e71 --- /dev/null +++ b/app/Models/Image.php @@ -0,0 +1,36 @@ + 'json', + ]; + } + + public function chapter(): BelongsTo + { + return $this->belongsTo(Chapter::class); + } + + public function comic(): BelongsTo + { + return $this->belongsTo(Comic::class); + } + +} diff --git a/app/Models/ReadingHistory.php b/app/Models/ReadingHistory.php new file mode 100644 index 0000000..7c38bf5 --- /dev/null +++ b/app/Models/ReadingHistory.php @@ -0,0 +1,26 @@ +belongsTo(Comic::class); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function chapter(): BelongsTo + { + return $this->belongsTo(Chapter::class); + } + +} diff --git a/app/Models/User.php b/app/Models/User.php index 749c7b7..5976655 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -2,14 +2,17 @@ namespace App\Models; -// use Illuminate\Contracts\Auth\MustVerifyEmail; +use Illuminate\Contracts\Auth\MustVerifyEmail; +use Database\Factories\UserFactory; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; -class User extends Authenticatable +class User extends Authenticatable implements MustVerifyEmail { - /** @use HasFactory<\Database\Factories\UserFactory> */ + /** @use HasFactory */ use HasFactory, Notifiable; /** @@ -45,4 +48,15 @@ class User extends Authenticatable 'password' => 'hashed', ]; } + + public function favourites(): BelongsToMany + { + return $this->belongsToMany(Comic::class, 'user_favourite')->withTimestamps(); + } + + public function readingHistories(): BelongsToMany + { + return $this->belongsToMany(Comic::class, 'reading_histories')->withTimestamps(); + } + } diff --git a/app/Remote/CopyManga.php b/app/Remote/CopyManga.php new file mode 100644 index 0000000..8d2eb44 --- /dev/null +++ b/app/Remote/CopyManga.php @@ -0,0 +1,336 @@ + true, + 'cachingTimeout' => 600 + ]; + + /** + * @var string API version + */ + protected string $apiVersion = "v3"; + + /** + * @var string + */ + protected string $url = "https://api.mangacopy.com/api/"; + + /** + * @var string Encryption for legacy image fetch + */ + protected string $encryptionKey = "xxxmanga.woo.key"; + + /** + * @var bool Use old method to fetch images list + */ + public bool $legacyImagesFetch = true; + + /** + * @var string User Agent for API calls + */ + protected string $userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.3 Mobile/15E148 Safari/604.1"; + + /** + * Default parameters + * + * @var array + */ + protected array $defaultParameters = [ + 'format' => 'json', + 'platform' => 1 + ]; + + /** + * @var array parameters to be used + */ + protected array $parameters = []; + + /** + * Build URL for method execute to run + * + * @param string $endpoint + * @param array $parameters + * @param bool $defaultParameters + * @return string + */ + protected function buildUrl(string $endpoint, array $parameters, bool $defaultParameters = true): string + { + // Merge parameters + if ($defaultParameters) { + $this->parameters = array_merge($this->defaultParameters, $parameters); + } else { + $this->parameters = $parameters; + } + + return $this->url . $this->apiVersion . "/" . $endpoint . "?" . http_build_query($this->parameters); + } + + /** + * Build URL for method execute to run + * + * @param string $endpoint + * @param array $parameters + * @param bool $defaultParameters + * @return string + */ + protected function legacyBuildUrl(string $endpoint, array $parameters = [], bool $defaultParameters = true): string + { + return "https://www.mangacopy.com/" . $endpoint; + } + + /** + * Write to cache + * + * @param string $url + * @param array $value + * @return void + */ + protected function writeToCache(string $url, array $value): void + { + if ($this->options['caching']) { + Cache::add("URL_{$url}", array_merge($value, ['CACHE' => [ + 'CACHE' => true, + 'CACHED_AT' => Date::now(), + 'EXPIRE_AT' => Date::now()->addSeconds($this->options['cachingTimeout'])] + ]), + $this->options['cachingTimeout']); + } + } + + /** + * Exec fetching + * + * @param string $url + * @param string $method + * @param string $userAgent + * @return mixed|string + * @throws GuzzleException + */ + protected function execute(string $url, string $method = 'GET', string $userAgent = ""): mixed + { + if ($this->options['caching']) { + // Check cache exist + if (Cache::has("URL_{$url}")) { + $cache = Cache::get("URL_{$url}"); + if (isset($cache['type']) && $cache['type'] == 'HTML') { + return $cache['response']; + } else { + return $cache; + } + } + } + + $client = new Client(['headers' => ['User-Agent' => ($userAgent === "") ? $this->userAgent : $userAgent]]); + + $options = []; + if ($method === 'OPTIONS') { + $options = ['headers' => ['Access-Control-Request-Method' => 'GET']]; + } else { + $options = ['headers' => ['platform' => '1', 'version' => '2022.10.28', 'webp' => '0', 'region' => '0', 'Accept' => 'application/json']]; + } + + $response = $client->request($method, $url, $options); + + if ($response->getStatusCode() !== 200) { + throw new Exception($response->getBody()); + } + + if ($userAgent !== "") { + // Directly send html to method to process + $html = $response->getBody()->getContents(); + $this->writeToCache($url, ['response' => $html, 'type' => 'HTML']); + + return $html; + } + + if ($method !== "OPTIONS") { + $json = json_decode($response->getBody()->getContents(), true); + + if (json_last_error() === JSON_ERROR_NONE) { + // Save to cache if needed + $this->writeToCache($url, $json['results']); + return $json['results']; + } else { + throw new Exception($json['code']); + } + } else { + return true; + } + } + + /** + * Get tags available + * + * @return mixed|string + * @throws GuzzleException + */ + public function tags() + { + $parameters['type'] = 1; // From iOS site + + $options = $this->execute($this->buildUrl("h5/filter/comic/tags", $parameters, false), 'OPTIONS'); + return $this->execute($this->buildUrl("h5/filter/comic/tags", $parameters)); + } + + /** + * Get comics + * + * @param int $limit + * @param int $offset + * @param string $top + * @param array $parameters + * @return mixed|string + * @throws Exception|GuzzleException + */ + public function comics(int $limit = 28, int $offset = 0, string $top = '', array $parameters = []): mixed + { + if (isset($parameters['theme']) && $parameters['theme'] === 'all') { + $parameters['theme'] = ""; + } + + $parameters['limit'] = $limit; + $parameters['offset'] = $offset; + $parameters['top'] = $top; + return $this->execute($this->buildUrl("comics", $parameters)); + } + + /** + * Get comic info + * + * @param string $comic + * @param array $parameters + * @return mixed|string + * @throws Exception|GuzzleException + */ + public function comic(string $comic, array $parameters = []): mixed + { + return $this->execute($this->buildUrl("comic2/{$comic}", $parameters)); + } + + /** + * Get comic chapters + * + * @param string $comic + * @param int $limit + * @param int $offset + * @param array $parameters + * @param string $group + * @return mixed|string + * @throws GuzzleException + */ + public function chapters(string $comic, int $limit = 200, int $offset = 0, array $parameters = [], string $group = "default"): mixed + { + $parameters['limit'] = $limit; + $parameters['offset'] = $offset; + $options = $this->execute($this->buildUrl("comic/{$comic}/group/{$group}/chapters", $parameters, false), 'OPTIONS'); + + return $this->execute($this->buildUrl("comic/{$comic}/group/{$group}/chapters", $parameters)); + } + + /** + * Sort images by order + * + * @param array $arrayToOrder + * @param array $keys + * @return array + */ + protected function sort(array $arrayToOrder, array $keys): array + { + $output = []; + + foreach ($keys as $key => $value) { + $output[$value] = $arrayToOrder[$key]; + } + + ksort($output); + return $output; + } + + /** + * @param string $comic + * @param string $chapter + * @return array + * @throws GuzzleException + */ + public function legacyChapter(string $comic, string $chapter): array + { + $userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"; + $responses = $this->execute($this->legacyBuildUrl("comic/{$comic}/chapter/{$chapter}"), "GET", $userAgent); + + // Get Content Key + $dom = new DOMDocument(); + $dom->loadHTML($responses); + $dataNode = $dom->getElementsByTagName("div"); + + $encryptedData = ""; + + foreach ($dataNode as $node) { + if ($node->getAttribute("class") === 'imageData') { + $encryptedData = $node->attributes->item(1)->value; + break; + } + } + + // Decrypt content + $content = $this->decrypt($encryptedData); + return json_decode($content, true); + } + + /** + * Decrypt content of AES-128-CBC + * + * @param string $payload + * @return bool|string + */ + protected function decrypt(string $payload): bool|string + { + // Decrypt content + $cipher = "AES-128-CBC"; + $ivLength = openssl_cipher_iv_length($cipher); + + $iv = substr($payload, 0, $ivLength); // First 16 char + $encryptedData = hex2bin(substr($payload, $ivLength)); // Rest of content, convert to binary + + return openssl_decrypt($encryptedData, $cipher, $this->encryptionKey, OPENSSL_RAW_DATA, $iv); + } + + /** + * Get image for specific chapter of comic + * + * @param string $comic + * @param string $chapter + * @param array $parameters + * @return array + * @throws Exception|GuzzleException + */ + public function chapter(string $comic, string $chapter, array $parameters = []): array + { + $responses = $this->execute($this->buildUrl("comic/{$comic}/chapter2/{$chapter}", $parameters)); + $responses['sorted'] = $this->sort($responses['chapter']['contents'], $responses['chapter']['words']); + + if ($this->legacyImagesFetch) { + $responses['sorted'] = $this->legacyChapter($comic, $chapter); + } + + return $responses; + } + +} diff --git a/app/Remote/ImageFetcher.php b/app/Remote/ImageFetcher.php new file mode 100644 index 0000000..f6ed4a4 --- /dev/null +++ b/app/Remote/ImageFetcher.php @@ -0,0 +1,86 @@ + [ + 'enabled' => true, + 'prefix' => 'image_fetcher_', + 'ttl' => 3600, + ], + 'http' => [ + 'timeout' => 60, + 'userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36' + ] + ]; + + public function __construct(private readonly string $url = "") + { + // Global useragent + Http::globalRequestMiddleware(fn ($request) => $request->withHeader( + 'User-Agent', $this->options['http']['userAgent'] + )); + } + + public function forget(): bool + { + if (!$this->options['cache']['enabled']) { + return false; + } + + return Cache::forget($this->cacheName($this->url)); + } + + public function getExtension(): string + { + $path = parse_url($this->url, PHP_URL_PATH); + return pathinfo($path, PATHINFO_EXTENSION); + } + + public function getMimeType(): MimeType + { + return MimeType::{$this->getExtension()}; + } + + private function cacheName(string $url): string + { + return $this->options['cache']['prefix'] . base64_encode($url); + } + + /** + * @return bool + */ + protected function isCached(): bool + { + return $this->options['cache']['enabled'] && Cache::has($this->cacheName($this->url)); + } + + /** + * @throws ConnectionException + */ + public function fetch() + { + if ($this->isCached()) { + return Cache::get($this->cacheName($this->url)); + } + + $response = Http::timeout($this->options['http']['timeout'])->get($this->url); + $image = $response->body(); + + // Write to cache + if ($this->options['cache']['enabled']) { + Cache::add($this->cacheName($this->url), $image, $this->options['cache']['ttl']); + } + + return $image; + } + +} diff --git a/bootstrap/app.php b/bootstrap/app.php index 113955b..f5a0a6b 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,21 +1,24 @@ withRouting( web: __DIR__.'/../routes/web.php', + api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { $middleware->web(append: [ - \App\Http\Middleware\HandleInertiaRequests::class, - \Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets::class, + HandleInertiaRequests::class, + AddLinkHeadersForPreloadedAssets::class, ]); - + $middleware->statefulApi(); // }) ->withExceptions(function (Exceptions $exceptions) { diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..dc9001140005f45ecc43dc0aee330f2d4581d0dc GIT binary patch literal 151983 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 aJ3HJKhtw|#15JI@KVQJ#u>CLm=l=lvwAY~k literal 0 HcmV?d00001 diff --git a/components.json b/components.json new file mode 100644 index 0000000..292c0b2 --- /dev/null +++ b/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": false, + "tailwind": { + "config": "tailwind.config.js", + "css": "resources/css/app.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/composer.json b/composer.json index b38383c..7f86f7e 100644 --- a/composer.json +++ b/composer.json @@ -7,7 +7,9 @@ "license": "MIT", "require": { "php": "^8.2", - "inertiajs/inertia-laravel": "^1.0", + "ext-dom": "*", + "ext-openssl": "*", + "inertiajs/inertia-laravel": "^2.0", "laravel/framework": "^11.31", "laravel/sanctum": "^4.0", "laravel/tinker": "^2.9", diff --git a/composer.lock b/composer.lock index f6c37e1..626661e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "74ab6cb89662a515eab3d0e8595bacf9", + "content-hash": "b63241c5adeaff665ae634a61377fcc6", "packages": [ { "name": "brick/math", @@ -445,16 +445,16 @@ }, { "name": "egulias/email-validator", - "version": "4.0.2", + "version": "4.0.3", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + "reference": "b115554301161fa21467629f1e1391c1936de517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", - "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517", + "reference": "b115554301161fa21467629f1e1391c1936de517", "shasum": "" }, "require": { @@ -500,7 +500,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + "source": "https://github.com/egulias/EmailValidator/tree/4.0.3" }, "funding": [ { @@ -508,7 +508,7 @@ "type": "github" } ], - "time": "2023-10-06T06:47:41+00:00" + "time": "2024-12-27T00:36:43+00:00" }, { "name": "fruitcake/php-cors", @@ -1056,28 +1056,29 @@ }, { "name": "inertiajs/inertia-laravel", - "version": "v1.3.2", + "version": "v2.0.0", "source": { "type": "git", "url": "https://github.com/inertiajs/inertia-laravel.git", - "reference": "7e6a030ffab315099782a4844a2175455f511c68" + "reference": "0259e37f802bc39c814c42ba92c04ada17921f70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/7e6a030ffab315099782a4844a2175455f511c68", - "reference": "7e6a030ffab315099782a4844a2175455f511c68", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/0259e37f802bc39c814c42ba92c04ada17921f70", + "reference": "0259e37f802bc39c814c42ba92c04ada17921f70", "shasum": "" }, "require": { "ext-json": "*", - "laravel/framework": "^8.74|^9.0|^10.0|^11.0", - "php": "^7.3|~8.0.0|~8.1.0|~8.2.0|~8.3.0|~8.4.0", - "symfony/console": "^5.3|^6.0|^7.0" + "laravel/framework": "^10.0|^11.0", + "php": "^8.1.0", + "symfony/console": "^6.2|^7.0" }, "require-dev": { + "laravel/pint": "^1.16", "mockery/mockery": "^1.3.3", - "orchestra/testbench": "^6.45|^7.44|^8.25|^9.3", - "phpunit/phpunit": "^8.0|^9.5.8|^10.4", + "orchestra/testbench": "^8.0|^9.2", + "phpunit/phpunit": "^10.4|^11.0", "roave/security-advisories": "dev-master" }, "suggest": { @@ -1089,9 +1090,6 @@ "providers": [ "Inertia\\ServiceProvider" ] - }, - "branch-alias": { - "dev-master": "1.x-dev" } }, "autoload": { @@ -1120,7 +1118,7 @@ ], "support": { "issues": "https://github.com/inertiajs/inertia-laravel/issues", - "source": "https://github.com/inertiajs/inertia-laravel/tree/v1.3.2" + "source": "https://github.com/inertiajs/inertia-laravel/tree/v2.0.0" }, "funding": [ { @@ -1128,20 +1126,20 @@ "type": "github" } ], - "time": "2024-12-05T14:52:50+00:00" + "time": "2024-12-13T02:48:29+00:00" }, { "name": "laravel/framework", - "version": "v11.35.1", + "version": "v11.36.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "dcfa130ede1a6fa4343dc113410963e791ad34fb" + "reference": "df06f5163f4550641fdf349ebc04916a61135a64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/dcfa130ede1a6fa4343dc113410963e791ad34fb", - "reference": "dcfa130ede1a6fa4343dc113410963e791ad34fb", + "url": "https://api.github.com/repos/laravel/framework/zipball/df06f5163f4550641fdf349ebc04916a61135a64", + "reference": "df06f5163f4550641fdf349ebc04916a61135a64", "shasum": "" }, "require": { @@ -1162,7 +1160,7 @@ "guzzlehttp/uri-template": "^1.0", "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0", "laravel/serializable-closure": "^1.3|^2.0", - "league/commonmark": "^2.2.1", + "league/commonmark": "^2.6", "league/flysystem": "^3.25.1", "league/flysystem-local": "^3.25.1", "league/uri": "^7.5.1", @@ -1177,7 +1175,7 @@ "symfony/console": "^7.0.3", "symfony/error-handler": "^7.0.3", "symfony/finder": "^7.0.3", - "symfony/http-foundation": "^7.0.3", + "symfony/http-foundation": "^7.2.0", "symfony/http-kernel": "^7.0.3", "symfony/mailer": "^7.0.3", "symfony/mime": "^7.0.3", @@ -1343,7 +1341,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-12-12T18:25:58+00:00" + "time": "2024-12-17T22:32:08+00:00" }, { "name": "laravel/prompts", @@ -1406,16 +1404,16 @@ }, { "name": "laravel/sanctum", - "version": "v4.0.6", + "version": "v4.0.7", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "9e069e36d90b1e1f41886efa0fe9800a6b354694" + "reference": "698064236a46df016e64a7eb059b1414e0b281df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/9e069e36d90b1e1f41886efa0fe9800a6b354694", - "reference": "9e069e36d90b1e1f41886efa0fe9800a6b354694", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/698064236a46df016e64a7eb059b1414e0b281df", + "reference": "698064236a46df016e64a7eb059b1414e0b281df", "shasum": "" }, "require": { @@ -1466,20 +1464,20 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2024-11-26T21:18:33+00:00" + "time": "2024-12-11T16:40:21+00:00" }, { "name": "laravel/serializable-closure", - "version": "v2.0.0", + "version": "v2.0.1", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "0d8d3d8086984996df86596a86dea60398093a81" + "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/0d8d3d8086984996df86596a86dea60398093a81", - "reference": "0d8d3d8086984996df86596a86dea60398093a81", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/613b2d4998f85564d40497e05e89cb6d9bd1cbe8", + "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8", "shasum": "" }, "require": { @@ -1527,7 +1525,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2024-11-19T01:38:44+00:00" + "time": "2024-12-16T15:26:28+00:00" }, { "name": "laravel/tinker", @@ -2251,16 +2249,16 @@ }, { "name": "nesbot/carbon", - "version": "3.8.2", + "version": "3.8.4", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "e1268cdbc486d97ce23fef2c666dc3c6b6de9947" + "reference": "129700ed449b1f02d70272d2ac802357c8c30c58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/e1268cdbc486d97ce23fef2c666dc3c6b6de9947", - "reference": "e1268cdbc486d97ce23fef2c666dc3c6b6de9947", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/129700ed449b1f02d70272d2ac802357c8c30c58", + "reference": "129700ed449b1f02d70272d2ac802357c8c30c58", "shasum": "" }, "require": { @@ -2292,10 +2290,6 @@ ], "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.x-dev", - "dev-2.x": "2.x-dev" - }, "laravel": { "providers": [ "Carbon\\Laravel\\ServiceProvider" @@ -2305,6 +2299,10 @@ "includes": [ "extension.neon" ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" } }, "autoload": { @@ -2353,7 +2351,7 @@ "type": "tidelift" } ], - "time": "2024-11-07T17:46:48+00:00" + "time": "2024-12-27T09:25:35+00:00" }, { "name": "nette/schema", @@ -3690,12 +3688,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -3913,12 +3911,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -5191,12 +5189,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -5451,12 +5449,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -5739,31 +5737,33 @@ }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "v2.2.7", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", - "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", - "php": "^5.5 || ^7.0 || ^8.0", - "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + "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.2.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { @@ -5786,9 +5786,9 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" }, - "time": "2023-12-08T13:03:43+00:00" + "time": "2024-12-21T16:25:41+00:00" }, { "name": "vlucas/phpdotenv", @@ -6453,16 +6453,16 @@ }, { "name": "laravel/breeze", - "version": "v2.2.6", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/laravel/breeze.git", - "reference": "907b12160d1b8b8213e7e2e011987fffb5567edc" + "reference": "d59702967b9ae21879df905d691a50132966c4ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/breeze/zipball/907b12160d1b8b8213e7e2e011987fffb5567edc", - "reference": "907b12160d1b8b8213e7e2e011987fffb5567edc", + "url": "https://api.github.com/repos/laravel/breeze/zipball/d59702967b9ae21879df905d691a50132966c4ff", + "reference": "d59702967b9ae21879df905d691a50132966c4ff", "shasum": "" }, "require": { @@ -6510,7 +6510,7 @@ "issues": "https://github.com/laravel/breeze/issues", "source": "https://github.com/laravel/breeze" }, - "time": "2024-11-20T15:01:15+00:00" + "time": "2024-12-14T21:21:42+00:00" }, { "name": "laravel/pail", @@ -9284,7 +9284,9 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.2" + "php": "^8.2", + "ext-dom": "*", + "ext-openssl": "*" }, "platform-dev": {}, "plugin-api-version": "2.6.0" diff --git a/config/cors.php b/config/cors.php new file mode 100644 index 0000000..8a39e6d --- /dev/null +++ b/config/cors.php @@ -0,0 +1,34 @@ + ['api/*', 'sanctum/csrf-cookie'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + +]; diff --git a/config/sanctum.php b/config/sanctum.php new file mode 100644 index 0000000..764a82f --- /dev/null +++ b/config/sanctum.php @@ -0,0 +1,83 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort() + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. This will override any values set in the token's + | "expires_at" attribute, but first-party sessions are not affected. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Token Prefix + |-------------------------------------------------------------------------- + | + | Sanctum can prefix new tokens in order to take advantage of numerous + | security scanning initiatives maintained by open source platforms + | that notify developers if they commit tokens into repositories. + | + | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning + | + */ + + 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, + 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class, + 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class, + ], + +]; diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 584104c..c4ceb07 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -2,12 +2,13 @@ namespace Database\Factories; +use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; /** - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User> + * @extends Factory */ class UserFactory extends Factory { diff --git a/database/migrations/2024_12_18_021724_create_personal_access_tokens_table.php b/database/migrations/2024_12_18_021724_create_personal_access_tokens_table.php new file mode 100644 index 0000000..e828ad8 --- /dev/null +++ b/database/migrations/2024_12_18_021724_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->string('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/database/migrations/2024_12_20_221845_create_comics_table.php b/database/migrations/2024_12_20_221845_create_comics_table.php new file mode 100644 index 0000000..4682013 --- /dev/null +++ b/database/migrations/2024_12_20_221845_create_comics_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('pathword')->unique(); + $table->uuid('uuid')->nullable(); + $table->string('name')->index(); + $table->json('alias')->nullable(); + $table->text('description')->nullable(); + $table->string('cover')->nullable(); + $table->date('upstream_updated_at'); + $table->json('metadata')->nullable(); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('comics'); + } +}; diff --git a/database/migrations/2024_12_20_231732_create_chapters_table.php b/database/migrations/2024_12_20_231732_create_chapters_table.php new file mode 100644 index 0000000..3ea1b72 --- /dev/null +++ b/database/migrations/2024_12_20_231732_create_chapters_table.php @@ -0,0 +1,26 @@ +id(); + $table->unsignedBigInteger('comic_id')->index(); + $table->uuid('chapter_uuid')->unique(); + $table->string('name'); + $table->integer('order'); + $table->date('upstream_created_at'); + $table->json('metadata'); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('chapters'); + } +}; diff --git a/database/migrations/2024_12_21_002228_create_images_table.php b/database/migrations/2024_12_21_002228_create_images_table.php new file mode 100644 index 0000000..7574548 --- /dev/null +++ b/database/migrations/2024_12_21_002228_create_images_table.php @@ -0,0 +1,25 @@ +id(); + $table->unsignedBigInteger('comic_id'); + $table->unsignedBigInteger('chapter_id'); + $table->integer('order'); + $table->text('url')->unique(); + $table->json('metadata'); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('images'); + } +}; diff --git a/database/migrations/2024_12_26_161200_create_authors_table.php b/database/migrations/2024_12_26_161200_create_authors_table.php new file mode 100644 index 0000000..ddbcfb1 --- /dev/null +++ b/database/migrations/2024_12_26_161200_create_authors_table.php @@ -0,0 +1,30 @@ +id(); + $table->string('name')->unique(); + $table->string('pathword')->nullable(); + $table->timestamps(); + }); + + Schema::create('author_comic', function (Blueprint $table) { + $table->id(); + $table->unsignedInteger('comic_id'); + $table->unsignedInteger('author_id'); + }); + } + + public function down(): void + { + Schema::dropIfExists('authors'); + Schema::dropIfExists('author_comic'); + } +}; diff --git a/database/migrations/2024_12_26_235510_create_user_favourite.php b/database/migrations/2024_12_26_235510_create_user_favourite.php new file mode 100644 index 0000000..65605a6 --- /dev/null +++ b/database/migrations/2024_12_26_235510_create_user_favourite.php @@ -0,0 +1,22 @@ +id(); + $table->unsignedBigInteger('user_id')->index(); + $table->unsignedBigInteger('comic_id')->index(); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('user_favourite'); + } +}; diff --git a/database/migrations/2024_12_27_160045_create_reading_histories_table.php b/database/migrations/2024_12_27_160045_create_reading_histories_table.php new file mode 100644 index 0000000..7ea462b --- /dev/null +++ b/database/migrations/2024_12_27_160045_create_reading_histories_table.php @@ -0,0 +1,23 @@ +id(); + $table->foreignId('comic_id'); + $table->foreignId('user_id'); + $table->foreignId('chapter_id'); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('reading_histories'); + } +}; diff --git a/jsconfig.json b/jsconfig.json index 6269354..2db132e 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "jsx": "react", "baseUrl": ".", "paths": { "@/*": ["resources/js/*"], diff --git a/package-lock.json b/package-lock.json index 38f9177..4a31837 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,27 +4,49 @@ "requires": true, "packages": { "": { + "dependencies": { + "@hookform/resolvers": "^3.9.1", + "@radix-ui/react-avatar": "^1.1.2", + "@radix-ui/react-checkbox": "^1.1.3", + "@radix-ui/react-collapsible": "^1.1.2", + "@radix-ui/react-dialog": "^1.1.4", + "@radix-ui/react-dropdown-menu": "^2.1.4", + "@radix-ui/react-label": "^2.1.1", + "@radix-ui/react-separator": "^1.1.1", + "@radix-ui/react-slot": "^1.1.1", + "@radix-ui/react-switch": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.2", + "@radix-ui/react-toast": "^1.2.4", + "@radix-ui/react-tooltip": "^1.1.6", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lodash": "^4.17.21", + "lucide-react": "^0.468.0", + "react-hook-form": "^7.54.2", + "tailwind-merge": "^2.6.0", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.24.1" + }, "devDependencies": { - "@headlessui/react": "^2.0.0", - "@inertiajs/react": "^1.0.0", - "@tailwindcss/forms": "^0.5.3", - "@vitejs/plugin-react": "^4.2.0", - "autoprefixer": "^10.4.12", - "axios": "^1.7.4", - "concurrently": "^9.0.1", - "laravel-vite-plugin": "^1.0", - "postcss": "^8.4.31", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "tailwindcss": "^3.2.1", - "vite": "^6.0" + "@headlessui/react": "^2.2.0", + "@inertiajs/react": "^2.0.0", + "@tailwindcss/forms": "^0.5.9", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.20", + "axios": "^1.7.9", + "concurrently": "^9.1.1", + "laravel-vite-plugin": "^1.1.1", + "postcss": "^8.4.49", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "tailwindcss": "^3.4.17", + "vite": "^6.0.6" } }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "engines": { "node": ">=10" }, @@ -300,9 +322,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -316,9 +338,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -332,9 +354,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -348,9 +370,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -364,9 +386,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -380,9 +402,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -396,9 +418,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -412,9 +434,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -428,9 +450,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -444,9 +466,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -460,9 +482,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -476,9 +498,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -492,9 +514,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -508,9 +530,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -524,9 +546,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -540,9 +562,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -556,9 +578,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -571,10 +593,26 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -588,9 +626,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -604,9 +642,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -620,9 +658,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -636,9 +674,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -652,9 +690,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -668,9 +706,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -687,7 +725,6 @@ "version": "1.6.8", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", - "dev": true, "dependencies": { "@floating-ui/utils": "^0.2.8" } @@ -696,7 +733,6 @@ "version": "1.6.12", "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", - "dev": true, "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.8" @@ -721,7 +757,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", - "dev": true, "dependencies": { "@floating-ui/dom": "^1.0.0" }, @@ -733,8 +768,7 @@ "node_modules/@floating-ui/utils": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", - "dev": true + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" }, "node_modules/@headlessui/react": { "version": "2.2.0", @@ -755,25 +789,32 @@ "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, + "node_modules/@hookform/resolvers": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.1.tgz", + "integrity": "sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, "node_modules/@inertiajs/core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.3.0.tgz", - "integrity": "sha512-TJ8R1eUYY473m9DaKlCPRdHTdznFWTDuy5VvEzXg3t/hohbDQedLj46yn/uAqziJPEUZJrSftZzPI2NMzL9tQA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-2.0.0.tgz", + "integrity": "sha512-2kvlk731NjwfXUku/ZoXsZNcOzx985icHtTC1dgN+8sAZtJfEg9QBrQ7sBjeLYiWtKgobJdwwpeDaexEneAtLQ==", "dev": true, "dependencies": { "axios": "^1.6.0", "deepmerge": "^4.0.0", - "nprogress": "^0.2.0", "qs": "^6.9.0" } }, "node_modules/@inertiajs/react": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@inertiajs/react/-/react-1.3.0.tgz", - "integrity": "sha512-K+PF23xP6jjMkubs8PbxT1MroSDdH1z3VTEGbO3685Xyf0QNwoNIF95hnyqJxlWaeG4fB0GAag40gh04fefRUA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inertiajs/react/-/react-2.0.0.tgz", + "integrity": "sha512-7X6TMYe7FcjG05UjRBkPYjTw/U+CrMeVDxxRolncuNYp6LmifPs1xOjTOC5M7gbpKaDEL/LuxNAX7ePJC3cbPg==", "dev": true, "dependencies": { - "@inertiajs/core": "1.3.0", + "@inertiajs/core": "2.0.0", "lodash.isequal": "^4.5.0" }, "peerDependencies": { @@ -784,7 +825,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -801,7 +841,6 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -815,7 +854,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -824,7 +862,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -832,14 +869,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -849,7 +884,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -862,7 +896,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -871,7 +904,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -884,12 +916,821 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "optional": true, "engines": { "node": ">=14" } }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.1.tgz", + "integrity": "sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.2.tgz", + "integrity": "sha512-GaC7bXQZ5VgZvVvsJ5mu/AEbjYLnhhkoidOboC50Z6FFlLA03wG2ianUoH+zgDQ31/9gCF59bE4+2bBgTyMiig==", + "dependencies": { + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.3.tgz", + "integrity": "sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.2.tgz", + "integrity": "sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A==", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.1.tgz", + "integrity": "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.4.tgz", + "integrity": "sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.3", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.3", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-slot": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "^2.6.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.3.tgz", + "integrity": "sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.4.tgz", + "integrity": "sha512-iXU1Ab5ecM+yEepGAWK8ZhMyKX4ubFdCNtol4sT9D0OVErG9PNElfx3TQhjw7n7BC5nFVz68/5//clWy+8TXzA==", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.4", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.1.tgz", + "integrity": "sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.1.tgz", + "integrity": "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.4.tgz", + "integrity": "sha512-BnOgVoL6YYdHAG6DtXONaR29Eq4nvbi8rutrV/xlr3RQCMMb3yqP85Qiw/3NReozrSW+4dfLkK+rc1hb4wPU/A==", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.3", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.1", + "@radix-ui/react-portal": "1.1.3", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-roving-focus": "1.1.1", + "@radix-ui/react-slot": "1.1.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "^2.6.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.1.tgz", + "integrity": "sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.3.tgz", + "integrity": "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.1.tgz", + "integrity": "sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.1.tgz", + "integrity": "sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.2.tgz", + "integrity": "sha512-zGukiWHjEdBCRyXvKR6iXAQG6qXm2esuAD6kDOi9Cn+1X6ev3ASo4+CsYaD6Fov9r/AQFekqnD/7+V0Cs6/98g==", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.2.tgz", + "integrity": "sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-roving-focus": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.4.tgz", + "integrity": "sha512-Sch9idFJHJTMH9YNpxxESqABcAFweJG4tKv+0zo0m5XBvUSL8FM5xKcJLFLXononpePs8IclyX1KieL5SDUNgA==", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.3", + "@radix-ui/react-portal": "1.1.3", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.6.tgz", + "integrity": "sha512-TLB5D8QLExS1uDn7+wH/bjEmRurNMTzNrtq7IjaS4kjion9NtzsTGkvR5+i7yc9q01Pi2KMM2cN3f8UG4IvvXA==", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.3", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.1", + "@radix-ui/react-portal": "1.1.3", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-slot": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz", + "integrity": "sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" + }, "node_modules/@react-aria/focus": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.19.0.tgz", @@ -1338,7 +2179,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, "engines": { "node": ">=12" }, @@ -1350,7 +2190,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1364,14 +2203,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1383,8 +2220,18 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } }, "node_modules/asynckit": { "version": "0.4.0", @@ -1443,14 +2290,12 @@ "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 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, "engines": { "node": ">=8" }, @@ -1462,7 +2307,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -1471,7 +2315,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -1511,24 +2354,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", @@ -1543,13 +2368,13 @@ } }, "node_modules/call-bound": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.2.tgz", - "integrity": "sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", "dev": true, "dependencies": { - "call-bind": "^1.0.8", - "get-intrinsic": "^1.2.5" + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -1562,7 +2387,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "engines": { "node": ">= 6" } @@ -1619,7 +2443,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -1643,7 +2466,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -1651,6 +2473,17 @@ "node": ">= 6" } }, + "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==", + "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", @@ -1727,7 +2560,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, "engines": { "node": ">=6" } @@ -1736,7 +2568,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1747,8 +2578,7 @@ "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 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -1766,15 +2596,14 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "engines": { "node": ">= 6" } }, "node_modules/concurrently": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.0.tgz", - "integrity": "sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.1.tgz", + "integrity": "sha512-6VX8lrBIycgZKTwBsWS+bLrmkGRkDmvtGsYylRN9b93CygN6CbK46HmnQ3rdSOR8HRjdahDrxb5MqD9cEFOg5Q==", "dev": true, "dependencies": { "chalk": "^4.1.2", @@ -1806,7 +2635,6 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1820,7 +2648,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -1854,23 +2681,6 @@ "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1880,25 +2690,28 @@ "node": ">=0.4.0" } }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/dunder-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", - "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "dependencies": { - "call-bind-apply-helpers": "^1.0.0", + "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" }, @@ -1909,8 +2722,7 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/electron-to-chromium": { "version": "1.5.73", @@ -1921,8 +2733,7 @@ "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/es-define-property": { "version": "1.0.1", @@ -1955,9 +2766,9 @@ } }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "bin": { @@ -1967,30 +2778,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { @@ -2006,7 +2818,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2022,7 +2833,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -2034,7 +2844,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -2043,7 +2852,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2075,7 +2883,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -2118,7 +2925,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -2132,7 +2938,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2179,11 +2984,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -2203,7 +3015,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -2241,18 +3052,6 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -2269,7 +3068,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -2281,7 +3079,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -2293,7 +3090,6 @@ "version": "2.16.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", - "dev": true, "dependencies": { "hasown": "^2.0.2" }, @@ -2308,7 +3104,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2317,7 +3112,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -2326,7 +3120,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -2338,7 +3131,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -2346,14 +3138,12 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -2368,7 +3158,6 @@ "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, "bin": { "jiti": "bin/jiti.js" } @@ -2376,8 +3165,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/jsesc": { "version": "3.1.0", @@ -2426,7 +3214,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, "engines": { "node": ">=14" }, @@ -2437,14 +3224,12 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.isequal": { "version": "4.5.0", @@ -2456,7 +3241,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -2473,10 +3257,18 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "0.468.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.468.0.tgz", + "integrity": "sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, "node_modules/math-intrinsics": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz", - "integrity": "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "engines": { "node": ">= 0.4" @@ -2486,7 +3278,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -2495,7 +3286,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -2538,7 +3328,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2553,7 +3342,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -2568,7 +3356,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -2579,7 +3366,6 @@ "version": "3.3.8", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "dev": true, "funding": [ { "type": "github", @@ -2603,7 +3389,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2617,17 +3402,10 @@ "node": ">=0.10.0" } }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "dev": true - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2636,7 +3414,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "engines": { "node": ">= 6" } @@ -2656,14 +3433,12 @@ "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -2671,14 +3446,12 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -2693,20 +3466,17 @@ "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -2718,7 +3488,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2727,7 +3496,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "engines": { "node": ">= 6" } @@ -2736,7 +3504,6 @@ "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, "funding": [ { "type": "opencollective", @@ -2764,7 +3531,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -2781,7 +3547,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -2800,7 +3565,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -2835,7 +3599,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -2860,7 +3623,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2872,8 +3634,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/proxy-from-env": { "version": "1.1.0", @@ -2900,7 +3661,6 @@ "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", @@ -2920,7 +3680,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dev": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -2932,7 +3691,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dev": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -2941,6 +3699,21 @@ "react": "^18.3.1" } }, + "node_modules/react-hook-form": { + "version": "7.54.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.2.tgz", + "integrity": "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -2950,11 +3723,76 @@ "node": ">=0.10.0" } }, + "node_modules/react-remove-scroll": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.2.tgz", + "integrity": "sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -2963,7 +3801,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -2984,7 +3821,6 @@ "version": "1.22.9", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.9.tgz", "integrity": "sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==", - "dev": true, "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -3001,7 +3837,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -3049,7 +3884,6 @@ "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", @@ -3081,7 +3915,6 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dev": true, "dependencies": { "loose-envify": "^1.1.0" } @@ -3095,28 +3928,10 @@ "semver": "bin/semver.js" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3128,7 +3943,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -3221,7 +4035,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "engines": { "node": ">=14" }, @@ -3233,7 +4046,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3242,7 +4054,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -3260,7 +4071,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3274,7 +4084,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3282,14 +4091,12 @@ "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3301,7 +4108,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3317,7 +4123,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3329,7 +4134,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3338,7 +4142,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -3375,7 +4178,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3389,11 +4191,19 @@ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", "dev": true }, + "node_modules/tailwind-merge": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", + "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { - "version": "3.4.16", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz", - "integrity": "sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==", - "dev": true, + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -3426,11 +4236,18 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "dependencies": { "any-promise": "^1.0.0" } @@ -3439,7 +4256,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -3451,7 +4267,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -3471,14 +4286,12 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "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==", - "dev": true + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/update-browserslist-db": { "version": "1.1.1", @@ -3510,19 +4323,59 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "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 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/vite": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.3.tgz", - "integrity": "sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.6.tgz", + "integrity": "sha512-NSjmUuckPmDU18bHz7QZ+bTYhRR0iA72cs2QAxCqDpafJ0S6qetco0LB3WW2OxlMHS0JmAv+yZ/R3uPmMyGTjQ==", "dev": true, "dependencies": { - "esbuild": "^0.24.0", + "esbuild": "^0.24.2", "postcss": "^8.4.49", "rollup": "^4.23.0" }, @@ -3601,7 +4454,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -3616,7 +4468,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -3634,7 +4485,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -3651,7 +4501,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3659,14 +4508,12 @@ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3680,7 +4527,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3692,7 +4538,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, "engines": { "node": ">=12" }, @@ -3719,7 +4564,6 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", - "dev": true, "bin": { "yaml": "bin.mjs" }, @@ -3794,6 +4638,14 @@ "engines": { "node": ">=8" } + }, + "node_modules/zod": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index fc22c96..5eae54c 100644 --- a/package.json +++ b/package.json @@ -6,18 +6,41 @@ "dev": "vite" }, "devDependencies": { - "@headlessui/react": "^2.0.0", - "@inertiajs/react": "^1.0.0", - "@tailwindcss/forms": "^0.5.3", - "@vitejs/plugin-react": "^4.2.0", - "autoprefixer": "^10.4.12", - "axios": "^1.7.4", - "concurrently": "^9.0.1", - "laravel-vite-plugin": "^1.0", - "postcss": "^8.4.31", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "tailwindcss": "^3.2.1", - "vite": "^6.0" + "@headlessui/react": "^2.2.0", + "@inertiajs/react": "^2.0.0", + "@tailwindcss/forms": "^0.5.9", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.20", + "axios": "^1.7.9", + "concurrently": "^9.1.1", + "laravel-vite-plugin": "^1.1.1", + "postcss": "^8.4.49", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "tailwindcss": "^3.4.17", + "vite": "^6.0.6" + }, + "dependencies": { + "@hookform/resolvers": "^3.9.1", + "@radix-ui/react-avatar": "^1.1.2", + "@radix-ui/react-checkbox": "^1.1.3", + "@radix-ui/react-collapsible": "^1.1.2", + "@radix-ui/react-dialog": "^1.1.4", + "@radix-ui/react-dropdown-menu": "^2.1.4", + "@radix-ui/react-label": "^2.1.1", + "@radix-ui/react-separator": "^1.1.1", + "@radix-ui/react-slot": "^1.1.1", + "@radix-ui/react-switch": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.2", + "@radix-ui/react-toast": "^1.2.4", + "@radix-ui/react-tooltip": "^1.1.6", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lodash": "^4.17.21", + "lucide-react": "^0.468.0", + "react-hook-form": "^7.54.2", + "tailwind-merge": "^2.6.0", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.24.1" } } diff --git a/resources/css/app.css b/resources/css/app.css index b5c61c9..2f3351a 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1,3 +1,82 @@ @tailwind base; @tailwind components; @tailwind utilities; +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem + ; + --sidebar-background: 0 0% 98%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 240 5.9% 10%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 240 4.8% 95.9%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8%} + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55% + ; + --sidebar-background: 240 5.9% 10%; + --sidebar-foreground: 240 4.8% 95.9%; + --sidebar-primary: 224.3 76.3% 48%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 240 3.7% 15.9%; + --sidebar-accent-foreground: 240 4.8% 95.9%; + --sidebar-border: 240 3.7% 15.9%; + --sidebar-ring: 217.2 91.2% 59.8%} +} +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/resources/js/Components/ThemeProvider.tsx b/resources/js/Components/ThemeProvider.tsx new file mode 100644 index 0000000..3b59c58 --- /dev/null +++ b/resources/js/Components/ThemeProvider.tsx @@ -0,0 +1,75 @@ +import { createContext, useContext, useEffect, useState } from "react" + +type Theme = "dark" | "light" | "system" + +type ThemeProviderProps = { + children: React.ReactNode + defaultTheme?: Theme + storageKey?: string +} + +type ThemeProviderState = { + theme: Theme + setTheme: (theme: Theme) => void +} + +const initialState: ThemeProviderState = { + theme: "system", + setTheme: () => null, +} + +const ThemeProviderContext = createContext(initialState) + +export function ThemeProvider({ + children, + defaultTheme = "system", + storageKey = "vite-ui-theme", + ...props + }: ThemeProviderProps) { + const [theme, setTheme] = useState( + () => (localStorage.getItem(storageKey) as Theme) || defaultTheme + ) + + useEffect(() => { + const root = window.document.documentElement + + root.classList.remove("light", "dark") + + if (theme === "system") { + const systemTheme = window.matchMedia("(prefers-color-scheme: dark)") + .matches + ? "dark" + : "light" + + root.classList.add(systemTheme) + return + } + + root.classList.add(theme) + }, [theme]) + + const value = { + theme, + setTheme: (theme: Theme) => { + console.log(storageKey) + localStorage.setItem(storageKey, theme) + setTheme(theme) + }, + } + + // @ts-ignore + return ( + + {children} + + ) +} + +export const useTheme = () => { + const context = useContext(ThemeProviderContext) + console.log(context); + if (context === undefined) + throw new Error("useTheme must be used within a ThemeProvider") + + return context +} diff --git a/resources/js/Components/ui/alert.jsx b/resources/js/Components/ui/alert.jsx new file mode 100644 index 0000000..28597e8 --- /dev/null +++ b/resources/js/Components/ui/alert.jsx @@ -0,0 +1,47 @@ +import * as React from "react" +import { cva } from "class-variance-authority"; + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7", + { + variants: { + variant: { + default: "bg-background text-foreground", + destructive: + "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +const Alert = React.forwardRef(({ className, variant, ...props }, ref) => ( +
+)) +Alert.displayName = "Alert" + +const AlertTitle = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +AlertTitle.displayName = "AlertTitle" + +const AlertDescription = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +AlertDescription.displayName = "AlertDescription" + +export { Alert, AlertTitle, AlertDescription } diff --git a/resources/js/Components/ui/app-sidebar.jsx b/resources/js/Components/ui/app-sidebar.jsx new file mode 100644 index 0000000..3dc8434 --- /dev/null +++ b/resources/js/Components/ui/app-sidebar.jsx @@ -0,0 +1,134 @@ +import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem } from '@/components/ui/sidebar'; +import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; + +import { BadgeCheck, ChevronsUpDown, Star, History, ChevronDown, LogOut, ChevronRight } from 'lucide-react'; +import { Link, usePage } from '@inertiajs/react'; +import { Avatar, AvatarFallback } from '@/components/ui/avatar'; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "@/components/ui/collapsible" + +export function AppSidebar({ auth }) { + const { tags } = usePage().props; + + const SidebarItem = (props) => { + const searchParams = new URL(window.location).searchParams; + const isActive = (!searchParams.has(props.query) && props.name === 'All') || (searchParams.has(props.query) && searchParams.get(props.query) === props.path_word); + + // To current, replace + if (searchParams.has(props.query)) { + searchParams.set(props.query, props.path_word); + } else { + searchParams.set(props.query, props.path_word); + } + + return ( + + + { props.name } + + { props.count && { props.count } } + + ); + }; + + return ( + + + + + + + Tags + + + + + + + { tags.theme.map(item => ) } + + + + + + + + + + + Region + + + + + + + { tags.top.map(item => ) } + + + + + + + + + + + + + + + { auth.user.name.slice(0, 1).toLocaleUpperCase() } + + +
+ + { auth.user.name } + +
+ +
+
+ + +
+ + + { auth.user.name.slice(0, 1).toLocaleUpperCase() } + + +
+ + { auth.user.name } + +
+
+
+ + + Profile + Favourites + History + + + Log out +
+
+
+
+
+
+ ) +} diff --git a/resources/js/Components/ui/avatar.jsx b/resources/js/Components/ui/avatar.jsx new file mode 100644 index 0000000..9a2f853 --- /dev/null +++ b/resources/js/Components/ui/avatar.jsx @@ -0,0 +1,33 @@ +import * as React from "react" +import * as AvatarPrimitive from "@radix-ui/react-avatar" + +import { cn } from "@/lib/utils" + +const Avatar = React.forwardRef(({ className, ...props }, ref) => ( + +)) +Avatar.displayName = AvatarPrimitive.Root.displayName + +const AvatarImage = React.forwardRef(({ className, ...props }, ref) => ( + +)) +AvatarImage.displayName = AvatarPrimitive.Image.displayName + +const AvatarFallback = React.forwardRef(({ className, ...props }, ref) => ( + +)) +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/resources/js/Components/ui/badge.jsx b/resources/js/Components/ui/badge.jsx new file mode 100644 index 0000000..a687eba --- /dev/null +++ b/resources/js/Components/ui/badge.jsx @@ -0,0 +1,34 @@ +import * as React from "react" +import { cva } from "class-variance-authority"; + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Badge({ + className, + variant, + ...props +}) { + return (
); +} + +export { Badge, badgeVariants } diff --git a/resources/js/Components/ui/breadcrumb.jsx b/resources/js/Components/ui/breadcrumb.jsx new file mode 100644 index 0000000..4d782a4 --- /dev/null +++ b/resources/js/Components/ui/breadcrumb.jsx @@ -0,0 +1,92 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { ChevronRight, MoreHorizontal } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Breadcrumb = React.forwardRef( + ({ ...props }, ref) =>