From 94f5cabcff7d63775e4ec54e4af63dd1fdfda94a Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Tue, 25 Feb 2025 12:15:35 +0100 Subject: [PATCH] feat: update to Laravel 12 starter kit (#1) fix: path of ScreenGeneratorCommand --- .gitignore | 1 + README.md | 3 +- README_byos-screenshot.png | Bin 0 -> 152105 bytes .../Commands/ScreenGeneratorCommand.php | 4 +- .../Auth/VerifyEmailController.php | 5 +- app/Livewire/Actions/Logout.php | 4 +- app/Livewire/DeviceDashboard.php | 13 + app/Livewire/DeviceManager.php | 6 +- app/Livewire/Forms/LoginForm.php | 72 - app/Models/User.php | 14 +- app/Utils/OneBitModifier.php | 26 - app/View/Components/AppLayout.php | 17 - app/View/Components/GuestLayout.php | 17 - bootstrap/providers.php | 1 + composer.json | 35 +- composer.lock | 605 ++--- config/database.php | 1 + config/filesystems.php | 3 - config/session.php | 2 +- ...6_create_personal_access_tokens_table.php} | 0 database/seeders/DatabaseSeeder.php | 2 +- package-lock.json | 2376 +++++++---------- package.json | 20 +- phpunit.xml | 4 +- postcss.config.js | 6 - public/.htaccess | 4 - resources/css/app.css | 73 +- resources/js/app.js | 1 - resources/js/bootstrap.js | 4 - .../views/components/action-message.blade.php | 18 +- ...logo.blade.php => app-logo-icon.blade.php} | 18 +- resources/views/components/app-logo.blade.php | 6 + .../views/components/auth-header.blade.php | 9 + .../components/auth-session-status.blade.php | 6 +- .../views/components/danger-button.blade.php | 3 - .../views/components/dropdown-link.blade.php | 1 - resources/views/components/dropdown.blade.php | 35 - .../views/components/input-error.blade.php | 9 - .../views/components/input-label.blade.php | 5 - .../views/components/layouts/app.blade.php | 5 + .../components/layouts/app/header.blade.php | 113 + .../components/layouts/app/sidebar.blade.php | 132 + .../views/components/layouts/auth.blade.php | 3 + .../components/layouts/auth/card.blade.php | 26 + .../components/layouts/auth/simple.blade.php | 22 + .../components/layouts/auth/split.blade.php | 43 + resources/views/components/modal.blade.php | 78 - resources/views/components/nav-link.blade.php | 11 - .../components/placeholder-pattern.blade.php | 12 + .../views/components/primary-button.blade.php | 3 - .../components/responsive-nav-link.blade.php | 11 - .../components/secondary-button.blade.php | 3 - .../components/settings/layout.blade.php | 20 + .../views/components/text-input.blade.php | 3 - .../views/components/text-link.blade.php | 6 + resources/views/dashboard.blade.php | 28 +- resources/views/devices.blade.php | 10 +- resources/views/devices/configure.blade.php | 83 +- .../views/flux/icon/battery-full.blade.php | 45 + .../views/flux/icon/battery-low.blade.php | 43 + .../views/flux/icon/battery-medium.blade.php | 44 + .../flux/icon/chevrons-up-down.blade.php | 43 + .../views/flux/icon/layout-grid.blade.php | 45 + .../flux/icon/square-chart-gantt.blade.php | 44 + resources/views/flux/icon/wifi-high.blade.php | 43 + resources/views/flux/icon/wifi-low.blade.php | 42 + resources/views/flux/icon/wifi-zero.blade.php | 41 + resources/views/flux/navlist/group.blade.php | 51 + resources/views/layouts/app.blade.php | 36 - resources/views/layouts/guest.blade.php | 30 - resources/views/livewire/.gitkeep | 0 .../livewire/auth/confirm-password.blade.php | 61 + .../livewire/auth/forgot-password.blade.php | 44 + resources/views/livewire/auth/login.blade.php | 116 + .../views/livewire/auth/register.blade.php | 94 + .../{pages => }/auth/reset-password.blade.php | 62 +- .../{pages => }/auth/verify-email.blade.php | 27 +- .../views/livewire/device-dashboard.blade.php | 52 + .../views/livewire/device-manager.blade.php | 208 +- .../livewire/layout/navigation.blade.php | 116 - .../pages/auth/confirm-password.blade.php | 62 - .../pages/auth/forgot-password.blade.php | 61 - .../views/livewire/pages/auth/login.blade.php | 71 - .../livewire/pages/auth/register.blade.php | 88 - .../profile/delete-user-form.blade.php | 79 - .../profile/update-password-form.blade.php | 79 - .../update-profile-information-form.blade.php | 115 - .../livewire/settings/appearance.blade.php | 19 + .../settings/delete-user-form.blade.php | 60 + .../livewire/settings/password.blade.php | 84 + .../views/livewire/settings/profile.blade.php | 117 + .../livewire/welcome/navigation.blade.php | 26 - resources/views/partials/head.blade.php | 10 + .../views/partials/settings-heading.blade.php | 5 + resources/views/profile.blade.php | 29 - resources/views/welcome.blade.php | 101 +- routes/auth.php | 20 +- routes/console.php | 6 +- routes/web.php | 20 +- tailwind.config.js | 21 - tests/Feature/Auth/AuthenticationTest.php | 57 +- tests/Feature/Auth/EmailVerificationTest.php | 5 +- .../Feature/Auth/PasswordConfirmationTest.php | 34 +- tests/Feature/Auth/PasswordResetTest.php | 33 +- tests/Feature/Auth/RegistrationTest.php | 29 +- tests/Feature/DashboardTest.php | 18 + tests/Feature/ProfileTest.php | 89 - .../{Auth => Settings}/PasswordUpdateTest.php | 28 +- tests/Feature/Settings/ProfileUpdateTest.php | 77 + vite.config.js | 13 +- 110 files changed, 3260 insertions(+), 3524 deletions(-) create mode 100644 README_byos-screenshot.png create mode 100644 app/Livewire/DeviceDashboard.php delete mode 100644 app/Livewire/Forms/LoginForm.php delete mode 100644 app/Utils/OneBitModifier.php delete mode 100644 app/View/Components/AppLayout.php delete mode 100644 app/View/Components/GuestLayout.php rename database/migrations/{2025_02_08_141911_create_personal_access_tokens_table.php => 2025_02_24_175846_create_personal_access_tokens_table.php} (100%) delete mode 100644 postcss.config.js delete mode 100644 resources/js/bootstrap.js rename resources/views/components/{application-logo.blade.php => app-logo-icon.blade.php} (74%) create mode 100644 resources/views/components/app-logo.blade.php create mode 100644 resources/views/components/auth-header.blade.php delete mode 100644 resources/views/components/danger-button.blade.php delete mode 100644 resources/views/components/dropdown-link.blade.php delete mode 100644 resources/views/components/dropdown.blade.php delete mode 100644 resources/views/components/input-error.blade.php delete mode 100644 resources/views/components/input-label.blade.php create mode 100644 resources/views/components/layouts/app.blade.php create mode 100644 resources/views/components/layouts/app/header.blade.php create mode 100644 resources/views/components/layouts/app/sidebar.blade.php create mode 100644 resources/views/components/layouts/auth.blade.php create mode 100644 resources/views/components/layouts/auth/card.blade.php create mode 100644 resources/views/components/layouts/auth/simple.blade.php create mode 100644 resources/views/components/layouts/auth/split.blade.php delete mode 100644 resources/views/components/modal.blade.php delete mode 100644 resources/views/components/nav-link.blade.php create mode 100644 resources/views/components/placeholder-pattern.blade.php delete mode 100644 resources/views/components/primary-button.blade.php delete mode 100644 resources/views/components/responsive-nav-link.blade.php delete mode 100644 resources/views/components/secondary-button.blade.php create mode 100644 resources/views/components/settings/layout.blade.php delete mode 100644 resources/views/components/text-input.blade.php create mode 100644 resources/views/components/text-link.blade.php create mode 100644 resources/views/flux/icon/battery-full.blade.php create mode 100644 resources/views/flux/icon/battery-low.blade.php create mode 100644 resources/views/flux/icon/battery-medium.blade.php create mode 100644 resources/views/flux/icon/chevrons-up-down.blade.php create mode 100644 resources/views/flux/icon/layout-grid.blade.php create mode 100644 resources/views/flux/icon/square-chart-gantt.blade.php create mode 100644 resources/views/flux/icon/wifi-high.blade.php create mode 100644 resources/views/flux/icon/wifi-low.blade.php create mode 100644 resources/views/flux/icon/wifi-zero.blade.php create mode 100644 resources/views/flux/navlist/group.blade.php delete mode 100644 resources/views/layouts/app.blade.php delete mode 100644 resources/views/layouts/guest.blade.php delete mode 100644 resources/views/livewire/.gitkeep create mode 100644 resources/views/livewire/auth/confirm-password.blade.php create mode 100644 resources/views/livewire/auth/forgot-password.blade.php create mode 100644 resources/views/livewire/auth/login.blade.php create mode 100644 resources/views/livewire/auth/register.blade.php rename resources/views/livewire/{pages => }/auth/reset-password.blade.php (59%) rename resources/views/livewire/{pages => }/auth/verify-email.blade.php (53%) create mode 100644 resources/views/livewire/device-dashboard.blade.php delete mode 100644 resources/views/livewire/layout/navigation.blade.php delete mode 100644 resources/views/livewire/pages/auth/confirm-password.blade.php delete mode 100644 resources/views/livewire/pages/auth/forgot-password.blade.php delete mode 100644 resources/views/livewire/pages/auth/login.blade.php delete mode 100644 resources/views/livewire/pages/auth/register.blade.php delete mode 100644 resources/views/livewire/profile/delete-user-form.blade.php delete mode 100644 resources/views/livewire/profile/update-password-form.blade.php delete mode 100644 resources/views/livewire/profile/update-profile-information-form.blade.php create mode 100644 resources/views/livewire/settings/appearance.blade.php create mode 100644 resources/views/livewire/settings/delete-user-form.blade.php create mode 100644 resources/views/livewire/settings/password.blade.php create mode 100644 resources/views/livewire/settings/profile.blade.php delete mode 100644 resources/views/livewire/welcome/navigation.blade.php create mode 100644 resources/views/partials/head.blade.php create mode 100644 resources/views/partials/settings-heading.blade.php delete mode 100644 resources/views/profile.blade.php delete mode 100644 tailwind.config.js create mode 100644 tests/Feature/DashboardTest.php delete mode 100644 tests/Feature/ProfileTest.php rename tests/Feature/{Auth => Settings}/PasswordUpdateTest.php (55%) create mode 100644 tests/Feature/Settings/ProfileUpdateTest.php diff --git a/.gitignore b/.gitignore index c7cf1fa..33806df 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ yarn-error.log /.nova /.vscode /.zed +/database/seeders/PersonalDeviceSeeder.php diff --git a/README.md b/README.md index 1f673cd..5ecae25 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ This is a PoC of a TRMNL server, written in Laravel. Inspired by https://github.com/usetrmnl/byos_sinatra -⚠️ Not meant for production use.️️ ⚠️ +![Screenshot](README_byos-screenshot.png) ### Requirements * PHP >= 8.2 @@ -70,6 +70,7 @@ php artisan trmnl:screen:generate ``` + ### License MIT diff --git a/README_byos-screenshot.png b/README_byos-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..1e99bfb305ce9a8ecd80c102b5a827674235fe7e GIT binary patch literal 152105 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%0D$NAk?Hb4Z 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
merge(['class' => 'text-sm text-gray-600 dark:text-gray-400']) }}> +
merge(['class' => 'text-sm text-gray-600']) }} +> {{ $slot->isEmpty() ? __('Saved.') : $slot }}
diff --git a/resources/views/components/application-logo.blade.php b/resources/views/components/app-logo-icon.blade.php similarity index 74% rename from resources/views/components/application-logo.blade.php rename to resources/views/components/app-logo-icon.blade.php index 78b9143..4b23826 100644 --- a/resources/views/components/application-logo.blade.php +++ b/resources/views/components/app-logo-icon.blade.php @@ -1,16 +1,16 @@ - + - - - - - - - + + + + + + + - + diff --git a/resources/views/components/app-logo.blade.php b/resources/views/components/app-logo.blade.php new file mode 100644 index 0000000..35c3c07 --- /dev/null +++ b/resources/views/components/app-logo.blade.php @@ -0,0 +1,6 @@ +
+ +
+
+ Laravel TRMNL Server +
diff --git a/resources/views/components/auth-header.blade.php b/resources/views/components/auth-header.blade.php new file mode 100644 index 0000000..a68f69d --- /dev/null +++ b/resources/views/components/auth-header.blade.php @@ -0,0 +1,9 @@ +@props([ + 'title', + 'description', +]) + +
+

{{ $title }}

+

{{ $description }}

+
diff --git a/resources/views/components/auth-session-status.blade.php b/resources/views/components/auth-session-status.blade.php index a39bc7d..98e0011 100644 --- a/resources/views/components/auth-session-status.blade.php +++ b/resources/views/components/auth-session-status.blade.php @@ -1,7 +1,9 @@ -@props(['status']) +@props([ + 'status', +]) @if ($status) -
merge(['class' => 'font-medium text-sm text-green-600 dark:text-green-400']) }}> +
merge(['class' => 'font-medium text-sm text-green-600']) }}> {{ $status }}
@endif diff --git a/resources/views/components/danger-button.blade.php b/resources/views/components/danger-button.blade.php deleted file mode 100644 index d7417b2..0000000 --- a/resources/views/components/danger-button.blade.php +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/resources/views/components/dropdown-link.blade.php b/resources/views/components/dropdown-link.blade.php deleted file mode 100644 index 6d5279d..0000000 --- a/resources/views/components/dropdown-link.blade.php +++ /dev/null @@ -1 +0,0 @@ -
merge(['class' => 'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-800 transition duration-150 ease-in-out']) }}>{{ $slot }} diff --git a/resources/views/components/dropdown.blade.php b/resources/views/components/dropdown.blade.php deleted file mode 100644 index e4106a4..0000000 --- a/resources/views/components/dropdown.blade.php +++ /dev/null @@ -1,35 +0,0 @@ -@props(['align' => 'right', 'width' => '48', 'contentClasses' => 'py-1 bg-white dark:bg-gray-700']) - -@php -$alignmentClasses = match ($align) { - 'left' => 'ltr:origin-top-left rtl:origin-top-right start-0', - 'top' => 'origin-top', - default => 'ltr:origin-top-right rtl:origin-top-left end-0', -}; - -$width = match ($width) { - '48' => 'w-48', - default => $width, -}; -@endphp - -
-
- {{ $trigger }} -
- - -
diff --git a/resources/views/components/input-error.blade.php b/resources/views/components/input-error.blade.php deleted file mode 100644 index ad95f6b..0000000 --- a/resources/views/components/input-error.blade.php +++ /dev/null @@ -1,9 +0,0 @@ -@props(['messages']) - -@if ($messages) -
    merge(['class' => 'text-sm text-red-600 dark:text-red-400 space-y-1']) }}> - @foreach ((array) $messages as $message) -
  • {{ $message }}
  • - @endforeach -
-@endif diff --git a/resources/views/components/input-label.blade.php b/resources/views/components/input-label.blade.php deleted file mode 100644 index e93b059..0000000 --- a/resources/views/components/input-label.blade.php +++ /dev/null @@ -1,5 +0,0 @@ -@props(['value']) - - diff --git a/resources/views/components/layouts/app.blade.php b/resources/views/components/layouts/app.blade.php new file mode 100644 index 0000000..ec0ebf7 --- /dev/null +++ b/resources/views/components/layouts/app.blade.php @@ -0,0 +1,5 @@ + + + {{ $slot }} + + diff --git a/resources/views/components/layouts/app/header.blade.php b/resources/views/components/layouts/app/header.blade.php new file mode 100644 index 0000000..bcaa805 --- /dev/null +++ b/resources/views/components/layouts/app/header.blade.php @@ -0,0 +1,113 @@ + + + + @include('partials.head') + + + + + + + + + + + + Dashboard + + + Devices + + + + + + {{-- --}} + {{-- --}} + {{-- --}} + {{-- --}} + {{-- --}} + + + + + + + +
+
+ + + {{ auth()->user()->initials() }} + + + +
+ {{ auth()->user()->name }} + {{ auth()->user()->email }} +
+
+
+
+ + + + + Settings + + + + +
+ @csrf + + {{ __('Log Out') }} + +
+
+
+
+ + + + + + + + + + + + + Dashboard + + + Devices + + + + + + + + {{-- --}} + {{-- Repository--}} + {{-- --}} + + + +{{ $slot }} + +@fluxScripts + + diff --git a/resources/views/components/layouts/app/sidebar.blade.php b/resources/views/components/layouts/app/sidebar.blade.php new file mode 100644 index 0000000..d0e913e --- /dev/null +++ b/resources/views/components/layouts/app/sidebar.blade.php @@ -0,0 +1,132 @@ + + + + @include('partials.head') + + + + + + + + + + + + Dashboard + + + + + + + + Repository + + + + Documentation + + + + + + + + + +
+
+ + + {{ auth()->user()->initials() }} + + + +
+ {{ auth()->user()->name }} + {{ auth()->user()->email }} +
+
+
+
+ + + + + Settings + + + + +
+ @csrf + + {{ __('Log Out') }} + +
+
+
+
+ + + + + + + + + + + + +
+
+ + + {{ auth()->user()->initials() }} + + + +
+ {{ auth()->user()->name }} + {{ auth()->user()->email }} +
+
+
+
+ + + + + Settings + + + + +
+ @csrf + + {{ __('Log Out') }} + +
+
+
+
+ + {{ $slot }} + + @fluxScripts + + diff --git a/resources/views/components/layouts/auth.blade.php b/resources/views/components/layouts/auth.blade.php new file mode 100644 index 0000000..4ddd14d --- /dev/null +++ b/resources/views/components/layouts/auth.blade.php @@ -0,0 +1,3 @@ + + {{ $slot }} + diff --git a/resources/views/components/layouts/auth/card.blade.php b/resources/views/components/layouts/auth/card.blade.php new file mode 100644 index 0000000..1a316ef --- /dev/null +++ b/resources/views/components/layouts/auth/card.blade.php @@ -0,0 +1,26 @@ + + + + @include('partials.head') + + + + @fluxScripts + + diff --git a/resources/views/components/layouts/auth/simple.blade.php b/resources/views/components/layouts/auth/simple.blade.php new file mode 100644 index 0000000..9dbbe92 --- /dev/null +++ b/resources/views/components/layouts/auth/simple.blade.php @@ -0,0 +1,22 @@ + + + + @include('partials.head') + + + + @fluxScripts + + diff --git a/resources/views/components/layouts/auth/split.blade.php b/resources/views/components/layouts/auth/split.blade.php new file mode 100644 index 0000000..e7b5c67 --- /dev/null +++ b/resources/views/components/layouts/auth/split.blade.php @@ -0,0 +1,43 @@ + + + + @include('partials.head') + + +
+ + +
+ @fluxScripts + + diff --git a/resources/views/components/modal.blade.php b/resources/views/components/modal.blade.php deleted file mode 100644 index 384662a..0000000 --- a/resources/views/components/modal.blade.php +++ /dev/null @@ -1,78 +0,0 @@ -@props([ - 'name', - 'show' => false, - 'maxWidth' => '2xl' -]) - -@php -$maxWidth = [ - 'sm' => 'sm:max-w-sm', - 'md' => 'sm:max-w-md', - 'lg' => 'sm:max-w-lg', - 'xl' => 'sm:max-w-xl', - '2xl' => 'sm:max-w-2xl', -][$maxWidth]; -@endphp - -
-
-
-
- -
- {{ $slot }} -
-
diff --git a/resources/views/components/nav-link.blade.php b/resources/views/components/nav-link.blade.php deleted file mode 100644 index d555914..0000000 --- a/resources/views/components/nav-link.blade.php +++ /dev/null @@ -1,11 +0,0 @@ -@props(['active']) - -@php -$classes = ($active ?? false) - ? 'inline-flex items-center px-1 pt-1 border-b-2 border-orange-400 dark:border-orange-600 text-sm font-medium leading-5 text-gray-900 dark:text-gray-100 focus:outline-none focus:border-orange-700 transition duration-150 ease-in-out' - : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 hover:border-gray-300 dark:hover:border-gray-700 focus:outline-none focus:text-gray-700 dark:focus:text-gray-300 focus:border-gray-300 dark:focus:border-gray-700 transition duration-150 ease-in-out'; -@endphp - -merge(['class' => $classes]) }}> - {{ $slot }} - diff --git a/resources/views/components/placeholder-pattern.blade.php b/resources/views/components/placeholder-pattern.blade.php new file mode 100644 index 0000000..8a434f0 --- /dev/null +++ b/resources/views/components/placeholder-pattern.blade.php @@ -0,0 +1,12 @@ +@props([ + 'id' => uniqid(), +]) + + + + + + + + + diff --git a/resources/views/components/primary-button.blade.php b/resources/views/components/primary-button.blade.php deleted file mode 100644 index 2df5c48..0000000 --- a/resources/views/components/primary-button.blade.php +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/resources/views/components/responsive-nav-link.blade.php b/resources/views/components/responsive-nav-link.blade.php deleted file mode 100644 index b39ecd2..0000000 --- a/resources/views/components/responsive-nav-link.blade.php +++ /dev/null @@ -1,11 +0,0 @@ -@props(['active']) - -@php -$classes = ($active ?? false) - ? 'block w-full ps-3 pe-4 py-2 border-l-4 border-orange-400 dark:border-orange-600 text-start text-base font-medium text-orange-700 dark:text-orange-300 bg-orange-50 dark:bg-orange-900/50 focus:outline-none focus:text-orange-800 dark:focus:text-orange-200 focus:bg-orange-100 dark:focus:bg-orange-900 focus:border-orange-700 dark:focus:border-orange-300 transition duration-150 ease-in-out' - : 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 hover:border-gray-300 dark:hover:border-gray-600 focus:outline-none focus:text-gray-800 dark:focus:text-gray-200 focus:bg-gray-50 dark:focus:bg-gray-700 focus:border-gray-300 dark:focus:border-gray-600 transition duration-150 ease-in-out'; -@endphp - -merge(['class' => $classes]) }}> - {{ $slot }} - diff --git a/resources/views/components/secondary-button.blade.php b/resources/views/components/secondary-button.blade.php deleted file mode 100644 index 4f46fe4..0000000 --- a/resources/views/components/secondary-button.blade.php +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/resources/views/components/settings/layout.blade.php b/resources/views/components/settings/layout.blade.php new file mode 100644 index 0000000..1c2a9b7 --- /dev/null +++ b/resources/views/components/settings/layout.blade.php @@ -0,0 +1,20 @@ +
+
+ + Profile + Password + Appearance + +
+ + + +
+ {{ $heading ?? '' }} + {{ $subheading ?? '' }} + +
+ {{ $slot }} +
+
+
diff --git a/resources/views/components/text-input.blade.php b/resources/views/components/text-input.blade.php deleted file mode 100644 index 4e2fe68..0000000 --- a/resources/views/components/text-input.blade.php +++ /dev/null @@ -1,3 +0,0 @@ -@props(['disabled' => false]) - -merge(['class' => 'border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-orange-500 dark:focus:border-orange-600 focus:ring-orange-500 dark:focus:ring-orange-600 rounded-md shadow-sm']) }}> diff --git a/resources/views/components/text-link.blade.php b/resources/views/components/text-link.blade.php new file mode 100644 index 0000000..445b6d5 --- /dev/null +++ b/resources/views/components/text-link.blade.php @@ -0,0 +1,6 @@ +merge(['class' => 'underline text-sm decoration-neutral-400 underline-offset-2 duration-300 ease-out hover:decoration-neutral-700 text-neutral-900 dark:text-neutral-200 dark:hover:decoration-neutral-100']) }} + wire:navigate +> + {{ $slot }} + diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 2d87b44..9985214 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -1,25 +1,5 @@ - - -

- {{ __('Dashboard') }} -

-
- -
-
-
-
- @php - $current_image_uuid = auth()->user()?->devices()?->first()?->current_screen_image; - $current_image_path = 'images/generated/' . $current_image_uuid . '.png'; - @endphp - @if($current_image_uuid) - Current Image - @else - {{ __("You're logged in!") }} - @endif -
-
-
+ +
+
- +
diff --git a/resources/views/devices.blade.php b/resources/views/devices.blade.php index 526787d..6b9fb7c 100644 --- a/resources/views/devices.blade.php +++ b/resources/views/devices.blade.php @@ -1,9 +1,3 @@ - - -

- {{ __('Devices') }} -

-
- + -
+ diff --git a/resources/views/devices/configure.blade.php b/resources/views/devices/configure.blade.php index 4be250f..44f0d66 100644 --- a/resources/views/devices/configure.blade.php +++ b/resources/views/devices/configure.blade.php @@ -1,30 +1,63 @@ - - -

- {{ __('Device Details: ') }} {{ $device->name }} -

-
+ +
+
+
+
+ @php + $current_image_uuid =$device->current_screen_image; + $current_image_path = 'images/generated/' . $current_image_uuid . '.png'; + @endphp -
-
-
-
-

Name {{ $device->name }}

-

Friendly ID {{ $device->friendly_id }}

-

Mac Address {{ $device->mac_address }}

- {{--

API Key {{ $device->api_key }}

--}} -

Refresh - Interval {{ $device->default_refresh_interval }}

-

Battery Voltage {{ $device->last_battery_voltage }} -

-

Wifi RSSI Level {{ $device->last_rssi_level }}

-

Firmware Version {{ $device->last_firmware_version }} -

+

{{ $device->name }}

+

{{$device->mac_address}}

+

Friendly Id: {{$device->friendly_id}}

+

Refresh Interval: {{$device->default_refresh_interval}}

+

Battery Voltage: {{$device->last_battery_voltage}}

+

Wifi RSSI Level: {{$device->last_rssi_level}}

+

Firmware Version: {{$device->last_firmware_version}}

+ + API Key + + + @if($current_image_uuid) + + Current Image + @endif
- @if($image) - - @endif
- + + + +{{----}} +{{-- --}} +{{--

--}} +{{-- {{ __('Device Details: ') }} {{ $device->name }}--}} +{{--

--}} +{{--
--}} + +{{--
--}} +{{--
--}} +{{--
--}} +{{--
--}} +{{--

Name {{ $device->name }}

--}} +{{--

Friendly ID {{ $device->friendly_id }}

--}} +{{--

Mac Address {{ $device->mac_address }}

--}} +{{--

API Key

--}} +{{--

Refresh--}} +{{-- Interval {{ $device->default_refresh_interval }}

--}} +{{--

Battery Voltage {{ $device->last_battery_voltage }}--}} +{{--

--}} +{{--

Wifi RSSI Level {{ $device->last_rssi_level }}

--}} +{{--

Firmware Version {{ $device->last_firmware_version }}--}} +{{--

--}} +{{--
--}} +{{-- @if($image)--}} +{{-- --}} +{{-- @endif--}} +{{--
--}} +{{--
--}} +{{--
--}} +{{--
--}} diff --git a/resources/views/flux/icon/battery-full.blade.php b/resources/views/flux/icon/battery-full.blade.php new file mode 100644 index 0000000..542d67e --- /dev/null +++ b/resources/views/flux/icon/battery-full.blade.php @@ -0,0 +1,45 @@ +{{-- Credit: Lucide (https://lucide.dev) --}} + +@props([ + 'variant' => 'outline', +]) + +@php +if ($variant === 'solid') { + throw new \Exception('The "solid" variant is not supported in Lucide.'); +} + +$classes = Flux::classes('shrink-0') + ->add(match($variant) { + 'outline' => '[:where(&)]:size-6', + 'solid' => '[:where(&)]:size-6', + 'mini' => '[:where(&)]:size-5', + 'micro' => '[:where(&)]:size-4', + }); + +$strokeWidth = match ($variant) { + 'outline' => 2, + 'mini' => 2.25, + 'micro' => 2.5, +}; +@endphp + +class($classes) }} + data-flux-icon + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="{{ $strokeWidth }}" + stroke-linecap="round" + stroke-linejoin="round" + aria-hidden="true" + data-slot="icon" +> + + + + + + diff --git a/resources/views/flux/icon/battery-low.blade.php b/resources/views/flux/icon/battery-low.blade.php new file mode 100644 index 0000000..5d379e7 --- /dev/null +++ b/resources/views/flux/icon/battery-low.blade.php @@ -0,0 +1,43 @@ +{{-- Credit: Lucide (https://lucide.dev) --}} + +@props([ + 'variant' => 'outline', +]) + +@php +if ($variant === 'solid') { + throw new \Exception('The "solid" variant is not supported in Lucide.'); +} + +$classes = Flux::classes('shrink-0') + ->add(match($variant) { + 'outline' => '[:where(&)]:size-6', + 'solid' => '[:where(&)]:size-6', + 'mini' => '[:where(&)]:size-5', + 'micro' => '[:where(&)]:size-4', + }); + +$strokeWidth = match ($variant) { + 'outline' => 2, + 'mini' => 2.25, + 'micro' => 2.5, +}; +@endphp + +class($classes) }} + data-flux-icon + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="{{ $strokeWidth }}" + stroke-linecap="round" + stroke-linejoin="round" + aria-hidden="true" + data-slot="icon" +> + + + + diff --git a/resources/views/flux/icon/battery-medium.blade.php b/resources/views/flux/icon/battery-medium.blade.php new file mode 100644 index 0000000..6bd457f --- /dev/null +++ b/resources/views/flux/icon/battery-medium.blade.php @@ -0,0 +1,44 @@ +{{-- Credit: Lucide (https://lucide.dev) --}} + +@props([ + 'variant' => 'outline', +]) + +@php +if ($variant === 'solid') { + throw new \Exception('The "solid" variant is not supported in Lucide.'); +} + +$classes = Flux::classes('shrink-0') + ->add(match($variant) { + 'outline' => '[:where(&)]:size-6', + 'solid' => '[:where(&)]:size-6', + 'mini' => '[:where(&)]:size-5', + 'micro' => '[:where(&)]:size-4', + }); + +$strokeWidth = match ($variant) { + 'outline' => 2, + 'mini' => 2.25, + 'micro' => 2.5, +}; +@endphp + +class($classes) }} + data-flux-icon + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="{{ $strokeWidth }}" + stroke-linecap="round" + stroke-linejoin="round" + aria-hidden="true" + data-slot="icon" +> + + + + + diff --git a/resources/views/flux/icon/chevrons-up-down.blade.php b/resources/views/flux/icon/chevrons-up-down.blade.php new file mode 100644 index 0000000..bf1ba2b --- /dev/null +++ b/resources/views/flux/icon/chevrons-up-down.blade.php @@ -0,0 +1,43 @@ +{{-- Credit: Lucide (https://lucide.dev) --}} + +@props([ + 'variant' => 'outline', +]) + +@php + if ($variant === 'solid') { + throw new \Exception('The "solid" variant is not supported in Lucide.'); + } + + $classes = Flux::classes('shrink-0')->add( + match ($variant) { + 'outline' => '[:where(&)]:size-6', + 'solid' => '[:where(&)]:size-6', + 'mini' => '[:where(&)]:size-5', + 'micro' => '[:where(&)]:size-4', + }, + ); + + $strokeWidth = match ($variant) { + 'outline' => 2, + 'mini' => 2.25, + 'micro' => 2.5, + }; +@endphp + +class($classes) }} + data-flux-icon + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="{{ $strokeWidth }}" + stroke-linecap="round" + stroke-linejoin="round" + aria-hidden="true" + data-slot="icon" +> + + + diff --git a/resources/views/flux/icon/layout-grid.blade.php b/resources/views/flux/icon/layout-grid.blade.php new file mode 100644 index 0000000..88c5698 --- /dev/null +++ b/resources/views/flux/icon/layout-grid.blade.php @@ -0,0 +1,45 @@ +{{-- Credit: Lucide (https://lucide.dev) --}} + +@props([ + 'variant' => 'outline', +]) + +@php + if ($variant === 'solid') { + throw new \Exception('The "solid" variant is not supported in Lucide.'); + } + + $classes = Flux::classes('shrink-0')->add( + match ($variant) { + 'outline' => '[:where(&)]:size-6', + 'solid' => '[:where(&)]:size-6', + 'mini' => '[:where(&)]:size-5', + 'micro' => '[:where(&)]:size-4', + }, + ); + + $strokeWidth = match ($variant) { + 'outline' => 2, + 'mini' => 2.25, + 'micro' => 2.5, + }; +@endphp + +class($classes) }} + data-flux-icon + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="{{ $strokeWidth }}" + stroke-linecap="round" + stroke-linejoin="round" + aria-hidden="true" + data-slot="icon" +> + + + + + diff --git a/resources/views/flux/icon/square-chart-gantt.blade.php b/resources/views/flux/icon/square-chart-gantt.blade.php new file mode 100644 index 0000000..b6b67b0 --- /dev/null +++ b/resources/views/flux/icon/square-chart-gantt.blade.php @@ -0,0 +1,44 @@ +{{-- Credit: Lucide (https://lucide.dev) --}} + +@props([ + 'variant' => 'outline', +]) + +@php +if ($variant === 'solid') { + throw new \Exception('The "solid" variant is not supported in Lucide.'); +} + +$classes = Flux::classes('shrink-0') + ->add(match($variant) { + 'outline' => '[:where(&)]:size-6', + 'solid' => '[:where(&)]:size-6', + 'mini' => '[:where(&)]:size-5', + 'micro' => '[:where(&)]:size-4', + }); + +$strokeWidth = match ($variant) { + 'outline' => 2, + 'mini' => 2.25, + 'micro' => 2.5, +}; +@endphp + +class($classes) }} + data-flux-icon + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="{{ $strokeWidth }}" + stroke-linecap="round" + stroke-linejoin="round" + aria-hidden="true" + data-slot="icon" +> + + + + + diff --git a/resources/views/flux/icon/wifi-high.blade.php b/resources/views/flux/icon/wifi-high.blade.php new file mode 100644 index 0000000..92131fa --- /dev/null +++ b/resources/views/flux/icon/wifi-high.blade.php @@ -0,0 +1,43 @@ +{{-- Credit: Lucide (https://lucide.dev) --}} + +@props([ + 'variant' => 'outline', +]) + +@php +if ($variant === 'solid') { + throw new \Exception('The "solid" variant is not supported in Lucide.'); +} + +$classes = Flux::classes('shrink-0') + ->add(match($variant) { + 'outline' => '[:where(&)]:size-6', + 'solid' => '[:where(&)]:size-6', + 'mini' => '[:where(&)]:size-5', + 'micro' => '[:where(&)]:size-4', + }); + +$strokeWidth = match ($variant) { + 'outline' => 2, + 'mini' => 2.25, + 'micro' => 2.5, +}; +@endphp + +class($classes) }} + data-flux-icon + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="{{ $strokeWidth }}" + stroke-linecap="round" + stroke-linejoin="round" + aria-hidden="true" + data-slot="icon" +> + + + + diff --git a/resources/views/flux/icon/wifi-low.blade.php b/resources/views/flux/icon/wifi-low.blade.php new file mode 100644 index 0000000..6d09251 --- /dev/null +++ b/resources/views/flux/icon/wifi-low.blade.php @@ -0,0 +1,42 @@ +{{-- Credit: Lucide (https://lucide.dev) --}} + +@props([ + 'variant' => 'outline', +]) + +@php +if ($variant === 'solid') { + throw new \Exception('The "solid" variant is not supported in Lucide.'); +} + +$classes = Flux::classes('shrink-0') + ->add(match($variant) { + 'outline' => '[:where(&)]:size-6', + 'solid' => '[:where(&)]:size-6', + 'mini' => '[:where(&)]:size-5', + 'micro' => '[:where(&)]:size-4', + }); + +$strokeWidth = match ($variant) { + 'outline' => 2, + 'mini' => 2.25, + 'micro' => 2.5, +}; +@endphp + +class($classes) }} + data-flux-icon + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="{{ $strokeWidth }}" + stroke-linecap="round" + stroke-linejoin="round" + aria-hidden="true" + data-slot="icon" +> + + + diff --git a/resources/views/flux/icon/wifi-zero.blade.php b/resources/views/flux/icon/wifi-zero.blade.php new file mode 100644 index 0000000..40423a1 --- /dev/null +++ b/resources/views/flux/icon/wifi-zero.blade.php @@ -0,0 +1,41 @@ +{{-- Credit: Lucide (https://lucide.dev) --}} + +@props([ + 'variant' => 'outline', +]) + +@php +if ($variant === 'solid') { + throw new \Exception('The "solid" variant is not supported in Lucide.'); +} + +$classes = Flux::classes('shrink-0') + ->add(match($variant) { + 'outline' => '[:where(&)]:size-6', + 'solid' => '[:where(&)]:size-6', + 'mini' => '[:where(&)]:size-5', + 'micro' => '[:where(&)]:size-4', + }); + +$strokeWidth = match ($variant) { + 'outline' => 2, + 'mini' => 2.25, + 'micro' => 2.5, +}; +@endphp + +class($classes) }} + data-flux-icon + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="{{ $strokeWidth }}" + stroke-linecap="round" + stroke-linejoin="round" + aria-hidden="true" + data-slot="icon" +> + + diff --git a/resources/views/flux/navlist/group.blade.php b/resources/views/flux/navlist/group.blade.php new file mode 100644 index 0000000..cecbabe --- /dev/null +++ b/resources/views/flux/navlist/group.blade.php @@ -0,0 +1,51 @@ +@props([ + 'expandable' => false, + 'expanded' => true, + 'heading' => null, +]) + + + +class('group/disclosure') }} + @if ($expanded === true) open @endif + data-flux-navlist-group +> + + + + + + + +
class('block space-y-[2px]') }}> +
+
{{ $heading }}
+
+ +
+ {{ $slot }} +
+
+ + + +
class('block space-y-[2px]') }}> + {{ $slot }} +
+ + diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php deleted file mode 100644 index 89c7cd5..0000000 --- a/resources/views/layouts/app.blade.php +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - {{ config('app.name', 'Laravel') }} - - - - - - - @vite(['resources/css/app.css', 'resources/js/app.js']) - - -
- - - - @if (isset($header)) -
-
- {{ $header }} -
-
- @endif - - -
- {{ $slot }} -
-
- - diff --git a/resources/views/layouts/guest.blade.php b/resources/views/layouts/guest.blade.php deleted file mode 100644 index eaa6065..0000000 --- a/resources/views/layouts/guest.blade.php +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - {{ config('app.name', 'Laravel') }} - - - - - - - @vite(['resources/css/app.css', 'resources/js/app.js']) - - -
-
- - - -
- -
- {{ $slot }} -
-
- - diff --git a/resources/views/livewire/.gitkeep b/resources/views/livewire/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/resources/views/livewire/auth/confirm-password.blade.php b/resources/views/livewire/auth/confirm-password.blade.php new file mode 100644 index 0000000..62a86d8 --- /dev/null +++ b/resources/views/livewire/auth/confirm-password.blade.php @@ -0,0 +1,61 @@ +validate([ + 'password' => ['required', 'string'], + ]); + + if (! Auth::guard('web')->validate([ + 'email' => Auth::user()->email, + 'password' => $this->password, + ])) { + throw ValidationException::withMessages([ + 'password' => __('auth.password'), + ]); + } + + session(['auth.password_confirmed_at' => time()]); + + $this->redirectIntended(default: route('dashboard', absolute: false), navigate: true); + } +}; ?> + +
+ + + + + +
+ +
+ +
+ + {{ __('Confirm') }} +
+
diff --git a/resources/views/livewire/auth/forgot-password.blade.php b/resources/views/livewire/auth/forgot-password.blade.php new file mode 100644 index 0000000..f31727b --- /dev/null +++ b/resources/views/livewire/auth/forgot-password.blade.php @@ -0,0 +1,44 @@ +validate([ + 'email' => ['required', 'string', 'email'], + ]); + + Password::sendResetLink($this->only('email')); + + session()->flash('status', __('A reset link will be sent if the account exists.')); + } +}; ?> + +
+ + + + + +
+ +
+ +
+ + {{ __('Email password reset link') }} +
+ +
+ Or, return to + log in +
+
diff --git a/resources/views/livewire/auth/login.blade.php b/resources/views/livewire/auth/login.blade.php new file mode 100644 index 0000000..2a0387b --- /dev/null +++ b/resources/views/livewire/auth/login.blade.php @@ -0,0 +1,116 @@ +validate(); + + $this->ensureIsNotRateLimited(); + + if (! Auth::attempt(['email' => $this->email, 'password' => $this->password], $this->remember)) { + RateLimiter::hit($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => __('auth.failed'), + ]); + } + + RateLimiter::clear($this->throttleKey()); + Session::regenerate(); + + $this->redirectIntended(default: route('dashboard', absolute: false), navigate: true); + } + + /** + * Ensure the authentication request is not rate limited. + */ + protected function ensureIsNotRateLimited(): void + { + if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { + return; + } + + event(new Lockout(request())); + + $seconds = RateLimiter::availableIn($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => __('auth.throttle', [ + 'seconds' => $seconds, + 'minutes' => ceil($seconds / 60), + ]), + ]); + } + + /** + * Get the authentication rate limiting throttle key. + */ + protected function throttleKey(): string + { + return Str::transliterate(Str::lower($this->email).'|'.request()->ip()); + } +}; ?> + +
+ + + + + +
+ + + + +
+ + + @if (Route::has('password.request')) + + {{ __('Forgot your password?') }} + + @endif +
+ + + + +
+ {{ __('Log in') }} +
+ + +
+ Don't have an account? + Sign up +
+
diff --git a/resources/views/livewire/auth/register.blade.php b/resources/views/livewire/auth/register.blade.php new file mode 100644 index 0000000..59964a5 --- /dev/null +++ b/resources/views/livewire/auth/register.blade.php @@ -0,0 +1,94 @@ +validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:' . User::class], + 'password' => ['required', 'string', 'confirmed', Rules\Password::defaults()], + ]); + + $validated['password'] = Hash::make($validated['password']); + + event(new Registered(($user = User::create($validated)))); + + Auth::login($user); + + $this->redirect(route('dashboard', absolute: false), navigate: true); + } +}; ?> + +
+ + + + + +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + {{ __('Create account') }} + +
+
+ +
+ Already have an account? + Log in +
+
diff --git a/resources/views/livewire/pages/auth/reset-password.blade.php b/resources/views/livewire/auth/reset-password.blade.php similarity index 59% rename from resources/views/livewire/pages/auth/reset-password.blade.php rename to resources/views/livewire/auth/reset-password.blade.php index 310a196..d7d9605 100644 --- a/resources/views/livewire/pages/auth/reset-password.blade.php +++ b/resources/views/livewire/auth/reset-password.blade.php @@ -10,8 +10,7 @@ use Livewire\Attributes\Layout; use Livewire\Attributes\Locked; use Livewire\Volt\Component; -new #[Layout('layouts.guest')] class extends Component -{ +new #[Layout('components.layouts.auth')] class extends Component { #[Locked] public string $token = ''; public string $email = ''; @@ -57,7 +56,7 @@ new #[Layout('layouts.guest')] class extends Component // If the password was successfully reset, we will redirect the user back to // the application's home authenticated view. If there is an error we can // redirect them back to where they came from with their error message. - if ($status != Password::PASSWORD_RESET) { + if ($status != Password::PasswordReset) { $this->addError('email', __($status)); return; @@ -69,37 +68,50 @@ new #[Layout('layouts.guest')] class extends Component } }; ?> -
-
+
+ + + + + + -
- - - +
+
-
- - - +
+
-
- - - - - +
+
-
- - {{ __('Reset Password') }} - +
+ + {{ __('Reset password') }} +
diff --git a/resources/views/livewire/pages/auth/verify-email.blade.php b/resources/views/livewire/auth/verify-email.blade.php similarity index 53% rename from resources/views/livewire/pages/auth/verify-email.blade.php rename to resources/views/livewire/auth/verify-email.blade.php index 92e87ba..f1ad9e0 100644 --- a/resources/views/livewire/pages/auth/verify-email.blade.php +++ b/resources/views/livewire/auth/verify-email.blade.php @@ -6,8 +6,7 @@ use Illuminate\Support\Facades\Session; use Livewire\Attributes\Layout; use Livewire\Volt\Component; -new #[Layout('layouts.guest')] class extends Component -{ +new #[Layout('components.layouts.auth')] class extends Component { /** * Send an email verification notification to the user. */ @@ -35,24 +34,28 @@ new #[Layout('layouts.guest')] class extends Component } }; ?> -
-
- {{ __('Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn\'t receive the email, we will gladly send you another.') }} +
+
+ {{ __('Please verify your email address by clicking on the link we just emailed to you.') }}
@if (session('status') == 'verification-link-sent') -
+
{{ __('A new verification link has been sent to the email address you provided during registration.') }}
@endif -
- - {{ __('Resend Verification Email') }} - +
+ + {{ __('Resend verification email') }} + -
diff --git a/resources/views/livewire/device-dashboard.blade.php b/resources/views/livewire/device-dashboard.blade.php new file mode 100644 index 0000000..2b999c9 --- /dev/null +++ b/resources/views/livewire/device-dashboard.blade.php @@ -0,0 +1,52 @@ +
+
+ @if($devices->isEmpty()) +
+
+
+

Add your first device

+ Add Device + +
+
+
+ @endif + + @foreach($devices as $device) +
+
+
+ @php + $current_image_uuid =$device->current_screen_image; + $current_image_path = 'images/generated/' . $current_image_uuid . '.png'; + @endphp + +

{{ $device->name }}

+

{{$device->mac_address}}

+ @if($current_image_uuid) + + Current Image + @endif +
+
+
+ @endforeach +
+ + {{-- @php--}} + {{-- $current_image_uuid = auth()->user()?->devices()?->first()?->current_screen_image;--}} + {{-- $current_image_path = 'images/generated/' . $current_image_uuid . '.png';--}} + {{-- @endphp--}} + {{-- @if($current_image_uuid)--}} + {{--

TRMNL Giveaway

--}} + {{--

D8:3B:DA:F3:C1:DC

--}} + {{-- --}} + {{-- Current Image--}} + {{-- @else--}} + {{--

Add your first device

--}} + {{-- Add Device--}} + {{-- @endif--}} +
diff --git a/resources/views/livewire/device-manager.blade.php b/resources/views/livewire/device-manager.blade.php index 04cfb36..3668c94 100644 --- a/resources/views/livewire/device-manager.blade.php +++ b/resources/views/livewire/device-manager.blade.php @@ -1,94 +1,124 @@
+ {{--@dump($devices)--}}
-
-
-

Devices

- {{ $showDeviceForm ? 'Cancel' : 'New Device' }} -
- - @if (session()->has('message')) -
- {{ session('message') }} -
- @endif - - @if ($showDeviceForm) -
-
-
- - - @error('name') {{ $message }} @enderror -
- -
- - - @error('mac_address') {{ $message }} @enderror -
- -
- - - @error('api_key') {{ $message }} @enderror -
- -
- - - @error('friendly_id') {{ $message }} @enderror -
- -
- - - @error('default_refresh_interval') {{ $message }} @enderror -
- - Create Device -
-
- @endif - -
- - - - - - - - - - - - @foreach ($devices as $device) - - - - - - - - @endforeach - -
NameFriendly IDMac AddressRefreshActions
{{ $device->name }}{{ $device->friendly_id }}{{ $device->mac_address }}{{ $device->default_refresh_interval }} - - View - -
-
- {{ $devices->links() }} -
-
+
+

Devices

+ + Add Device +
+ @if (session()->has('message')) +
+ {{ session('message') }} +
+ @endif + + +
+
+ Add Device +
+ +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ + Create Device +
+ +
+
+
+ + + + + + + + + + + + + + @foreach ($devices as $device) + + + + + + + + @endforeach + + + +
+
Name
+
+
Friendly ID
+
+
Mac Address
+
+
Refresh
+
+
Actions
+
+ {{ $device->name }} + + {{ $device->friendly_id }} + +
+ {{ $device->mac_address }} +
+
+ {{ $device->default_refresh_interval }} + + + +
diff --git a/resources/views/livewire/layout/navigation.blade.php b/resources/views/livewire/layout/navigation.blade.php deleted file mode 100644 index 42046e1..0000000 --- a/resources/views/livewire/layout/navigation.blade.php +++ /dev/null @@ -1,116 +0,0 @@ -redirect('/', navigate: true); - } -}; ?> - - diff --git a/resources/views/livewire/pages/auth/confirm-password.blade.php b/resources/views/livewire/pages/auth/confirm-password.blade.php deleted file mode 100644 index 1c1e310..0000000 --- a/resources/views/livewire/pages/auth/confirm-password.blade.php +++ /dev/null @@ -1,62 +0,0 @@ -validate([ - 'password' => ['required', 'string'], - ]); - - if (! Auth::guard('web')->validate([ - 'email' => Auth::user()->email, - 'password' => $this->password, - ])) { - throw ValidationException::withMessages([ - 'password' => __('auth.password'), - ]); - } - - session(['auth.password_confirmed_at' => time()]); - - $this->redirectIntended(default: route('dashboard', absolute: false), navigate: true); - } -}; ?> - -
-
- {{ __('This is a secure area of the application. Please confirm your password before continuing.') }} -
- -
- -
- - - - - -
- -
- - {{ __('Confirm') }} - -
-
-
diff --git a/resources/views/livewire/pages/auth/forgot-password.blade.php b/resources/views/livewire/pages/auth/forgot-password.blade.php deleted file mode 100644 index b804012..0000000 --- a/resources/views/livewire/pages/auth/forgot-password.blade.php +++ /dev/null @@ -1,61 +0,0 @@ -validate([ - 'email' => ['required', 'string', 'email'], - ]); - - // We will send the password reset link to this user. Once we have attempted - // to send the link, we will examine the response then see the message we - // need to show to the user. Finally, we'll send out a proper response. - $status = Password::sendResetLink( - $this->only('email') - ); - - if ($status != Password::RESET_LINK_SENT) { - $this->addError('email', __($status)); - - return; - } - - $this->reset('email'); - - session()->flash('status', __($status)); - } -}; ?> - -
-
- {{ __('Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.') }} -
- - - - -
- -
- - - -
- -
- - {{ __('Email Password Reset Link') }} - -
-
-
diff --git a/resources/views/livewire/pages/auth/login.blade.php b/resources/views/livewire/pages/auth/login.blade.php deleted file mode 100644 index 8aa3f98..0000000 --- a/resources/views/livewire/pages/auth/login.blade.php +++ /dev/null @@ -1,71 +0,0 @@ -validate(); - - $this->form->authenticate(); - - Session::regenerate(); - - $this->redirectIntended(default: route('dashboard', absolute: false), navigate: true); - } -}; ?> - -
- - - -
- -
- - - -
- - -
- - - - - -
- - -
- -
- -
- @if (Route::has('password.request')) - - {{ __('Forgot your password?') }} - - @endif - - - {{ __('Log in') }} - -
-
-
diff --git a/resources/views/livewire/pages/auth/register.blade.php b/resources/views/livewire/pages/auth/register.blade.php deleted file mode 100644 index 59ba2be..0000000 --- a/resources/views/livewire/pages/auth/register.blade.php +++ /dev/null @@ -1,88 +0,0 @@ -validate([ - 'name' => ['required', 'string', 'max:255'], - 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class], - 'password' => ['required', 'string', 'confirmed', Rules\Password::defaults()], - ]); - - $validated['password'] = Hash::make($validated['password']); - - event(new Registered($user = User::create($validated))); - - Auth::login($user); - - $this->redirect(route('dashboard', absolute: false), navigate: true); - } -}; ?> - -
-
- -
- - - -
- - -
- - - -
- - -
- - - - - -
- - -
- - - - - -
- -
- - {{ __('Already registered?') }} - - - - {{ __('Register') }} - -
-
-
diff --git a/resources/views/livewire/profile/delete-user-form.blade.php b/resources/views/livewire/profile/delete-user-form.blade.php deleted file mode 100644 index 92c9579..0000000 --- a/resources/views/livewire/profile/delete-user-form.blade.php +++ /dev/null @@ -1,79 +0,0 @@ -validate([ - 'password' => ['required', 'string', 'current_password'], - ]); - - tap(Auth::user(), $logout(...))->delete(); - - $this->redirect('/', navigate: true); - } -}; ?> - -
-
-

- {{ __('Delete Account') }} -

- -

- {{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.') }} -

-
- - {{ __('Delete Account') }} - - -
- -

- {{ __('Are you sure you want to delete your account?') }} -

- -

- {{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.') }} -

- -
- - - - - -
- -
- - {{ __('Cancel') }} - - - - {{ __('Delete Account') }} - -
-
-
-
diff --git a/resources/views/livewire/profile/update-password-form.blade.php b/resources/views/livewire/profile/update-password-form.blade.php deleted file mode 100644 index 568cf2f..0000000 --- a/resources/views/livewire/profile/update-password-form.blade.php +++ /dev/null @@ -1,79 +0,0 @@ -validate([ - 'current_password' => ['required', 'string', 'current_password'], - 'password' => ['required', 'string', Password::defaults(), 'confirmed'], - ]); - } catch (ValidationException $e) { - $this->reset('current_password', 'password', 'password_confirmation'); - - throw $e; - } - - Auth::user()->update([ - 'password' => Hash::make($validated['password']), - ]); - - $this->reset('current_password', 'password', 'password_confirmation'); - - $this->dispatch('password-updated'); - } -}; ?> - -
-
-

- {{ __('Update Password') }} -

- -

- {{ __('Ensure your account is using a long, random password to stay secure.') }} -

-
- -
-
- - - -
- -
- - - -
- -
- - - -
- -
- {{ __('Save') }} - - - {{ __('Saved.') }} - -
-
-
diff --git a/resources/views/livewire/profile/update-profile-information-form.blade.php b/resources/views/livewire/profile/update-profile-information-form.blade.php deleted file mode 100644 index 4ff4d86..0000000 --- a/resources/views/livewire/profile/update-profile-information-form.blade.php +++ /dev/null @@ -1,115 +0,0 @@ -name = Auth::user()->name; - $this->email = Auth::user()->email; - } - - /** - * Update the profile information for the currently authenticated user. - */ - public function updateProfileInformation(): void - { - $user = Auth::user(); - - $validated = $this->validate([ - 'name' => ['required', 'string', 'max:255'], - 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', Rule::unique(User::class)->ignore($user->id)], - ]); - - $user->fill($validated); - - if ($user->isDirty('email')) { - $user->email_verified_at = null; - } - - $user->save(); - - $this->dispatch('profile-updated', name: $user->name); - } - - /** - * Send an email verification notification to the current user. - */ - public function sendVerification(): void - { - $user = Auth::user(); - - if ($user->hasVerifiedEmail()) { - $this->redirectIntended(default: route('dashboard', absolute: false)); - - return; - } - - $user->sendEmailVerificationNotification(); - - Session::flash('status', 'verification-link-sent'); - } -}; ?> - -
-
-

- {{ __('Profile Information') }} -

- -

- {{ __("Update your account's profile information and email address.") }} -

-
- -
-
- - - -
- -
- - - - - @if (auth()->user() instanceof \Illuminate\Contracts\Auth\MustVerifyEmail && ! auth()->user()->hasVerifiedEmail()) -
-

- {{ __('Your email address is unverified.') }} - - -

- - @if (session('status') === 'verification-link-sent') -

- {{ __('A new verification link has been sent to your email address.') }} -

- @endif -
- @endif -
- -
- {{ __('Save') }} - - - {{ __('Saved.') }} - -
-
-
diff --git a/resources/views/livewire/settings/appearance.blade.php b/resources/views/livewire/settings/appearance.blade.php new file mode 100644 index 0000000..d485f7d --- /dev/null +++ b/resources/views/livewire/settings/appearance.blade.php @@ -0,0 +1,19 @@ + + +
+ @include('partials.settings-heading') + + + + Light + Dark + System + + +
diff --git a/resources/views/livewire/settings/delete-user-form.blade.php b/resources/views/livewire/settings/delete-user-form.blade.php new file mode 100644 index 0000000..5857be6 --- /dev/null +++ b/resources/views/livewire/settings/delete-user-form.blade.php @@ -0,0 +1,60 @@ +validate([ + 'password' => ['required', 'string', 'current_password'], + ]); + + tap(Auth::user(), $logout(...))->delete(); + + $this->redirect('/', navigate: true); + } +}; ?> + +
+
+ {{ __('Delete Account') }} + {{ __('Delete your account and all of its resources') }} +
+ + + + {{ __('Delete Account') }} + + + + +
+

+ {{ __('Are you sure you want to delete your account?') }} +

+ +

+ {{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.') }} +

+ +
+ +
+ +
+ + {{ __('Cancel') }} + + + {{ __('Delete Account') }} +
+
+
+
diff --git a/resources/views/livewire/settings/password.blade.php b/resources/views/livewire/settings/password.blade.php new file mode 100644 index 0000000..7dbd17e --- /dev/null +++ b/resources/views/livewire/settings/password.blade.php @@ -0,0 +1,84 @@ +validate([ + 'current_password' => ['required', 'string', 'current_password'], + 'password' => ['required', 'string', Password::defaults(), 'confirmed'], + ]); + } catch (ValidationException $e) { + $this->reset('current_password', 'password', 'password_confirmation'); + + throw $e; + } + + Auth::user()->update([ + 'password' => Hash::make($validated['password']), + ]); + + $this->reset('current_password', 'password', 'password_confirmation'); + + $this->dispatch('password-updated'); + } +}; ?> + +
+ @include('partials.settings-heading') + + +
+ + + + +
+
+ {{ __('Save') }} +
+ + + {{ __('Saved.') }} + +
+ +
+
diff --git a/resources/views/livewire/settings/profile.blade.php b/resources/views/livewire/settings/profile.blade.php new file mode 100644 index 0000000..f1b07c3 --- /dev/null +++ b/resources/views/livewire/settings/profile.blade.php @@ -0,0 +1,117 @@ +name = Auth::user()->name; + $this->email = Auth::user()->email; + } + + /** + * Update the profile information for the currently authenticated user. + */ + public function updateProfileInformation(): void + { + $user = Auth::user(); + + $validated = $this->validate([ + 'name' => ['required', 'string', 'max:255'], + + 'email' => [ + 'required', + 'string', + 'lowercase', + 'email', + 'max:255', + Rule::unique(User::class)->ignore($user->id) + ], + ]); + + $user->fill($validated); + + if ($user->isDirty('email')) { + $user->email_verified_at = null; + } + + $user->save(); + + $this->dispatch('profile-updated', name: $user->name); + } + + /** + * Send an email verification notification to the current user. + */ + public function resendVerificationNotification(): void + { + $user = Auth::user(); + + if ($user->hasVerifiedEmail()) { + $this->redirectIntended(default: route('dashboard', absolute: false)); + + return; + } + + $user->sendEmailVerificationNotification(); + + Session::flash('status', 'verification-link-sent'); + } +}; ?> + +
+ @include('partials.settings-heading') + + +
+ + +
+ + + @if (auth()->user() instanceof \Illuminate\Contracts\Auth\MustVerifyEmail &&! auth()->user()->hasVerifiedEmail()) +
+

+ {{ __('Your email address is unverified.') }} + + +

+ + @if (session('status') === 'verification-link-sent') +

+ {{ __('A new verification link has been sent to your email address.') }} +

+ @endif +
+ @endif +
+ +
+
+ {{ __('Save') }} +
+ + + {{ __('Saved.') }} + +
+ + + +
+
diff --git a/resources/views/livewire/welcome/navigation.blade.php b/resources/views/livewire/welcome/navigation.blade.php deleted file mode 100644 index 7d079de..0000000 --- a/resources/views/livewire/welcome/navigation.blade.php +++ /dev/null @@ -1,26 +0,0 @@ - diff --git a/resources/views/partials/head.blade.php b/resources/views/partials/head.blade.php new file mode 100644 index 0000000..848e1b5 --- /dev/null +++ b/resources/views/partials/head.blade.php @@ -0,0 +1,10 @@ + + + +{{ $title ?? 'Laravel TRMNL Server' }} + + + + +@vite(['resources/css/app.css', 'resources/js/app.js']) +@fluxAppearance diff --git a/resources/views/partials/settings-heading.blade.php b/resources/views/partials/settings-heading.blade.php new file mode 100644 index 0000000..cd175c3 --- /dev/null +++ b/resources/views/partials/settings-heading.blade.php @@ -0,0 +1,5 @@ +
+ Settings + Manage your profile and account settings + +
diff --git a/resources/views/profile.blade.php b/resources/views/profile.blade.php deleted file mode 100644 index b14bcc1..0000000 --- a/resources/views/profile.blade.php +++ /dev/null @@ -1,29 +0,0 @@ - - -

- {{ __('Profile') }} -

-
- -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index 3ac4e40..25454cd 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -1,69 +1,34 @@ - - - - - - - Laravel - - - - - - - @vite(['resources/css/app.css', 'resources/js/app.js']) - - -
-
-
-
-
- - - - - - - - - - - - - - - - -
- @if (Route::has('login')) - - @endif -
- - -
- @if(app()->environment('local')) - Laravel v{{ Illuminate\Foundation\Application::VERSION }} (PHP v{{ PHP_VERSION }}) - @endif -
-
+ +
+
-
- - +
+ @if (Route::has('login')) + + @endif +
+ diff --git a/routes/auth.php b/routes/auth.php index 71ace87..62e6352 100644 --- a/routes/auth.php +++ b/routes/auth.php @@ -5,27 +5,31 @@ use Illuminate\Support\Facades\Route; use Livewire\Volt\Volt; Route::middleware('guest')->group(function () { - // Volt::route('register', 'pages.auth.register') - // ->name('register'); - - Volt::route('login', 'pages.auth.login') + Volt::route('login', 'auth.login') ->name('login'); - Volt::route('forgot-password', 'pages.auth.forgot-password') + Volt::route('register', 'auth.register') + ->name('register'); + + Volt::route('forgot-password', 'auth.forgot-password') ->name('password.request'); - Volt::route('reset-password/{token}', 'pages.auth.reset-password') + Volt::route('reset-password/{token}', 'auth.reset-password') ->name('password.reset'); + }); Route::middleware('auth')->group(function () { - Volt::route('verify-email', 'pages.auth.verify-email') + Volt::route('verify-email', 'auth.verify-email') ->name('verification.notice'); Route::get('verify-email/{id}/{hash}', VerifyEmailController::class) ->middleware(['signed', 'throttle:6,1']) ->name('verification.verify'); - Volt::route('confirm-password', 'pages.auth.confirm-password') + Volt::route('confirm-password', 'auth.confirm-password') ->name('password.confirm'); }); + +Route::post('logout', App\Livewire\Actions\Logout::class) + ->name('logout'); diff --git a/routes/console.php b/routes/console.php index 3c9adf1..aaf16f7 100644 --- a/routes/console.php +++ b/routes/console.php @@ -3,6 +3,6 @@ use Illuminate\Foundation\Inspiring; use Illuminate\Support\Facades\Artisan; -Artisan::command('inspire', function () { - $this->comment(Inspiring::quote()); -})->purpose('Display an inspiring quote'); +//Artisan::command('inspire', function () { +// $this->comment(Inspiring::quote()); +//})->purpose('Display an inspiring quote')->hourly(); diff --git a/routes/web.php b/routes/web.php index 17a284b..e81cf05 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,30 +1,36 @@ name('home'); Route::view('dashboard', 'dashboard') ->middleware(['auth', 'verified']) ->name('dashboard'); -Route::view('profile', 'profile') - ->middleware(['auth']) - ->name('profile'); +Route::middleware(['auth'])->group(function () { + Route::redirect('settings', 'settings/profile'); + + Volt::route('settings/profile', 'settings.profile')->name('settings.profile'); + Volt::route('settings/password', 'settings.password')->name('settings.password'); + Volt::route('settings/appearance', 'settings.appearance')->name('settings.appearance'); -Route::middleware(['auth:sanctum', 'verified'])->group(function () { Route::get('/devices', function () { return view('devices'); })->name('devices'); Route::get('/devices/{device}/configure', function (App\Models\Device $device) { $current_image_uuid = auth()->user()->devices()->find($device->id)->current_screen_image; - $current_image_path = 'images/generated/'.$current_image_uuid.'.png'; + $current_image_path = 'images/generated/' . $current_image_uuid . '.png'; return view('devices.configure', compact('device'), [ 'image' => ($current_image_uuid) ? url($current_image_path) : null, ]); })->name('devices.configure'); + }); -require __DIR__.'/auth.php'; +require __DIR__ . '/auth.php'; diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index c29eb1a..0000000 --- a/tailwind.config.js +++ /dev/null @@ -1,21 +0,0 @@ -import defaultTheme from 'tailwindcss/defaultTheme'; -import forms from '@tailwindcss/forms'; - -/** @type {import('tailwindcss').Config} */ -export default { - content: [ - './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php', - './storage/framework/views/*.php', - './resources/views/**/*.blade.php', - ], - - theme: { - extend: { - fontFamily: { - sans: ['Figtree', ...defaultTheme.fontFamily.sans], - }, - }, - }, - - plugins: [forms], -}; diff --git a/tests/Feature/Auth/AuthenticationTest.php b/tests/Feature/Auth/AuthenticationTest.php index ec9910f..10df8e5 100644 --- a/tests/Feature/Auth/AuthenticationTest.php +++ b/tests/Feature/Auth/AuthenticationTest.php @@ -1,26 +1,25 @@ get('/login'); - $response - ->assertOk() - ->assertSeeVolt('pages.auth.login'); + $response->assertStatus(200); }); test('users can authenticate using the login screen', function () { $user = User::factory()->create(); - $component = Volt::test('pages.auth.login') - ->set('form.email', $user->email) - ->set('form.password', 'password'); + $response = LivewireVolt::test('auth.login') + ->set('email', $user->email) + ->set('password', 'password') + ->call('login'); - $component->call('login'); - - $component + $response ->assertHasNoErrors() ->assertRedirect(route('dashboard', absolute: false)); @@ -30,43 +29,19 @@ test('users can authenticate using the login screen', function () { test('users can not authenticate with invalid password', function () { $user = User::factory()->create(); - $component = Volt::test('pages.auth.login') - ->set('form.email', $user->email) - ->set('form.password', 'wrong-password'); - - $component->call('login'); - - $component - ->assertHasErrors() - ->assertNoRedirect(); + $this->post('/login', [ + 'email' => $user->email, + 'password' => 'wrong-password', + ]); $this->assertGuest(); }); -test('navigation menu can be rendered', function () { - $user = User::factory()->create(); - - $this->actingAs($user); - - $response = $this->get('/dashboard'); - - $response - ->assertOk() - ->assertSeeVolt('layout.navigation'); -}); - test('users can logout', function () { $user = User::factory()->create(); - $this->actingAs($user); - - $component = Volt::test('layout.navigation'); - - $component->call('logout'); - - $component - ->assertHasNoErrors() - ->assertRedirect('/'); + $response = $this->actingAs($user)->post('/logout'); $this->assertGuest(); -}); + $response->assertRedirect('/'); +}); \ No newline at end of file diff --git a/tests/Feature/Auth/EmailVerificationTest.php b/tests/Feature/Auth/EmailVerificationTest.php index f282dff..2880c6b 100644 --- a/tests/Feature/Auth/EmailVerificationTest.php +++ b/tests/Feature/Auth/EmailVerificationTest.php @@ -5,6 +5,8 @@ use Illuminate\Auth\Events\Verified; use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\URL; +uses(\Illuminate\Foundation\Testing\RefreshDatabase::class); + test('email verification screen can be rendered', function () { $user = User::factory()->unverified()->create(); @@ -27,6 +29,7 @@ test('email can be verified', function () { $response = $this->actingAs($user)->get($verificationUrl); Event::assertDispatched(Verified::class); + expect($user->fresh()->hasVerifiedEmail())->toBeTrue(); $response->assertRedirect(route('dashboard', absolute: false).'?verified=1'); }); @@ -43,4 +46,4 @@ test('email is not verified with invalid hash', function () { $this->actingAs($user)->get($verificationUrl); expect($user->fresh()->hasVerifiedEmail())->toBeFalse(); -}); +}); \ No newline at end of file diff --git a/tests/Feature/Auth/PasswordConfirmationTest.php b/tests/Feature/Auth/PasswordConfirmationTest.php index 21c28c3..ba015f6 100644 --- a/tests/Feature/Auth/PasswordConfirmationTest.php +++ b/tests/Feature/Auth/PasswordConfirmationTest.php @@ -1,18 +1,16 @@ create(); $response = $this->actingAs($user)->get('/confirm-password'); - $response - ->assertSeeVolt('pages.auth.confirm-password') - ->assertStatus(200); + $response->assertStatus(200); }); test('password can be confirmed', function () { @@ -20,14 +18,13 @@ test('password can be confirmed', function () { $this->actingAs($user); - $component = Volt::test('pages.auth.confirm-password') - ->set('password', 'password'); + $response = Volt::test('auth.confirm-password') + ->set('password', 'password') + ->call('confirmPassword'); - $component->call('confirmPassword'); - - $component - ->assertRedirect('/dashboard') - ->assertHasNoErrors(); + $response + ->assertHasNoErrors() + ->assertRedirect(route('dashboard', absolute: false)); }); test('password is not confirmed with invalid password', function () { @@ -35,12 +32,9 @@ test('password is not confirmed with invalid password', function () { $this->actingAs($user); - $component = Volt::test('pages.auth.confirm-password') - ->set('password', 'wrong-password'); + $response = Volt::test('auth.confirm-password') + ->set('password', 'wrong-password') + ->call('confirmPassword'); - $component->call('confirmPassword'); - - $component - ->assertNoRedirect() - ->assertHasErrors('password'); -}); + $response->assertHasErrors(['password']); +}); \ No newline at end of file diff --git a/tests/Feature/Auth/PasswordResetTest.php b/tests/Feature/Auth/PasswordResetTest.php index c478bce..859312d 100644 --- a/tests/Feature/Auth/PasswordResetTest.php +++ b/tests/Feature/Auth/PasswordResetTest.php @@ -1,18 +1,16 @@ get('/forgot-password'); - $response - ->assertSeeVolt('pages.auth.forgot-password') - ->assertStatus(200); + $response->assertStatus(200); }); test('reset password link can be requested', function () { @@ -20,7 +18,7 @@ test('reset password link can be requested', function () { $user = User::factory()->create(); - Volt::test('pages.auth.forgot-password') + Volt::test('auth.forgot-password') ->set('email', $user->email) ->call('sendPasswordResetLink'); @@ -32,16 +30,14 @@ test('reset password screen can be rendered', function () { $user = User::factory()->create(); - Volt::test('pages.auth.forgot-password') + Volt::test('auth.forgot-password') ->set('email', $user->email) ->call('sendPasswordResetLink'); Notification::assertSentTo($user, ResetPassword::class, function ($notification) { $response = $this->get('/reset-password/'.$notification->token); - $response - ->assertSeeVolt('pages.auth.reset-password') - ->assertStatus(200); + $response->assertStatus(200); return true; }); @@ -52,22 +48,21 @@ test('password can be reset with valid token', function () { $user = User::factory()->create(); - Volt::test('pages.auth.forgot-password') + Volt::test('auth.forgot-password') ->set('email', $user->email) ->call('sendPasswordResetLink'); Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) { - $component = Volt::test('pages.auth.reset-password', ['token' => $notification->token]) + $response = Volt::test('auth.reset-password', ['token' => $notification->token]) ->set('email', $user->email) ->set('password', 'password') - ->set('password_confirmation', 'password'); + ->set('password_confirmation', 'password') + ->call('resetPassword'); - $component->call('resetPassword'); - - $component - ->assertRedirect('/login') - ->assertHasNoErrors(); + $response + ->assertHasNoErrors() + ->assertRedirect(route('login', absolute: false)); return true; }); -}); +}); \ No newline at end of file diff --git a/tests/Feature/Auth/RegistrationTest.php b/tests/Feature/Auth/RegistrationTest.php index 3b05ed7..399e6a6 100644 --- a/tests/Feature/Auth/RegistrationTest.php +++ b/tests/Feature/Auth/RegistrationTest.php @@ -1,27 +1,26 @@ get('/register'); -// -// $response -// ->assertOk() -// ->assertSeeVolt('pages.auth.register'); -// }); +uses(\Illuminate\Foundation\Testing\RefreshDatabase::class); + +test('registration screen can be rendered', function () { + $response = $this->get('/register'); + + $response->assertStatus(200); +}); test('new users can register', function () { - $component = Volt::test('pages.auth.register') + $response = Volt::test('auth.register') ->set('name', 'Test User') ->set('email', 'test@example.com') ->set('password', 'password') - ->set('password_confirmation', 'password'); + ->set('password_confirmation', 'password') + ->call('register'); - $component->call('register'); - - $component->assertRedirect(route('dashboard', absolute: false)); + $response + ->assertHasNoErrors() + ->assertRedirect(route('dashboard', absolute: false)); $this->assertAuthenticated(); -}); +}); \ No newline at end of file diff --git a/tests/Feature/DashboardTest.php b/tests/Feature/DashboardTest.php new file mode 100644 index 0000000..26d1d03 --- /dev/null +++ b/tests/Feature/DashboardTest.php @@ -0,0 +1,18 @@ +get('/dashboard'); + $response->assertRedirect('/login'); +}); + +test('authenticated users can visit the dashboard', function () { + $user = User::factory()->create(); + $this->actingAs($user); + + $response = $this->get('/dashboard'); + $response->assertStatus(200); +}); \ No newline at end of file diff --git a/tests/Feature/ProfileTest.php b/tests/Feature/ProfileTest.php deleted file mode 100644 index 984f050..0000000 --- a/tests/Feature/ProfileTest.php +++ /dev/null @@ -1,89 +0,0 @@ -create(); - - $this->actingAs($user); - - $response = $this->get('/profile'); - - $response - ->assertOk() - ->assertSeeVolt('profile.update-profile-information-form') - ->assertSeeVolt('profile.update-password-form') - ->assertSeeVolt('profile.delete-user-form'); -}); - -test('profile information can be updated', function () { - $user = User::factory()->create(); - - $this->actingAs($user); - - $component = Volt::test('profile.update-profile-information-form') - ->set('name', 'Test User') - ->set('email', 'test@example.com') - ->call('updateProfileInformation'); - - $component - ->assertHasNoErrors() - ->assertNoRedirect(); - - $user->refresh(); - - $this->assertSame('Test User', $user->name); - $this->assertSame('test@example.com', $user->email); - $this->assertNull($user->email_verified_at); -}); - -test('email verification status is unchanged when the email address is unchanged', function () { - $user = User::factory()->create(); - - $this->actingAs($user); - - $component = Volt::test('profile.update-profile-information-form') - ->set('name', 'Test User') - ->set('email', $user->email) - ->call('updateProfileInformation'); - - $component - ->assertHasNoErrors() - ->assertNoRedirect(); - - $this->assertNotNull($user->refresh()->email_verified_at); -}); - -test('user can delete their account', function () { - $user = User::factory()->create(); - - $this->actingAs($user); - - $component = Volt::test('profile.delete-user-form') - ->set('password', 'password') - ->call('deleteUser'); - - $component - ->assertHasNoErrors() - ->assertRedirect('/'); - - $this->assertGuest(); - $this->assertNull($user->fresh()); -}); - -test('correct password must be provided to delete account', function () { - $user = User::factory()->create(); - - $this->actingAs($user); - - $component = Volt::test('profile.delete-user-form') - ->set('password', 'wrong-password') - ->call('deleteUser'); - - $component - ->assertHasErrors('password') - ->assertNoRedirect(); - - $this->assertNotNull($user->fresh()); -}); diff --git a/tests/Feature/Auth/PasswordUpdateTest.php b/tests/Feature/Settings/PasswordUpdateTest.php similarity index 55% rename from tests/Feature/Auth/PasswordUpdateTest.php rename to tests/Feature/Settings/PasswordUpdateTest.php index 33b1d4b..5cc1209 100644 --- a/tests/Feature/Auth/PasswordUpdateTest.php +++ b/tests/Feature/Settings/PasswordUpdateTest.php @@ -1,41 +1,41 @@ create(); + $user = User::factory()->create([ + 'password' => Hash::make('password'), + ]); $this->actingAs($user); - $component = Volt::test('profile.update-password-form') + $response = Volt::test('settings.password') ->set('current_password', 'password') ->set('password', 'new-password') ->set('password_confirmation', 'new-password') ->call('updatePassword'); - $component - ->assertHasNoErrors() - ->assertNoRedirect(); + $response->assertHasNoErrors(); - $this->assertTrue(Hash::check('new-password', $user->refresh()->password)); + expect(Hash::check('new-password', $user->refresh()->password))->toBeTrue(); }); test('correct password must be provided to update password', function () { - $user = User::factory()->create(); + $user = User::factory()->create([ + 'password' => Hash::make('password'), + ]); $this->actingAs($user); - $component = Volt::test('profile.update-password-form') + $response = Volt::test('settings.password') ->set('current_password', 'wrong-password') ->set('password', 'new-password') ->set('password_confirmation', 'new-password') ->call('updatePassword'); - $component - ->assertHasErrors(['current_password']) - ->assertNoRedirect(); -}); + $response->assertHasErrors(['current_password']); +}); \ No newline at end of file diff --git a/tests/Feature/Settings/ProfileUpdateTest.php b/tests/Feature/Settings/ProfileUpdateTest.php new file mode 100644 index 0000000..d876e5d --- /dev/null +++ b/tests/Feature/Settings/ProfileUpdateTest.php @@ -0,0 +1,77 @@ +actingAs($user = User::factory()->create()); + + $this->get('/settings/profile')->assertOk(); +}); + +test('profile information can be updated', function () { + $user = User::factory()->create(); + + $this->actingAs($user); + + $response = Volt::test('settings.profile') + ->set('name', 'Test User') + ->set('email', 'test@example.com') + ->call('updateProfileInformation'); + + $response->assertHasNoErrors(); + + $user->refresh(); + + expect($user->name)->toEqual('Test User'); + expect($user->email)->toEqual('test@example.com'); + expect($user->email_verified_at)->toBeNull(); +}); + +test('email verification status is unchanged when email address is unchanged', function () { + $user = User::factory()->create(); + + $this->actingAs($user); + + $response = Volt::test('settings.profile') + ->set('name', 'Test User') + ->set('email', $user->email) + ->call('updateProfileInformation'); + + $response->assertHasNoErrors(); + + expect($user->refresh()->email_verified_at)->not->toBeNull(); +}); + +test('user can delete their account', function () { + $user = User::factory()->create(); + + $this->actingAs($user); + + $response = Volt::test('settings.delete-user-form') + ->set('password', 'password') + ->call('deleteUser'); + + $response + ->assertHasNoErrors() + ->assertRedirect('/'); + + expect($user->fresh())->toBeNull(); + expect(auth()->check())->toBeFalse(); +}); + +test('correct password must be provided to delete account', function () { + $user = User::factory()->create(); + + $this->actingAs($user); + + $response = Volt::test('settings.delete-user-form') + ->set('password', 'wrong-password') + ->call('deleteUser'); + + $response->assertHasErrors(['password']); + + expect($user->fresh())->not->toBeNull(); +}); \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index 421b569..937aae1 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,11 +1,18 @@ -import { defineConfig } from 'vite'; +import { + defineConfig +} from 'vite'; import laravel from 'laravel-vite-plugin'; +import tailwindcss from "@tailwindcss/vite"; export default defineConfig({ plugins: [ laravel({ input: ['resources/css/app.css', 'resources/js/app.js'], - refresh: true, + refresh: [`resources/views/**/*`], }), + tailwindcss(), ], -}); + server: { + cors: true, + }, +}); \ No newline at end of file

*YTbytowg8 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 z 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'view'); $uuid = Uuid::uuid4()->toString(); - $pngPath = public_path('storage/images/generated/').$uuid.'.png'; - $bmpPath = public_path('storage/images/generated/').$uuid.'.bmp'; + $pngPath = Storage::disk('public')->path('/images/generated/'.$uuid.'.png'); + $bmpPath = Storage::disk('public')->path('/images/generated/'.$uuid.'.bmp'); // Generate PNG try { diff --git a/app/Http/Controllers/Auth/VerifyEmailController.php b/app/Http/Controllers/Auth/VerifyEmailController.php index 784765e..a300bfa 100644 --- a/app/Http/Controllers/Auth/VerifyEmailController.php +++ b/app/Http/Controllers/Auth/VerifyEmailController.php @@ -19,7 +19,10 @@ class VerifyEmailController extends Controller } if ($request->user()->markEmailAsVerified()) { - event(new Verified($request->user())); + /** @var \Illuminate\Contracts\Auth\MustVerifyEmail $user */ + $user = $request->user(); + + event(new Verified($user)); } return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); diff --git a/app/Livewire/Actions/Logout.php b/app/Livewire/Actions/Logout.php index 3ef481d..45993bb 100644 --- a/app/Livewire/Actions/Logout.php +++ b/app/Livewire/Actions/Logout.php @@ -10,11 +10,13 @@ class Logout /** * Log the current user out of the application. */ - public function __invoke(): void + public function __invoke() { Auth::guard('web')->logout(); Session::invalidate(); Session::regenerateToken(); + + return redirect('/'); } } diff --git a/app/Livewire/DeviceDashboard.php b/app/Livewire/DeviceDashboard.php new file mode 100644 index 0000000..78309cb --- /dev/null +++ b/app/Livewire/DeviceDashboard.php @@ -0,0 +1,13 @@ + auth()->user()->devices()->paginate(10)]); + } +} diff --git a/app/Livewire/DeviceManager.php b/app/Livewire/DeviceManager.php index 3a37588..68faf49 100644 --- a/app/Livewire/DeviceManager.php +++ b/app/Livewire/DeviceManager.php @@ -49,11 +49,7 @@ class DeviceManager extends Component ])->create(); $this->reset(); + \Flux::modal('create-device')->close(); session()->flash('message', 'Device created successfully.'); } - - public function toggleDeviceForm() - { - $this->showDeviceForm = ! $this->showDeviceForm; - } } diff --git a/app/Livewire/Forms/LoginForm.php b/app/Livewire/Forms/LoginForm.php deleted file mode 100644 index 3c20c37..0000000 --- a/app/Livewire/Forms/LoginForm.php +++ /dev/null @@ -1,72 +0,0 @@ -ensureIsNotRateLimited(); - - if (! Auth::attempt($this->only(['email', 'password']), $this->remember)) { - RateLimiter::hit($this->throttleKey()); - - throw ValidationException::withMessages([ - 'form.email' => trans('auth.failed'), - ]); - } - - RateLimiter::clear($this->throttleKey()); - } - - /** - * Ensure the authentication request is not rate limited. - */ - protected function ensureIsNotRateLimited(): void - { - if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { - return; - } - - event(new Lockout(request())); - - $seconds = RateLimiter::availableIn($this->throttleKey()); - - throw ValidationException::withMessages([ - 'form.email' => trans('auth.throttle', [ - 'seconds' => $seconds, - 'minutes' => ceil($seconds / 60), - ]), - ]); - } - - /** - * Get the authentication rate limiting throttle key. - */ - protected function throttleKey(): string - { - return Str::transliterate(Str::lower($this->email).'|'.request()->ip()); - } -} diff --git a/app/Models/User.php b/app/Models/User.php index 8f181fb..33fcc54 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -7,9 +7,10 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use Illuminate\Support\Str; use Laravel\Sanctum\HasApiTokens; -class User extends Authenticatable +class User extends Authenticatable // implements MustVerifyEmail { /** @use HasFactory<\Database\Factories\UserFactory> */ use HasApiTokens, HasFactory, Notifiable; @@ -48,6 +49,17 @@ class User extends Authenticatable ]; } + /** + * Get the user's initials + */ + public function initials(): string + { + return Str::of($this->name) + ->explode(' ') + ->map(fn (string $name) => Str::of($name)->substr(0, 1)) + ->implode(''); + } + public function devices(): HasMany { return $this->hasMany(Device::class); diff --git a/app/Utils/OneBitModifier.php b/app/Utils/OneBitModifier.php deleted file mode 100644 index c7e8d99..0000000 --- a/app/Utils/OneBitModifier.php +++ /dev/null @@ -1,26 +0,0 @@ -brightness(); - - // Convert to Black or White based on a threshold (128) - if ($brightness < 128) { - $pixel->set([0, 0, 0]); // Black - } else { - $pixel->set([255, 255, 255]); // White - } - } - - return $image; - } -} diff --git a/app/View/Components/AppLayout.php b/app/View/Components/AppLayout.php deleted file mode 100644 index de0d46f..0000000 --- a/app/View/Components/AppLayout.php +++ /dev/null @@ -1,17 +0,0 @@ -=8.2", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.2.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-12-18T14:28:33+00:00" - }, { "name": "symfony/yaml", "version": "v7.2.3", @@ -10040,7 +9851,7 @@ } ], "aliases": [], - "minimum-stability": "stable", + "minimum-stability": "dev", "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, diff --git a/config/database.php b/config/database.php index 125949e..8910562 100644 --- a/config/database.php +++ b/config/database.php @@ -148,6 +148,7 @@ return [ 'options' => [ 'cluster' => env('REDIS_CLUSTER', 'redis'), 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + 'persistent' => env('REDIS_PERSISTENT', false), ], 'default' => [ diff --git a/config/filesystems.php b/config/filesystems.php index 3d671bd..b564035 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -35,7 +35,6 @@ return [ 'root' => storage_path('app/private'), 'serve' => true, 'throw' => false, - 'report' => false, ], 'public' => [ @@ -44,7 +43,6 @@ return [ 'url' => env('APP_URL').'/storage', 'visibility' => 'public', 'throw' => false, - 'report' => false, ], 's3' => [ @@ -57,7 +55,6 @@ return [ 'endpoint' => env('AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), 'throw' => false, - 'report' => false, ], ], diff --git a/config/session.php b/config/session.php index ba0aa60..f0b6541 100644 --- a/config/session.php +++ b/config/session.php @@ -32,7 +32,7 @@ return [ | */ - 'lifetime' => (int) env('SESSION_LIFETIME', 120), + 'lifetime' => env('SESSION_LIFETIME', 120), 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), diff --git a/database/migrations/2025_02_08_141911_create_personal_access_tokens_table.php b/database/migrations/2025_02_24_175846_create_personal_access_tokens_table.php similarity index 100% rename from database/migrations/2025_02_08_141911_create_personal_access_tokens_table.php rename to database/migrations/2025_02_24_175846_create_personal_access_tokens_table.php diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index fddfbf4..0d43e89 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use App\Models\Device; use App\Models\User; // use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -20,6 +21,5 @@ class DatabaseSeeder extends Seeder 'email' => 'admin@example.com', 'password' => bcrypt('admin@example.com'), ]); - } } diff --git a/package-lock.json b/package-lock.json index 3a34bbd..9c48ba4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,29 +5,19 @@ "packages": { "": { "dependencies": { - "puppeteer": "^24.2.0" - }, - "devDependencies": { - "@tailwindcss/forms": "^0.5.2", - "autoprefixer": "^10.4.2", + "@tailwindcss/vite": "^4.0.7", + "autoprefixer": "^10.4.20", "axios": "^1.7.4", "concurrently": "^9.0.1", - "laravel-vite-plugin": "^1.2.0", - "postcss": "^8.4.31", - "tailwindcss": "^3.1.0", - "vite": "^6.0.11" - } - }, - "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" + "laravel-vite-plugin": "^1.0", + "puppeteer": "^24.3.0", + "tailwindcss": "^4.0.7", + "vite": "^6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.9.5", + "@tailwindcss/oxide-linux-x64-gnu": "^4.0.1", + "lightningcss-linux-x64-gnu": "^1.29.1" } }, "node_modules/@babel/code-frame": { @@ -60,7 +50,7 @@ "cpu": [ "ppc64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -76,7 +66,7 @@ "cpu": [ "arm" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -92,7 +82,7 @@ "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -108,7 +98,7 @@ "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -124,7 +114,7 @@ "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -140,7 +130,7 @@ "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -156,7 +146,7 @@ "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -172,7 +162,7 @@ "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -188,7 +178,7 @@ "cpu": [ "arm" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -204,7 +194,7 @@ "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -220,7 +210,7 @@ "cpu": [ "ia32" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -236,7 +226,7 @@ "cpu": [ "loong64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -252,7 +242,7 @@ "cpu": [ "mips64el" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -268,7 +258,7 @@ "cpu": [ "ppc64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -284,7 +274,7 @@ "cpu": [ "riscv64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -300,7 +290,7 @@ "cpu": [ "s390x" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -316,7 +306,7 @@ "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -332,7 +322,7 @@ "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -348,7 +338,7 @@ "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -364,7 +354,7 @@ "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -380,7 +370,7 @@ "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -396,7 +386,7 @@ "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -412,7 +402,7 @@ "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -428,7 +418,7 @@ "cpu": [ "ia32" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -444,7 +434,7 @@ "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -453,116 +443,6 @@ "node": ">=18" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@puppeteer/browsers": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.7.1.tgz", @@ -585,262 +465,474 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz", - "integrity": "sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", "cpu": [ "arm" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz", - "integrity": "sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz", - "integrity": "sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz", - "integrity": "sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz", - "integrity": "sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz", - "integrity": "sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz", - "integrity": "sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", "cpu": [ "arm" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz", - "integrity": "sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", "cpu": [ "arm" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz", - "integrity": "sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz", - "integrity": "sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz", - "integrity": "sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", "cpu": [ "loong64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz", - "integrity": "sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", "cpu": [ "ppc64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz", - "integrity": "sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", "cpu": [ "riscv64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz", - "integrity": "sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", "cpu": [ "s390x" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz", - "integrity": "sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", + "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz", - "integrity": "sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz", - "integrity": "sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", "cpu": [ "arm64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz", - "integrity": "sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", "cpu": [ "ia32" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz", - "integrity": "sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", - "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", - "dev": true, + "node_modules/@tailwindcss/node": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.8.tgz", + "integrity": "sha512-FKArQpbrbwv08TNT0k7ejYXpF+R8knZFAatNc0acOxbgeqLzwb86r+P3LGOjIeI3Idqe9CVkZrh4GlsJLJKkkw==", + "license": "MIT", "dependencies": { - "mini-svg-data-uri": "^1.2.3" + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "tailwindcss": "4.0.8" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.8.tgz", + "integrity": "sha512-KfMcuAu/Iw+DcV1e8twrFyr2yN8/ZDC/odIGta4wuuJOGkrkHZbvJvRNIbQNhGh7erZTYV6Ie0IeD6WC9Y8Hcw==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.0.8", + "@tailwindcss/oxide-darwin-arm64": "4.0.8", + "@tailwindcss/oxide-darwin-x64": "4.0.8", + "@tailwindcss/oxide-freebsd-x64": "4.0.8", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.8", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.8", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.8", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.8", + "@tailwindcss/oxide-linux-x64-musl": "4.0.8", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.8", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.8" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.8.tgz", + "integrity": "sha512-We7K79+Sm4mwJHk26Yzu/GAj7C7myemm7PeXvpgMxyxO70SSFSL3uCcqFbz9JA5M5UPkrl7N9fkBe/Y0iazqpA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.8.tgz", + "integrity": "sha512-Lv9Isi2EwkCTG1sRHNDi0uRNN1UGFdEThUAGFrydRmQZnraGLMjN8gahzg2FFnOizDl7LB2TykLUuiw833DSNg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.8.tgz", + "integrity": "sha512-fWfywfYIlSWtKoqWTjukTHLWV3ARaBRjXCC2Eo0l6KVpaqGY4c2y8snUjp1xpxUtpqwMvCvFWFaleMoz1Vhzlw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.8.tgz", + "integrity": "sha512-SO+dyvjJV9G94bnmq2288Ke0BIdvrbSbvtPLaQdqjqHR83v5L2fWADyFO+1oecHo9Owsk8MxcXh1agGVPIKIqw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.8.tgz", + "integrity": "sha512-ZSHggWiEblQNV69V0qUK5vuAtHP+I+S2eGrKGJ5lPgwgJeAd6GjLsVBN+Mqn2SPVfYM3BOpS9jX/zVg9RWQVDQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.8.tgz", + "integrity": "sha512-xWpr6M0OZLDNsr7+bQz+3X7zcnDJZJ1N9gtBWCtfhkEtDjjxYEp+Lr5L5nc/yXlL4MyCHnn0uonGVXy3fhxaVA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.8.tgz", + "integrity": "sha512-5tz2IL7LN58ssGEq7h/staD7pu/izF/KeMWdlJ86WDe2Ah46LF3ET6ZGKTr5eZMrnEA0M9cVFuSPprKRHNgjeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.8.tgz", + "integrity": "sha512-KSzMkhyrxAQyY2o194NKVKU9j/c+NFSoMvnHWFaNHKi3P1lb+Vq1UC19tLHrmxSkKapcMMu69D7+G1+FVGNDXQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.8.tgz", + "integrity": "sha512-yFYKG5UtHTRimjtqxUWXBgI4Tc6NJe3USjRIVdlTczpLRxq/SFwgzGl5JbatCxgSRDPBFwRrNPxq+ukfQFGdrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.8.tgz", + "integrity": "sha512-tndGujmCSba85cRCnQzXgpA2jx5gXimyspsUYae5jlPyLRG0RjXbDshFKOheVXU4TLflo7FSG8EHCBJ0EHTKdQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.8.tgz", + "integrity": "sha512-T77jroAc0p4EHVVgTUiNeFn6Nj3jtD3IeNId2X+0k+N1XxfNipy81BEkYErpKLiOkNhpNFjPee8/ZVas29b2OQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.8.tgz", + "integrity": "sha512-+SAq44yLzYlzyrb7QTcFCdU8Xa7FOA0jp+Xby7fPMUie+MY9HhJysM7Vp+vL8qIp8ceQJfLD+FjgJuJ4lL6nyg==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.0.8", + "@tailwindcss/oxide": "4.0.8", + "lightningcss": "^1.29.1", + "tailwindcss": "4.0.8" }, "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" + "vite": "^5.2.0 || ^6" } }, "node_modules/@tootallnate/quickjs-emscripten": { @@ -853,12 +945,12 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", - "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", + "version": "22.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz", + "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==", "license": "MIT", "optional": true, "dependencies": { @@ -885,21 +977,19 @@ } }, "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -910,31 +1000,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -957,13 +1022,12 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "license": "MIT" }, "node_modules/autoprefixer": { "version": "10.4.20", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "dev": true, "funding": [ { "type": "opencollective", @@ -978,6 +1042,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "browserslist": "^4.23.3", "caniuse-lite": "^1.0.30001646", @@ -1000,7 +1065,7 @@ "version": "1.7.9", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "dev": true, + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -1013,12 +1078,6 @@ "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", "license": "Apache-2.0" }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, "node_modules/bare-events": { "version": "2.5.4", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", @@ -1092,44 +1151,10 @@ "node": ">=10.0.0" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/browserslist": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "dev": true, "funding": [ { "type": "opencollective", @@ -1144,6 +1169,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -1166,6 +1192,19 @@ "node": "*" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1175,20 +1214,10 @@ "node": ">=6" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001698", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001698.tgz", - "integrity": "sha512-xJ3km2oiG/MbNU8G6zIq6XRZ6HtAOVXsbOrP/blGazi52kc5Yy7b6sDA5O+FbROzRrV7BSTllLHuNvmawYUJjw==", - "dev": true, + "version": "1.0.30001700", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", + "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", "funding": [ { "type": "opencollective", @@ -1202,13 +1231,14 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1224,7 +1254,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1232,46 +1262,10 @@ "node": ">=8" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/chromium-bidi": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-1.2.0.tgz", - "integrity": "sha512-XtdJ1GSN6S3l7tO7F77GhNsw0K367p0IsLYf2yZawCVAKKC3lUvDhPdMVrB2FNhmhfW43QGYbEX3Wg6q0maGwQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-2.0.0.tgz", + "integrity": "sha512-8VmyVj0ewSY4pstZV0Y3rCUUwpomam8uWgHZf1XavRxJEP4vU9/dcpNuoyB+u4AQxPo96CASXz5CHPvdH+dSeQ==", "license": "Apache-2.0", "dependencies": { "mitt": "^3.0.1", @@ -1285,6 +1279,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -1294,63 +1289,11 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/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==" - }, - "node_modules/cliui/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==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/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==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1361,13 +1304,14 @@ "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==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1375,20 +1319,11 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/concurrently": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.2.tgz", "integrity": "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==", - "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "lodash": "^4.17.21", @@ -1435,32 +1370,6 @@ } } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", @@ -1505,46 +1414,54 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/devtools-protocol": { "version": "0.0.1402036", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1402036.tgz", "integrity": "sha512-JwAYQgEvm3yD45CHB+RmF5kMbWtXBaOGwuxa87sZogHcLCv8c/IqnThaoQ1y60d7pXWjSKWQphPEc+1rAScVdg==", "license": "BSD-3-Clause" }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/electron-to-chromium": { - "version": "1.5.96", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.96.tgz", - "integrity": "sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==", - "dev": true + "version": "1.5.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz", + "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==", + "license": "ISC" }, "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 + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -1555,6 +1472,19 @@ "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -1573,12 +1503,57 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.24.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", - "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -1617,6 +1592,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -1699,43 +1675,6 @@ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", - "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -1745,29 +1684,17 @@ "pend": "~1.2.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "dev": true, "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1777,30 +1704,15 @@ } } }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "dev": true, + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -1811,7 +1723,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, + "license": "MIT", "engines": { "node": "*" }, @@ -1824,8 +1736,8 @@ "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, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1838,7 +1750,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1847,10 +1759,48 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -1880,52 +1830,65 @@ "node": ">= 14" } }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1994,99 +1957,22 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", "bin": { - "jiti": "bin/jiti.js" + "jiti": "lib/jiti-cli.mjs" } }, "node_modules/js-tokens": { @@ -2123,7 +2009,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.2.0.tgz", "integrity": "sha512-R0pJ+IcTVeqEMoKz/B2Ij57QVq3sFTABiFmb06gAwFdivbOgsUtuhX6N2MGLEArajrS3U5JbberzwOe7uXHMHQ==", - "dev": true, + "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "vite-plugin-full-reload": "^1.1.0" @@ -2138,62 +2024,269 @@ "vite": "^5.0.0 || ^6.0.0" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, + "node_modules/lightningcss": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz", + "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^1.0.3" + }, "engines": { - "node": ">=14" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/antonk52" + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.1", + "lightningcss-darwin-x64": "1.29.1", + "lightningcss-freebsd-x64": "1.29.1", + "lightningcss-linux-arm-gnueabihf": "1.29.1", + "lightningcss-linux-arm64-gnu": "1.29.1", + "lightningcss-linux-arm64-musl": "1.29.1", + "lightningcss-linux-x64-gnu": "1.29.1", + "lightningcss-linux-x64-musl": "1.29.1", + "lightningcss-win32-arm64-msvc": "1.29.1", + "lightningcss-win32-x64-msvc": "1.29.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz", + "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz", + "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz", + "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz", + "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz", + "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz", + "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz", + "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz", + "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz", + "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz", + "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/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==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "license": "MIT" }, "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">= 0.4" } }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2202,7 +2295,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -2210,39 +2303,6 @@ "node": ">= 0.6" } }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "dev": true, - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -2255,28 +2315,17 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nanoid": { "version": "3.3.8", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2297,44 +2346,17 @@ "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2345,9 +2367,9 @@ } }, "node_modules/pac-proxy-agent": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", - "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", "license": "MIT", "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", @@ -2376,12 +2398,6 @@ "node": ">= 14" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2412,37 +2428,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -2452,13 +2437,14 @@ "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -2466,29 +2452,10 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", - "dev": true, + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "funding": [ { "type": "opencollective", @@ -2503,6 +2470,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -2512,120 +2480,11 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", @@ -2655,19 +2514,11 @@ "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, "node_modules/pump": { "version": "3.0.2", @@ -2680,17 +2531,17 @@ } }, "node_modules/puppeteer": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.2.0.tgz", - "integrity": "sha512-z8vv7zPEgrilIbOo3WNvM+2mXMnyM9f4z6zdrB88Fzeuo43Oupmjrzk3EpuvuCtyK0A7Lsllfx7Z+4BvEEGJcQ==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.3.0.tgz", + "integrity": "sha512-wYEx+NnEM1T6ncHB+IsTovUgx+JlZ0pv0sRGTb8IzoTeOILvyUcdU2h34bYEQ1iG5maz1VQA5eI4kzIyAVh90A==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.7.1", - "chromium-bidi": "1.2.0", + "chromium-bidi": "2.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1402036", - "puppeteer-core": "24.2.0", + "puppeteer-core": "24.3.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -2701,91 +2552,31 @@ } }, "node_modules/puppeteer-core": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.2.0.tgz", - "integrity": "sha512-e4A4/xqWdd4kcE6QVHYhJ+Qlx/+XpgjP4d8OwBx0DJoY/nkIRhSgYmKQnv7+XSs1ofBstalt+XPGrkaz4FoXOQ==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.3.0.tgz", + "integrity": "sha512-x8kQRP/xxtiFav6wWuLzrctO0HWRpSQy+JjaHbqIl+d5U2lmRh2pY9vh5AzDFN0EtOXW2pzngi9RrryY1vZGig==", "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.7.1", - "chromium-bidi": "1.2.0", + "chromium-bidi": "2.0.0", "debug": "^4.4.0", "devtools-protocol": "0.0.1402036", "typed-query-selector": "^2.12.0", - "ws": "^8.18.0" + "ws": "^8.18.1" }, "engines": { "node": ">=18" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2795,21 +2586,11 @@ "node": ">=4" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rollup": { - "version": "4.34.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.6.tgz", - "integrity": "sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==", - "dev": true, + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", + "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", + "license": "MIT", "dependencies": { "@types/estree": "1.0.6" }, @@ -2821,56 +2602,46 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.6", - "@rollup/rollup-android-arm64": "4.34.6", - "@rollup/rollup-darwin-arm64": "4.34.6", - "@rollup/rollup-darwin-x64": "4.34.6", - "@rollup/rollup-freebsd-arm64": "4.34.6", - "@rollup/rollup-freebsd-x64": "4.34.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.6", - "@rollup/rollup-linux-arm-musleabihf": "4.34.6", - "@rollup/rollup-linux-arm64-gnu": "4.34.6", - "@rollup/rollup-linux-arm64-musl": "4.34.6", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.6", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.6", - "@rollup/rollup-linux-riscv64-gnu": "4.34.6", - "@rollup/rollup-linux-s390x-gnu": "4.34.6", - "@rollup/rollup-linux-x64-gnu": "4.34.6", - "@rollup/rollup-linux-x64-musl": "4.34.6", - "@rollup/rollup-win32-arm64-msvc": "4.34.6", - "@rollup/rollup-win32-ia32-msvc": "4.34.6", - "@rollup/rollup-win32-x64-msvc": "4.34.6", + "@rollup/rollup-android-arm-eabi": "4.34.8", + "@rollup/rollup-android-arm64": "4.34.8", + "@rollup/rollup-darwin-arm64": "4.34.8", + "@rollup/rollup-darwin-x64": "4.34.8", + "@rollup/rollup-freebsd-arm64": "4.34.8", + "@rollup/rollup-freebsd-x64": "4.34.8", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", + "@rollup/rollup-linux-arm-musleabihf": "4.34.8", + "@rollup/rollup-linux-arm64-gnu": "4.34.8", + "@rollup/rollup-linux-arm64-musl": "4.34.8", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", + "@rollup/rollup-linux-riscv64-gnu": "4.34.8", + "@rollup/rollup-linux-s390x-gnu": "4.34.8", + "@rollup/rollup-linux-x64-gnu": "4.34.8", + "@rollup/rollup-linux-x64-musl": "4.34.8", + "@rollup/rollup-win32-arm64-msvc": "4.34.8", + "@rollup/rollup-win32-ia32-msvc": "4.34.8", + "@rollup/rollup-win32-x64-msvc": "4.34.8", "fsevents": "~2.3.2" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "cpu": [ + "x64" ], - "dependencies": { - "queue-microtask": "^1.2.2" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } @@ -2887,32 +2658,11 @@ "node": ">=10" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/shell-quote": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2920,18 +2670,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -2943,9 +2681,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "license": "MIT", "dependencies": { "ip-address": "^9.0.5", @@ -2984,7 +2722,7 @@ "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, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3009,28 +2747,10 @@ } }, "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3040,54 +2760,11 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3095,42 +2772,11 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3141,53 +2787,19 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.8.tgz", + "integrity": "sha512-Me7N5CKR+D2A1xdWA5t5+kjjT7bwnxZOE6/yDI/ixJdJokszsn2n++mdU5yJwrsTpqFX2B9ZNMBJDwcqk9C9lw==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=6" } }, "node_modules/tar-fs": { @@ -3224,58 +2836,20 @@ "b4a": "^1.6.4" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, + "license": "MIT", "bin": { "tree-kill": "cli.js" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/typed-query-selector": { "version": "2.12.0", @@ -3294,7 +2868,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3309,6 +2882,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -3320,20 +2894,14 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, "node_modules/vite": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz", - "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==", - "dev": true, + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", + "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", + "license": "MIT", "dependencies": { "esbuild": "^0.24.2", - "postcss": "^8.5.1", + "postcss": "^8.5.2", "rollup": "^4.30.1" }, "bin": { @@ -3401,50 +2969,17 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", - "dev": true, + "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "picomatch": "^2.3.1" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -3457,59 +2992,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3517,9 +2999,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -3541,26 +3023,16 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } }, - "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -3578,47 +3050,11 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/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==" - }, - "node_modules/yargs/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==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/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==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -3630,9 +3066,9 @@ } }, "node_modules/zod": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", - "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 231a75f..2393cc5 100644 --- a/package.json +++ b/package.json @@ -5,17 +5,19 @@ "build": "vite build", "dev": "vite" }, - "devDependencies": { - "@tailwindcss/forms": "^0.5.2", - "autoprefixer": "^10.4.2", + "dependencies": { + "@tailwindcss/vite": "^4.0.7", + "autoprefixer": "^10.4.20", "axios": "^1.7.4", "concurrently": "^9.0.1", - "laravel-vite-plugin": "^1.2.0", - "postcss": "^8.4.31", - "tailwindcss": "^3.1.0", - "vite": "^6.0.11" + "laravel-vite-plugin": "^1.0", + "puppeteer": "^24.3.0", + "tailwindcss": "^4.0.7", + "vite": "^6.0" }, - "dependencies": { - "puppeteer": "^24.2.0" + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.9.5", + "@tailwindcss/oxide-linux-x64-gnu": "^4.0.1", + "lightningcss-linux-x64-gnu": "^1.29.1" } } diff --git a/phpunit.xml b/phpunit.xml index 506b9a3..61c031c 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -22,8 +22,8 @@ - - + + diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index 49c0612..0000000 --- a/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/public/.htaccess b/public/.htaccess index b574a59..3aec5e2 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -9,10 +9,6 @@ RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - # Handle X-XSRF-Token Header - RewriteCond %{HTTP:x-xsrf-token} . - RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] - # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ diff --git a/resources/css/app.css b/resources/css/app.css index b5c61c9..46b9ca1 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1,3 +1,70 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import 'tailwindcss'; +@import '../../vendor/livewire/flux/dist/flux.css'; + +@source "../views"; +@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; +@source '../../vendor/livewire/flux-pro/stubs/**/*.blade.php'; +@source '../../vendor/livewire/flux/stubs/**/*.blade.php'; + +@custom-variant dark (&:where(.dark, .dark *)); + +@theme { + --color-zinc-50: var(--color-neutral-50); + --color-zinc-100: var(--color-neutral-100); + --color-zinc-200: var(--color-neutral-200); + --color-zinc-300: var(--color-neutral-300); + --color-zinc-400: var(--color-neutral-400); + --color-zinc-500: var(--color-neutral-500); + --color-zinc-600: var(--color-neutral-600); + --color-zinc-700: var(--color-neutral-700); + --color-zinc-800: var(--color-neutral-800); + --color-zinc-900: var(--color-neutral-900); + --color-zinc-950: var(--color-neutral-950); +} + +@theme { + /*--color-accent: var(--color-orange-500);*/ + --color-accent: rgb(224 91 68); + --color-accent-content: var(--color-orange-600); + --color-accent-foreground: var(--color-white); +} + +@layer theme { + .dark { + /*--color-accent: var(--color-orange-400);*/ + --color-accent: rgb(224 91 68); + --color-accent-content: rgb(224 91 68); + /*--color-accent-content: var(--color-orange-400);*/ + --color-accent-foreground: var(--color-orange-950); + } +} + + +@layer base { + + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentColor); + } +} + +[data-flux-field] { + @apply grid gap-2; +} + +[data-flux-label] { + @apply !mb-0 !leading-tight; +} + +input:focus[data-flux-control], +textarea:focus[data-flux-control], +select:focus[data-flux-control] { + @apply outline-hidden ring-2 ring-accent ring-offset-2 ring-offset-accent-foreground; +} + +/* \[:where(&)\]:size-4 { + @apply size-4; +} */ diff --git a/resources/js/app.js b/resources/js/app.js index e59d6a0..e69de29 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1 +0,0 @@ -import './bootstrap'; diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js deleted file mode 100644 index 5f1390b..0000000 --- a/resources/js/bootstrap.js +++ /dev/null @@ -1,4 +0,0 @@ -import axios from 'axios'; -window.axios = axios; - -window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; diff --git a/resources/views/components/action-message.blade.php b/resources/views/components/action-message.blade.php index fe21e63..db63acf 100644 --- a/resources/views/components/action-message.blade.php +++ b/resources/views/components/action-message.blade.php @@ -1,10 +1,14 @@ -@props(['on']) +@props([ + 'on', +]) -