diff --git a/.env.example b/.env.example index f1fcbfaa..083f10d9 100644 --- a/.env.example +++ b/.env.example @@ -10,16 +10,23 @@ APP_FALLBACK_LOCALE=fr APP_PORT=8080 APP_SERVICE=laravelcm +BCRYPT_ROUNDS=12 + LOG_CHANNEL=stack LOG_STACK=single,nightwatch LOG_LEVEL=debug +LOG_SOCKET_URL=buggregator:9913 +# Ray Configuration RAY_HOST=ray@buggregator RAY_PORT=8000 +# Sentry SENTRY_LARAVEL_DSN=http://sentry@buggregator:8000/1 SENTRY_TRACES_SAMPLE_RATE=1.0 +#Var Dumper VAR_DUMPER_FORMAT=server VAR_DUMPER_SERVER=tcp://buggregator:9912 +# Inspector INSPECTOR_URL=http://inspector@buggregator:8000 INSPECTOR_API_KEY=test INSPECTOR_INGESTION_KEY=1test @@ -34,8 +41,7 @@ DB_PASSWORD=password BROADCAST_DRIVER=log MEDIA_DISK=media -FILESYSTEM_DISK=${MEDIA_DISK} -FILAMENT_FILESYSTEM_DISK=${MEDIA_DISK} +FILESYSTEM_DISK="${MEDIA_DISK}" FILAMENT_PATH=cpanel QUEUE_CONNECTION=database diff --git a/.env.testing b/.env.testing index 19c2dd76..caa918d8 100644 --- a/.env.testing +++ b/.env.testing @@ -31,4 +31,3 @@ SENTRY_LARAVEL_DSN= INSPECTOR_ENABLE=false BCRYPT_ROUNDS=4 -VIEW_COMPILED_PATH=/tmp/views diff --git a/.gitignore b/.gitignore index daf70699..3eaf74cb 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ composer.phar /public/build /public/hot /public/storage +/public/fonts /public/media /public/css /public/js diff --git a/.mcp.json b/.mcp.json index 4b9bacdf..81e2741a 100644 --- a/.mcp.json +++ b/.mcp.json @@ -1,11 +1,8 @@ { "mcpServers": { "laravel-boost": { - "command": "php", - "args": [ - "artisan", - "boost:mcp" - ] + "command": "./vendor/bin/sail", + "args": ["php", "artisan", "boost:mcp"] } } } diff --git a/CLAUDE.md b/CLAUDE.md index f7bff9e7..e86b7619 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,15 +8,18 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for ## Foundational Context This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions. -- php - 8.4.12 -- filament/filament (FILAMENT) - v3 +- php - 8.4.10 +- filament/filament (FILAMENT) - v4 - laravel/framework (LARAVEL) - v12 +- laravel/nightwatch (NIGHTWATCH) - v1 +- laravel/octane (OCTANE) - v2 - laravel/prompts (PROMPTS) - v0 - laravel/socialite (SOCIALITE) - v5 - livewire/livewire (LIVEWIRE) - v3 - livewire/volt (VOLT) - v1 - larastan/larastan (LARASTAN) - v3 - laravel/breeze (BREEZE) - v2 +- laravel/mcp (MCP) - v0 - laravel/pint (PINT) - v1 - laravel/sail (SAIL) - v1 - pestphp/pest (PEST) - v3 @@ -24,7 +27,7 @@ This application is a Laravel application and its main Laravel ecosystems packag - rector/rector (RECTOR) - v2 - alpinejs (ALPINEJS) - v3 - prettier (PRETTIER) - v3 -- tailwindcss (TAILWINDCSS) - v3 +- tailwindcss (TAILWINDCSS) - v4 ## Conventions @@ -201,19 +204,25 @@ Forms\Components\Select::make('user_id') -=== filament/v3 rules === +=== filament/v4 rules === -## Filament 3 +## Filament 4 -## Version 3 Changes To Focus On -- Resources are located in `app/Filament/Resources/` directory. -- Resource pages (List, Create, Edit) are auto-generated within the resource's directory - e.g., `app/Filament/Resources/PostResource/Pages/`. -- Forms use the `Forms\Components` namespace for form fields. -- Tables use the `Tables\Columns` namespace for table columns. -- A new `Filament\Forms\Components\RichEditor` component is available. -- Form and table schemas now use fluent method chaining. -- Added `php artisan filament:optimize` command for production optimization. -- Requires implementing `FilamentUser` contract for production access control. +### Important Version 4 Changes +- File visibility is now `private` by default. +- The `deferFilters` method from Filament v3 is now the default behavior in Filament v4, so users must click a button before the filters are applied to the table. To disable this behavior, you can use the `deferFilters(false)` method. +- The `Grid`, `Section`, and `Fieldset` layout components no longer span all columns by default. +- The `all` pagination page method is not available for tables by default. +- All action classes extend `Filament\Actions\Action`. No action classes exist in `Filament\Tables\Actions`. +- The `Form` & `Infolist` layout components have been moved to `Filament\Schemas\Components`, for example `Grid`, `Section`, `Fieldset`, `Tabs`, `Wizard`, etc. +- A new `Repeater` component for Forms has been added. +- Icons now use the `Filament\Support\Icons\Heroicon` Enum by default. Other options are available and documented. + +### Organize Component Classes Structure +- Schema components: `Schemas/Components/` +- Table columns: `Tables/Columns/` +- Table filters: `Tables/Filters/` +- Actions: `Actions/` === laravel/core rules === @@ -288,7 +297,7 @@ Forms\Components\Select::make('user_id') ## Livewire Core - Use the `search-docs` tool to find exact version specific documentation for how to write Livewire & Livewire tests. -- Use the `php artisan make:livewire [Posts\\CreatePost]` artisan command to create new components +- Use the `php artisan make:livewire [Posts\CreatePost]` artisan command to create new components - State should live on the server, with the UI reflecting it. - All Livewire requests hit the Laravel backend, they're like regular HTTP requests. Always validate form data, and run authorization checks in Livewire actions. @@ -305,7 +314,7 @@ Forms\Components\Select::make('user_id') @endforeach ``` -- Prefer lifecycle hooks like `mount()`, `updatedFoo()`) for initialization and reactive side effects: +- Prefer lifecycle hooks like `mount()`, `updatedFoo()` for initialization and reactive side effects: public function mount(User $user) { $this->user = $user; } @@ -564,11 +573,39 @@ it('has emails', function (string $email) { - If existing pages and components support dark mode, new pages and components must support dark mode in a similar way, typically using `dark:`. -=== tailwindcss/v3 rules === +=== tailwindcss/v4 rules === + +## Tailwind 4 + +- Always use Tailwind CSS v4 - do not use the deprecated utilities. +- `corePlugins` is not supported in Tailwind v4. +- In Tailwind v4, you import Tailwind using a regular CSS `@import` statement, not using the `@tailwind` directives used in v3: + + + - @tailwind base; + - @tailwind components; + - @tailwind utilities; + + @import "tailwindcss"; + + -## Tailwind 3 +### Replaced Utilities +- Tailwind v4 removed deprecated utilities. Do not use the deprecated option - use the replacement. +- Opacity values are still numeric. -- Always use Tailwind CSS v3 - verify you're using only classes supported by this version. +| Deprecated | Replacement | +|------------+--------------| +| bg-opacity-* | bg-black/* | +| text-opacity-* | text-black/* | +| border-opacity-* | border-black/* | +| divide-opacity-* | divide-black/* | +| ring-opacity-* | ring-black/* | +| placeholder-opacity-* | placeholder-black/* | +| flex-shrink-* | shrink-* | +| flex-grow-* | grow-* | +| overflow-ellipsis | text-ellipsis | +| decoration-slice | box-decoration-slice | +| decoration-clone | box-decoration-clone | === tests rules === @@ -577,4 +614,4 @@ it('has emails', function (string $email) { - Every change must be programmatically tested. Write a new test or update an existing test, then run the affected tests to make sure they pass. - Run the minimum number of tests needed to ensure code quality and speed. Use `php artisan test` with a specific filename or filter. - \ No newline at end of file + diff --git a/app-modules/gamify/composer.json b/app-modules/gamify/composer.json index b142ab48..7899c1a7 100644 --- a/app-modules/gamify/composer.json +++ b/app-modules/gamify/composer.json @@ -5,11 +5,11 @@ "version": "1.1.0", "license": "proprietary", "require": { - "filament/filament": "^3.2" + "php": "^8.4" }, "require-dev": { - "pestphp/pest": "^2.32", - "pestphp/pest-plugin-laravel": "^2.1" + "pestphp/pest": "^3.8", + "pestphp/pest-plugin-laravel": "^3.0" }, "autoload": { "psr-4": { diff --git a/app-modules/gamify/src/Models/Reputation.php b/app-modules/gamify/src/Models/Reputation.php index 8314f260..b5b348c5 100644 --- a/app-modules/gamify/src/Models/Reputation.php +++ b/app-modules/gamify/src/Models/Reputation.php @@ -11,7 +11,7 @@ /** * @property-read int $id - * @property int $point + * @property-read int $point * @property-read User|null $payee * @property-read \Illuminate\Support\Carbon $created_at * @property-read \Illuminate\Support\Carbon $updated_at @@ -28,19 +28,11 @@ public function payee(): BelongsTo return $this->belongsTo(config('gamify.payee_model'), 'payee_id'); // @phpstan-ignore-line } - /** - * Get the owning subject model - */ public function subject(): MorphTo { return $this->morphTo(); } - /** - * Undo last point - * - * @throws \Exception - */ public function undo(): void { if ($this->exists) { diff --git a/app-modules/gamify/tests/Feature/PointTest.php b/app-modules/gamify/tests/Feature/PointTest.php index 61ac56d8..3b85ef0a 100644 --- a/app-modules/gamify/tests/Feature/PointTest.php +++ b/app-modules/gamify/tests/Feature/PointTest.php @@ -3,131 +3,30 @@ declare(strict_types=1); use App\Models\User; -use Illuminate\Database\Eloquent\Model; use Laravelcm\Gamify\Exceptions\InvalidPayeeModelException; use Laravelcm\Gamify\Exceptions\PointsNotDefinedException; use Laravelcm\Gamify\Exceptions\PointSubjectNotSetException; -use Laravelcm\Gamify\PointType; - -final class FakeCreatePostPoint extends PointType -{ - public int $points = 10; - - public ?User $author; - - public function __construct(mixed $subject, ?User $author = null) - { - $this->subject = $subject; - $this->author = $author; - } - - public function payee(): ?User - { - return $this->author; - } -} - -final class FakeWelcomeUserWithNamePoint extends PointType -{ - public int $points = 30; - - public string $name = 'FakeName'; - - public function __construct(mixed $subject, public ?User $author = null) {} - - public function payee(): ?User - { - return $this->author; - } -} - -final class FakePointTypeWithoutSubject extends PointType -{ - protected int $point = 12; - - public function __construct($subject = null) - { - $this->subject = $subject; - } - - public function payee(): User - { - return new User; - } -} - -final class FakePointTypeWithoutPayee extends PointType -{ - protected int $point = 24; - - public function __construct(mixed $subject = null) - { - $this->subject = $subject; - } -} - -final class FakePointWithoutPoint extends PointType -{ - protected string $payee = 'user'; - - public function __construct($subject = null) - { - $this->subject = $subject; - } -} - -final class FakeWelcomeUserWithFalseQualifier extends PointType -{ - protected int $points = 10; - - public function __construct($subject) - { - $this->subject = $subject; - } - - public function qualifier(): bool - { - return false; - } - - public function payee(): ?User - { - return $this->getSubject()->user; - } -} - -final class FakePayeeFieldPoint extends PointType -{ - protected int $points = 10; - - /** @var string payee model relation on subject */ - protected string $payee = 'user'; - - public function __construct(mixed $subject) - { - $this->subject = $subject; - } -} +use Laravelcm\Gamify\Tests\Fixtures; beforeEach(function (): void { $this->user = $this->createUser(); }); -describe(PointType::class, function (): void { +describe('PointType', function (): void { it('sets point type name from class name', function (): void { - $point = new FakeCreatePostPoint($this->user); + $point = new Fixtures\FakeCreatePostPoint($this->user); expect($point->getName())->toBe('FakeCreatePostPoint'); }); it('uses name property for point name if provided', function (): void { - $point = new FakeWelcomeUserWithNamePoint($this->user); + $point = new Fixtures\FakeWelcomeUserWithNamePoint($this->user); expect($point->getName())->toBe('FakeName'); }); it('can get points for a point type', function (): void { - $point = new FakeCreatePostPoint($this->user); + $point = new Fixtures\FakeCreatePostPoint($this->user); expect($point->getPoints())->toBe(10); }); @@ -135,51 +34,51 @@ public function __construct(mixed $subject) it('gives point to a user', function (): void { $post = $this->createPost(['user_id' => $this->user->id]); - $this->user->givePoint(new FakeCreatePostPoint($post, $this->user)); + $this->user->givePoint(new Fixtures\FakeCreatePostPoint($post, $this->user)); - expect($this->user->getPoints())->toBe(10); - expect($this->user->reputations)->toHaveCount(1); + expect($this->user->getPoints())->toBe(10) + ->and($this->user->reputations)->toHaveCount(1); }); it('can access a reputation payee and subject', function (): void { $post = $this->createPost(['user_id' => $this->user->id]); - $this->user->givePoint(new FakeCreatePostPoint($post, $this->user)); + $this->user->givePoint(new Fixtures\FakeCreatePostPoint($post, $this->user)); $point = $this->user->reputations()->first(); - expect($point->payee)->toBeInstanceOf(User::class); - expect($point->subject)->toBeInstanceOf($post::class); - expect($point->name)->toBe('FakeCreatePostPoint'); + expect($point->payee)->toBeInstanceOf(User::class) + ->and($point->subject)->toBeInstanceOf($post::class) + ->and($point->name)->toBe('FakeCreatePostPoint'); }); it('do not give point if qualifier returns false', function (): void { $post = $this->createPost(['user_id' => $this->user->id]); - $this->user->givePoint(new FakeWelcomeUserWithFalseQualifier($post->user)); + $this->user->givePoint(new Fixtures\FakeWelcomeUserWithFalseQualifier($post->user)); expect($this->user->fresh()->getPoints())->toBe(0); }); it('throws exception if no payee is returned', function (): void { - $this->user->givePoint(new FakePointTypeWithoutPayee); + $this->user->givePoint(new Fixtures\FakePointTypeWithoutPayee); expect($this->user->fresh()->getPoints())->toBe(0); }) ->throws(InvalidPayeeModelException::class); it('throws exception if no subject is set', function (): void { - $this->user->givePoint(new FakePointTypeWithoutSubject); + $this->user->givePoint(new Fixtures\FakePointTypeWithoutSubject); - expect($this->user->getPoints())->toBe(0); - expect($this->user->reputations)->toHaveCount(0); + expect($this->user->getPoints())->toBe(0) + ->and($this->user->reputations)->toHaveCount(0); }) ->throws(PointSubjectNotSetException::class); it('throws exception if no points field or method is defined', function (): void { $post = $this->createPost(['user_id' => $this->user->id]); - $this->user->givePoint(new FakePointWithoutPoint($post)); + $this->user->givePoint(new Fixtures\FakePointWithoutPoint($post)); expect($this->user->getPoint())->toBe(0); }) @@ -189,13 +88,13 @@ public function __construct(mixed $subject) it('gives and undo point via helper functions', function (): void { $post = $this->createPost(['user_id' => $this->user->id]); - givePoint(new FakePayeeFieldPoint($post), $this->user); + givePoint(new Fixtures\FakePayeeFieldPoint($post), $this->user); expect($this->user->fresh()->getPoints())->toBe(10); - undoPoint(new FakePayeeFieldPoint($post), $this->user); + undoPoint(new Fixtures\FakePayeeFieldPoint($post), $this->user); - $user = $this->user->fresh(); + $this->user->fresh(); expect($this->user->fresh()->getPoints())->toBe(0); }); }); diff --git a/app-modules/gamify/tests/Fixtures/FakeCreatePostPoint.php b/app-modules/gamify/tests/Fixtures/FakeCreatePostPoint.php new file mode 100644 index 00000000..1738ff64 --- /dev/null +++ b/app-modules/gamify/tests/Fixtures/FakeCreatePostPoint.php @@ -0,0 +1,26 @@ +subject = $subject; + $this->author = $author; + } + + public function payee(): ?User + { + return $this->author; + } +} diff --git a/app-modules/gamify/tests/Fixtures/FakePayeeFieldPoint.php b/app-modules/gamify/tests/Fixtures/FakePayeeFieldPoint.php new file mode 100644 index 00000000..8c6f5486 --- /dev/null +++ b/app-modules/gamify/tests/Fixtures/FakePayeeFieldPoint.php @@ -0,0 +1,20 @@ +subject = $subject; + } +} diff --git a/app-modules/gamify/tests/Fixtures/FakePointTypeWithoutPayee.php b/app-modules/gamify/tests/Fixtures/FakePointTypeWithoutPayee.php new file mode 100644 index 00000000..6dd36aa0 --- /dev/null +++ b/app-modules/gamify/tests/Fixtures/FakePointTypeWithoutPayee.php @@ -0,0 +1,17 @@ +subject = $subject; + } +} diff --git a/app-modules/gamify/tests/Fixtures/FakePointTypeWithoutSubject.php b/app-modules/gamify/tests/Fixtures/FakePointTypeWithoutSubject.php new file mode 100644 index 00000000..4f4e2fcc --- /dev/null +++ b/app-modules/gamify/tests/Fixtures/FakePointTypeWithoutSubject.php @@ -0,0 +1,23 @@ +subject = $subject; + } + + public function payee(): User + { + return new User; + } +} diff --git a/app-modules/gamify/tests/Fixtures/FakePointWithoutPoint.php b/app-modules/gamify/tests/Fixtures/FakePointWithoutPoint.php new file mode 100644 index 00000000..fd1507c4 --- /dev/null +++ b/app-modules/gamify/tests/Fixtures/FakePointWithoutPoint.php @@ -0,0 +1,17 @@ +subject = $subject; + } +} diff --git a/app-modules/gamify/tests/Fixtures/FakeWelcomeUserWithFalseQualifier.php b/app-modules/gamify/tests/Fixtures/FakeWelcomeUserWithFalseQualifier.php new file mode 100644 index 00000000..eda96f37 --- /dev/null +++ b/app-modules/gamify/tests/Fixtures/FakeWelcomeUserWithFalseQualifier.php @@ -0,0 +1,28 @@ +subject = $subject; + } + + public function qualifier(): bool + { + return false; + } + + public function payee(): ?User + { + return $this->getSubject()->user; + } +} diff --git a/app-modules/gamify/tests/Fixtures/FakeWelcomeUserWithNamePoint.php b/app-modules/gamify/tests/Fixtures/FakeWelcomeUserWithNamePoint.php new file mode 100644 index 00000000..79dd0f41 --- /dev/null +++ b/app-modules/gamify/tests/Fixtures/FakeWelcomeUserWithNamePoint.php @@ -0,0 +1,22 @@ +author; + } +} diff --git a/app/Actions/Article/ApprovedArticleAction.php b/app/Actions/Article/ApprovedArticleAction.php index d2bef220..aa24b86f 100644 --- a/app/Actions/Article/ApprovedArticleAction.php +++ b/app/Actions/Article/ApprovedArticleAction.php @@ -11,8 +11,7 @@ final class ApprovedArticleAction { public function execute(Article $article): Article { - $article->approved_at = now(); - $article->save(); + $article->update(['approved_at' => now()]); givePoint(new ArticlePublished($article)); diff --git a/app/Actions/Forum/CreateReplyAction.php b/app/Actions/Forum/CreateReplyAction.php index 4dba1a59..2552fd9c 100644 --- a/app/Actions/Forum/CreateReplyAction.php +++ b/app/Actions/Forum/CreateReplyAction.php @@ -24,6 +24,7 @@ public function execute(string $body, ReplyInterface|Reply $model): void $reply->save(); givePoint(new ReplyCreated($model, $user)); + event(new ReplyWasCreated($reply)); } } diff --git a/app/Actions/Forum/UpdateThreadAction.php b/app/Actions/Forum/UpdateThreadAction.php index 2efc2dad..e05ba955 100644 --- a/app/Actions/Forum/UpdateThreadAction.php +++ b/app/Actions/Forum/UpdateThreadAction.php @@ -12,7 +12,6 @@ final class UpdateThreadAction public function execute(array $formValues, Thread $thread): Thread { return DB::transaction(function () use ($formValues, $thread): Thread { - $thread->update($formValues); return $thread; diff --git a/app/Actions/GetGithubRepositoriesAction.php b/app/Actions/GetGithubRepositoriesAction.php index aef58be8..4aad7a73 100644 --- a/app/Actions/GetGithubRepositoriesAction.php +++ b/app/Actions/GetGithubRepositoriesAction.php @@ -29,7 +29,7 @@ public function __invoke(): Collection return Cache::remember( key: 'github-repositories', - ttl: now()->addWeek(), + ttl: now()->addMonth(), callback: fn () => collect($response->json()) ->reject(fn (array $value): bool => $value['fork'] === true || ! in_array($value['name'], $only)) ->map(fn (array $data): RepositoryData => RepositoryData::from($data)) diff --git a/app/Contracts/HasCachedMediaInterface.php b/app/Contracts/HasCachedMediaInterface.php index 44906c2e..e7ef601a 100644 --- a/app/Contracts/HasCachedMediaInterface.php +++ b/app/Contracts/HasCachedMediaInterface.php @@ -4,11 +4,13 @@ namespace App\Contracts; +use DateTimeInterface; + interface HasCachedMediaInterface { public function getCacheKey(string $collection): string; - public function getCacheTtl(): \DateTimeInterface; + public function getCacheTtl(): DateTimeInterface; public function flushMediaCache(?string $collection = null): void; diff --git a/app/Exceptions/CannotUpdateApprovedArticle.php b/app/Exceptions/CannotUpdateApprovedArticle.php index 32f2b8b9..a5f21a04 100644 --- a/app/Exceptions/CannotUpdateApprovedArticle.php +++ b/app/Exceptions/CannotUpdateApprovedArticle.php @@ -4,4 +4,6 @@ namespace App\Exceptions; -final class CannotUpdateApprovedArticle extends \Exception {} +use Exception; + +final class CannotUpdateApprovedArticle extends Exception {} diff --git a/app/Filament/Resources/ArticleResource.php b/app/Filament/Resources/Articles/ArticleResource.php similarity index 74% rename from app/Filament/Resources/ArticleResource.php rename to app/Filament/Resources/Articles/ArticleResource.php index 98ecb813..a2113e3c 100644 --- a/app/Filament/Resources/ArticleResource.php +++ b/app/Filament/Resources/Articles/ArticleResource.php @@ -2,21 +2,21 @@ declare(strict_types=1); -namespace App\Filament\Resources; +namespace App\Filament\Resources\Articles; use App\Actions\Article\ApprovedArticleAction; use App\Actions\Article\DeclineArticleAction; -use App\Filament\Resources\ArticleResource\Pages; use App\Models\Article; -use Awcodes\FilamentBadgeableColumn\Components\Badge; -use Awcodes\FilamentBadgeableColumn\Components\BadgeableColumn; +use Awcodes\BadgeableColumn\Components\Badge; +use Awcodes\BadgeableColumn\Components\BadgeableColumn; +use Filament\Actions; use Filament\Forms\Components\Textarea; use Filament\Notifications\Notification; use Filament\Resources\Resource; -use Filament\Support\Enums\MaxWidth; -use Filament\Tables; -use Filament\Tables\Actions\BulkAction; +use Filament\Support\Enums\Width; +use Filament\Tables\Columns; use Filament\Tables\Enums\FiltersLayout; +use Filament\Tables\Filters; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; @@ -26,7 +26,7 @@ final class ArticleResource extends Resource { protected static ?string $model = Article::class; - protected static ?string $navigationIcon = 'heroicon-o-newspaper'; + protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-newspaper'; public static function getNavigationGroup(): string { @@ -38,13 +38,13 @@ public static function table(Table $table): Table return $table ->modifyQueryUsing(fn (Builder $query): Builder => $query->latest()) ->columns([ - Tables\Columns\SpatieMediaLibraryImageColumn::make('media') + Columns\SpatieMediaLibraryImageColumn::make('media') ->collection('media') ->label('Image'), - Tables\Columns\TextColumn::make('title') + Columns\TextColumn::make('title') ->label('Titre') ->limit(50) - ->tooltip(function (Tables\Columns\TextColumn $column): ?string { + ->tooltip(function (Columns\TextColumn $column): ?string { $state = $column->getState(); if (strlen($state) <= $column->getCharacterLimit()) { @@ -55,24 +55,24 @@ public static function table(Table $table): Table }) ->sortable() ->searchable(), - Tables\Columns\TextColumn::make('user.name') + Columns\TextColumn::make('user.name') ->label('Auteur') ->sortable() ->searchable(), - Tables\Columns\TextColumn::make('created_at') + Columns\TextColumn::make('created_at') ->label(__('Date de création')) ->date(), - Tables\Columns\IconColumn::make('published_at') + Columns\IconColumn::make('published_at') ->label('Publié') ->getStateUsing(fn (Article $record): bool => $record->isPublished()) ->boolean(), - Tables\Columns\TextColumn::make('submitted_at') + Columns\TextColumn::make('submitted_at') ->label('Soumission') ->placeholder('N/A') ->date(), BadgeableColumn::make('status') ->label('Statut') - ->getStateUsing(function ($record) { + ->getStateUsing(function ($record): string { if ($record->approved_at) { return $record->approved_at->format('d/m/Y'); } @@ -83,28 +83,26 @@ public static function table(Table $table): Table return ''; }) - ->prefixBadges(function ($record): array|string { + ->prefixBadges(function ($record): array { if ($record->approved_at) { return [ - Badge::make('Approuvé') - ->color('success'), + Badge::make('Approuvé')->color('success'), ]; } if ($record->declined_at) { return [ - Badge::make('Décliné') - ->color('danger'), + Badge::make('Décliné')->color('danger'), ]; } - return ''; + return []; }) ->sortable(), ]) - ->actions([ - Tables\Actions\ActionGroup::make([ - Tables\Actions\Action::make('approved') + ->recordActions([ + Actions\ActionGroup::make([ + Actions\Action::make('approved') ->visible(fn (Article $record): bool => $record->isAwaitingApproval()) ->label('Approuver') ->icon('heroicon-s-check') @@ -113,17 +111,17 @@ public static function table(Table $table): Table ->successNotificationTitle(__('Opération effectuée avec succès')) ->requiresConfirmation() ->modalIcon('heroicon-s-check') - ->action(function ($record): void { + ->action(function (Article $record): void { Gate::authorize('approve', $record); app(ApprovedArticleAction::class)->execute($record); }), - Tables\Actions\Action::make('declined') + Actions\Action::make('declined') ->visible(fn (Article $record): bool => $record->isAwaitingApproval()) ->label('Décliner') ->icon('heroicon-s-x-mark') ->color('warning') - ->form([ + ->schema([ Textarea::make('reason') ->label(__('Raison du refus')) ->maxLength(255) @@ -145,17 +143,17 @@ public static function table(Table $table): Table ->success() ->send(); }), - Tables\Actions\Action::make('show') + Actions\Action::make('show') ->icon('untitledui-eye') ->url(fn (Article $record): string => route('articles.show', $record)) ->openUrlInNewTab() ->label('Afficher'), - Tables\Actions\DeleteAction::make(), + Actions\DeleteAction::make(), ]), ]) - ->bulkActions([ - Tables\Actions\BulkActionGroup::make([ - BulkAction::make('declined') + ->toolbarActions([ + Actions\BulkActionGroup::make([ + Actions\BulkAction::make('declined') ->label('Décliner la sélection') ->icon('heroicon-s-x-mark') ->color('warning') @@ -166,22 +164,22 @@ public static function table(Table $table): Table ->modalHeading('Décliner') ->modalDescription('Voulez-vous vraiment décliner ces articles ?') ->modalSubmitActionLabel('Confirmer'), - Tables\Actions\DeleteBulkAction::make(), + Actions\DeleteBulkAction::make(), ]), ]) ->filters([ - Tables\Filters\TernaryFilter::make('submitted_at') + Filters\TernaryFilter::make('submitted_at') ->label('Soumis') ->nullable(), - Tables\Filters\TernaryFilter::make('declined_at') + Filters\TernaryFilter::make('declined_at') ->label('Décliner') ->nullable(), - Tables\Filters\TernaryFilter::make('approved_at') + Filters\TernaryFilter::make('approved_at') ->label('Approuver') ->nullable(), ], layout: FiltersLayout::AboveContentCollapsible) ->filtersFormColumns(4) - ->filtersFormWidth(MaxWidth::FourExtraLarge); + ->filtersFormWidth(Width::FourExtraLarge); } public static function getPages(): array diff --git a/app/Filament/Resources/ArticleResource/Pages/ListArticles.php b/app/Filament/Resources/Articles/Pages/ListArticles.php similarity index 82% rename from app/Filament/Resources/ArticleResource/Pages/ListArticles.php rename to app/Filament/Resources/Articles/Pages/ListArticles.php index f8be7594..c83ecf31 100644 --- a/app/Filament/Resources/ArticleResource/Pages/ListArticles.php +++ b/app/Filament/Resources/Articles/Pages/ListArticles.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace App\Filament\Resources\ArticleResource\Pages; +namespace App\Filament\Resources\Articles\Pages; -use App\Filament\Resources\ArticleResource; +use App\Filament\Resources\Articles\ArticleResource; use App\Models\Article; use Closure; -use Filament\Resources\Components\Tab; use Filament\Resources\Pages\ListRecords; +use Filament\Schemas\Components\Tabs\Tab; final class ListArticles extends ListRecords { diff --git a/app/Filament/Resources/ChannelResource/Pages/ListChannels.php b/app/Filament/Resources/ChannelResource/Pages/ListChannels.php deleted file mode 100644 index 7118d2f7..00000000 --- a/app/Filament/Resources/ChannelResource/Pages/ListChannels.php +++ /dev/null @@ -1,27 +0,0 @@ -slideOver() - ->modalWidth(MaxWidth::Large), - ]; - } -} diff --git a/app/Filament/Resources/ChannelResource.php b/app/Filament/Resources/Channels/ChannelResource.php similarity index 59% rename from app/Filament/Resources/ChannelResource.php rename to app/Filament/Resources/Channels/ChannelResource.php index a656ca01..9e9fa676 100644 --- a/app/Filament/Resources/ChannelResource.php +++ b/app/Filament/Resources/Channels/ChannelResource.php @@ -2,18 +2,19 @@ declare(strict_types=1); -namespace App\Filament\Resources; +namespace App\Filament\Resources\Channels; -use App\Filament\Resources\ChannelResource\Pages; use App\Models\Channel; -use Filament\Forms; -use Filament\Forms\Form; -use Filament\Resources\Concerns\Translatable; +use Filament\Actions; +use Filament\Forms\Components; use Filament\Resources\Resource; -use Filament\Tables; +use Filament\Schemas\Components\Utilities; +use Filament\Schemas\Schema; +use Filament\Tables\Columns; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Str; +use LaraZeus\SpatieTranslatable\Resources\Concerns\Translatable; final class ChannelResource extends Resource { @@ -21,27 +22,27 @@ final class ChannelResource extends Resource protected static ?string $model = Channel::class; - protected static ?string $navigationIcon = 'untitledui-git-branch'; + protected static string|\BackedEnum|null $navigationIcon = 'untitledui-git-branch'; public static function getNavigationGroup(): string { return __('Forum'); } - public static function form(Form $form): Form + public static function form(Schema $schema): Schema { - return $form - ->schema([ - Forms\Components\TextInput::make('name') + return $schema + ->components([ + Components\TextInput::make('name') ->required() ->live(onBlur: true) - ->afterStateUpdated(fn ($state, Forms\Set $set): mixed => $set('slug', Str::slug($state))) + ->afterStateUpdated(fn ($state, Utilities\Set $set): mixed => $set('slug', Str::slug($state))) ->columnSpanFull(), - Forms\Components\TextInput::make('slug') + Components\TextInput::make('slug') ->readOnly() ->required() ->columnSpanFull(), - Forms\Components\Select::make('parent_id') + Components\Select::make('parent_id') ->relationship( name: 'parent', titleAttribute: 'name', @@ -50,13 +51,13 @@ public static function form(Form $form): Form ->live() ->default(null) ->columnSpanFull(), - Forms\Components\ColorPicker::make('color') + Components\ColorPicker::make('color') ->label('Couleur') ->hex() ->live() ->columnSpanFull() - ->required(fn (Forms\Get $get): bool => $get('parent_id') === null), - Forms\Components\Textarea::make('description') + ->required(fn (Utilities\Get $get): bool => $get('parent_id') === null), + Components\Textarea::make('description') ->rows(4) ->columnSpanFull(), ]); @@ -66,32 +67,31 @@ public static function table(Table $table): Table { return $table ->columns([ - Tables\Columns\TextColumn::make('name') + Columns\TextColumn::make('name') ->label('Nom') ->searchable(), - Tables\Columns\TextColumn::make('parent.name') + Columns\TextColumn::make('parent.name') ->label('Parent') ->placeholder('N/A') ->sortable(), - Tables\Columns\TextColumn::make('thread_number') + Columns\TextColumn::make('thread_number') ->label('Nombre de sujets') ->getStateUsing(fn ($record) => $record->threads()->count()), - Tables\Columns\ColorColumn::make('color') + Columns\ColorColumn::make('color') ->label('Couleur') ->placeholder('N/A'), - Tables\Columns\TextColumn::make('created_at') + Columns\TextColumn::make('created_at') ->label('Date') ->date() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) - ->actions([ - Tables\Actions\EditAction::make(), - Tables\Actions\DeleteAction::make() - ->iconButton(), + ->recordActions([ + Actions\EditAction::make(), + Actions\DeleteAction::make()->iconButton(), ]) - ->bulkActions([ - Tables\Actions\DeleteBulkAction::make(), + ->toolbarActions([ + Actions\DeleteBulkAction::make(), ]); } diff --git a/app/Filament/Resources/Channels/Pages/ListChannels.php b/app/Filament/Resources/Channels/Pages/ListChannels.php new file mode 100644 index 00000000..5bebe993 --- /dev/null +++ b/app/Filament/Resources/Channels/Pages/ListChannels.php @@ -0,0 +1,29 @@ +slideOver() + ->modalWidth(Width::Large), + ]; + } +} diff --git a/app/Filament/Resources/DiscussionResource.php b/app/Filament/Resources/Discussions/DiscussionResource.php similarity index 52% rename from app/Filament/Resources/DiscussionResource.php rename to app/Filament/Resources/Discussions/DiscussionResource.php index cdf5acff..e3b72341 100644 --- a/app/Filament/Resources/DiscussionResource.php +++ b/app/Filament/Resources/Discussions/DiscussionResource.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace App\Filament\Resources; +namespace App\Filament\Resources\Discussions; -use App\Filament\Resources\DiscussionResource\Pages; use App\Models\Discussion; +use Filament\Actions; use Filament\Resources\Resource; -use Filament\Tables; +use Filament\Tables\Columns; use Filament\Tables\Filters\Filter; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; @@ -16,7 +16,7 @@ final class DiscussionResource extends Resource { protected static ?string $model = Discussion::class; - protected static ?string $navigationIcon = 'untitledui-message-chat-square'; + protected static string|\BackedEnum|null $navigationIcon = 'untitledui-message-chat-square'; public static function getNavigationGroup(): string { @@ -27,45 +27,48 @@ public static function table(Table $table): Table { return $table ->columns([ - Tables\Columns\TextColumn::make('title') - ->label('Titre') + Columns\TextColumn::make('title') + ->label(__('Titre')) ->limit(50) ->sortable() ->searchable(), - Tables\Columns\TextColumn::make('user.name') - ->label('Auteur') + Columns\TextColumn::make('user.name') + ->label(__('Auteur')) ->sortable() ->searchable(), - Tables\Columns\TextColumn::make('count_all_replies_with_child') - ->label('Commentaires'), - Tables\Columns\IconColumn::make('locked') - ->label('Vérrouillé') + Columns\TextColumn::make('count_all_replies_with_child') + ->label(__('Commentaires')), + Columns\IconColumn::make('locked') + ->label(__('Vérrouillé')) ->boolean() ->trueIcon('untitledui-lock-04') ->trueColor('warning') ->falseIcon('untitledui-lock-unlocked-04') ->falseColor('gray'), - Tables\Columns\TextColumn::make('created_at') - ->label('Date') + Columns\TextColumn::make('created_at') + ->label(__('Date')) ->date(), ]) ->filters([ - Filter::make('is_pinned')->query(fn (Builder $query) => $query->where('is_pinned', true))->label('Epinglé'), - Filter::make('is_locked')->query(fn (Builder $query) => $query->where('locked', true))->label('Vérrouillé'), + Filter::make('is_pinned') + ->query(fn (Builder $query) => $query->where('is_pinned', true)) + ->label(__('Epinglé')), + Filter::make('is_locked') + ->query(fn (Builder $query) => $query->where('locked', true)) + ->label(__('Vérrouillé')), ]) - ->actions([ - Tables\Actions\Action::make('show') + ->recordActions([ + Actions\Action::make('show') ->icon('untitledui-eye') ->iconButton() ->color('gray') ->url(fn (Discussion $record): string => route('discussions.show', $record)) ->openUrlInNewTab(), - Tables\Actions\DeleteAction::make() - ->iconButton(), + Actions\DeleteAction::make()->iconButton(), ]) - ->bulkActions([ - Tables\Actions\BulkActionGroup::make([ - Tables\Actions\DeleteBulkAction::make(), + ->toolbarActions([ + Actions\BulkActionGroup::make([ + Actions\DeleteBulkAction::make(), ]), ]); } diff --git a/app/Filament/Resources/DiscussionResource/Pages/ListDiscussions.php b/app/Filament/Resources/Discussions/Pages/ListDiscussions.php similarity index 63% rename from app/Filament/Resources/DiscussionResource/Pages/ListDiscussions.php rename to app/Filament/Resources/Discussions/Pages/ListDiscussions.php index 01661beb..44eeb1b0 100644 --- a/app/Filament/Resources/DiscussionResource/Pages/ListDiscussions.php +++ b/app/Filament/Resources/Discussions/Pages/ListDiscussions.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace App\Filament\Resources\DiscussionResource\Pages; +namespace App\Filament\Resources\Discussions\Pages; -use App\Filament\Resources\DiscussionResource; +use App\Filament\Resources\Discussions\DiscussionResource; use Filament\Resources\Pages\ListRecords; final class ListDiscussions extends ListRecords diff --git a/app/Filament/Resources/TagResource/Pages/ListTags.php b/app/Filament/Resources/Tags/Pages/ListTags.php similarity index 55% rename from app/Filament/Resources/TagResource/Pages/ListTags.php rename to app/Filament/Resources/Tags/Pages/ListTags.php index d40fbf2b..5e27eb9b 100644 --- a/app/Filament/Resources/TagResource/Pages/ListTags.php +++ b/app/Filament/Resources/Tags/Pages/ListTags.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace App\Filament\Resources\TagResource\Pages; +namespace App\Filament\Resources\Tags\Pages; -use App\Filament\Resources\TagResource; -use Filament\Actions; +use App\Filament\Resources\Tags\TagResource; +use Filament\Actions\CreateAction; use Filament\Resources\Pages\ListRecords; -use Filament\Support\Enums\MaxWidth; +use Filament\Support\Enums\Width; final class ListTags extends ListRecords { @@ -16,9 +16,9 @@ final class ListTags extends ListRecords protected function getHeaderActions(): array { return [ - Actions\CreateAction::make() + CreateAction::make() ->slideOver() - ->modalWidth(MaxWidth::Large), + ->modalWidth(Width::Large), ]; } } diff --git a/app/Filament/Resources/TagResource.php b/app/Filament/Resources/Tags/TagResource.php similarity index 52% rename from app/Filament/Resources/TagResource.php rename to app/Filament/Resources/Tags/TagResource.php index eacae266..073e6896 100644 --- a/app/Filament/Resources/TagResource.php +++ b/app/Filament/Resources/Tags/TagResource.php @@ -2,14 +2,15 @@ declare(strict_types=1); -namespace App\Filament\Resources; +namespace App\Filament\Resources\Tags; -use App\Filament\Resources\TagResource\Pages; use App\Models\Tag; -use Filament\Forms; -use Filament\Forms\Form; +use Filament\Actions; +use Filament\Forms\Components; use Filament\Resources\Resource; -use Filament\Tables; +use Filament\Schemas\Components\Utilities\Set; +use Filament\Schemas\Schema; +use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; use Illuminate\Support\Str; @@ -17,28 +18,28 @@ final class TagResource extends Resource { protected static ?string $model = Tag::class; - protected static ?string $navigationIcon = 'untitledui-tag-03'; + protected static string|\BackedEnum|null $navigationIcon = 'untitledui-tag-03'; public static function getNavigationGroup(): string { return __('Contenu'); } - public static function form(Form $form): Form + public static function form(Schema $schema): Schema { - return $form - ->schema([ - Forms\Components\TextInput::make('name') + return $schema + ->components([ + Components\TextInput::make('name') ->live(onBlur: true) ->required() ->unique(ignoreRecord: true) - ->afterStateUpdated(fn ($state, Forms\Set $set): mixed => $set('slug', Str::slug($state))) + ->afterStateUpdated(fn ($state, Set $set): mixed => $set('slug', Str::slug($state))) ->columnSpanFull(), - Forms\Components\TextInput::make('slug') + Components\TextInput::make('slug') ->readOnly() ->required() ->columnSpanFull(), - Forms\Components\Select::make('concerns') + Components\Select::make('concerns') ->multiple() ->options([ 'post' => 'Article', @@ -47,8 +48,7 @@ public static function form(Form $form): Form ]) ->required() ->columnSpanFull(), - Forms\Components\Textarea::make('description') - ->columnSpanFull(), + Components\Textarea::make('description')->columnSpanFull(), ]); } @@ -56,18 +56,16 @@ public static function table(Table $table): Table { return $table ->columns([ - Tables\Columns\TextColumn::make('name') - ->searchable(), - Tables\Columns\TextColumn::make(name: 'concerns'), + TextColumn::make('name')->searchable(), + TextColumn::make(name: 'concerns'), ]) - ->actions([ - Tables\Actions\EditAction::make(), - Tables\Actions\DeleteAction::make() - ->iconButton(), + ->recordActions([ + Actions\EditAction::make(), + Actions\DeleteAction::make(), ]) - ->bulkActions([ - Tables\Actions\BulkActionGroup::make([ - Tables\Actions\DeleteBulkAction::make(), + ->toolbarActions([ + Actions\BulkActionGroup::make([ + Actions\DeleteBulkAction::make(), ]), ]); } diff --git a/app/Filament/Resources/ThreadResource/Pages/ListThreads.php b/app/Filament/Resources/Threads/Pages/ListThreads.php similarity index 65% rename from app/Filament/Resources/ThreadResource/Pages/ListThreads.php rename to app/Filament/Resources/Threads/Pages/ListThreads.php index ffbc8eff..5ded5804 100644 --- a/app/Filament/Resources/ThreadResource/Pages/ListThreads.php +++ b/app/Filament/Resources/Threads/Pages/ListThreads.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace App\Filament\Resources\ThreadResource\Pages; +namespace App\Filament\Resources\Threads\Pages; -use App\Filament\Resources\ThreadResource; +use App\Filament\Resources\Threads\ThreadResource; use Filament\Resources\Pages\ListRecords; final class ListThreads extends ListRecords diff --git a/app/Filament/Resources/ThreadResource.php b/app/Filament/Resources/Threads/ThreadResource.php similarity index 58% rename from app/Filament/Resources/ThreadResource.php rename to app/Filament/Resources/Threads/ThreadResource.php index 6d09386f..187898d7 100644 --- a/app/Filament/Resources/ThreadResource.php +++ b/app/Filament/Resources/Threads/ThreadResource.php @@ -2,19 +2,20 @@ declare(strict_types=1); -namespace App\Filament\Resources; +namespace App\Filament\Resources\Threads; -use App\Filament\Resources\ThreadResource\Pages; use App\Models\Thread; +use Filament\Actions; use Filament\Resources\Resource; -use Filament\Tables; +use Filament\Tables\Columns; +use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Table; final class ThreadResource extends Resource { protected static ?string $model = Thread::class; - protected static ?string $navigationIcon = 'heroicon-o-chat-bubble-left-right'; + protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-chat-bubble-left-right'; public static function getNavigationGroup(): string { @@ -25,45 +26,45 @@ public static function table(Table $table): Table { return $table ->columns([ - Tables\Columns\TextColumn::make('title') - ->label('Titre') + Columns\TextColumn::make('title') + ->label(__('Titre')) ->sortable(), - Tables\Columns\TextColumn::make('user.name') - ->label('Auteur'), - Tables\Columns\IconColumn::make('locked') - ->label('Vérrouillé') + Columns\TextColumn::make('user.name') + ->label(__('Auteur')), + Columns\IconColumn::make('locked') + ->label(__('Vérrouillé')) ->boolean() ->trueIcon('heroicon-s-lock-closed') ->trueColor('warning') ->falseIcon('heroicon-s-lock-open') ->falseColor('success'), - Tables\Columns\TextColumn::make('resolved_by') - ->label('Résolu') + Columns\TextColumn::make('resolved_by') + ->label(__('Résolu')) ->badge() ->getStateUsing(fn (Thread $record): string => $record->resolved_by === null ? 'Non' : 'Oui') ->color(fn (Thread $record): string => $record->resolved_by === null ? 'gray' : 'success'), - Tables\Columns\TextColumn::make('created_at') - ->label('Date de publication') + Columns\TextColumn::make('created_at') + ->label(__('Date de publication')) ->dateTime(), ]) - ->actions([ - Tables\Actions\ActionGroup::make([ - Tables\Actions\Action::make('view') - ->label('Voir le thread') + ->recordActions([ + Actions\ActionGroup::make([ + Actions\Action::make('view') + ->label(__('Voir le thread')) ->icon('heroicon-o-eye') ->color('success') ->url(fn (Thread $record): string => route('forum.show', $record)) ->openUrlInNewTab(), - Tables\Actions\DeleteAction::make(), + Actions\DeleteAction::make(), ]), ]) - ->bulkActions([ - Tables\Actions\BulkActionGroup::make([ - Tables\Actions\DeleteBulkAction::make(), + ->toolbarActions([ + Actions\BulkActionGroup::make([ + Actions\DeleteBulkAction::make(), ]), ]) ->filters([ - Tables\Filters\SelectFilter::make('Channels') + SelectFilter::make('Channels') ->relationship('channels', 'name') ->searchable() ->preload(), diff --git a/app/Filament/Resources/UserResource/Pages/ListUsers.php b/app/Filament/Resources/Users/Pages/ListUsers.php similarity index 76% rename from app/Filament/Resources/UserResource/Pages/ListUsers.php rename to app/Filament/Resources/Users/Pages/ListUsers.php index f9c8e4a0..e1348100 100644 --- a/app/Filament/Resources/UserResource/Pages/ListUsers.php +++ b/app/Filament/Resources/Users/Pages/ListUsers.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace App\Filament\Resources\UserResource\Pages; +namespace App\Filament\Resources\Users\Pages; -use App\Filament\Resources\UserResource; -use Filament\Resources\Components\Tab; +use App\Filament\Resources\Users\UserResource; use Filament\Resources\Pages\ListRecords; +use Filament\Schemas\Components\Tabs\Tab; final class ListUsers extends ListRecords { diff --git a/app/Filament/Resources/UserResource.php b/app/Filament/Resources/Users/UserResource.php similarity index 81% rename from app/Filament/Resources/UserResource.php rename to app/Filament/Resources/Users/UserResource.php index 9fc017c7..95e54d01 100644 --- a/app/Filament/Resources/UserResource.php +++ b/app/Filament/Resources/Users/UserResource.php @@ -2,18 +2,19 @@ declare(strict_types=1); -namespace App\Filament\Resources; +namespace App\Filament\Resources\Users; use App\Actions\User\BanUserAction; use App\Actions\User\UnBanUserAction; -use App\Filament\Resources\UserResource\Pages; use App\Models\User; -use Awcodes\FilamentBadgeableColumn\Components\Badge; -use Awcodes\FilamentBadgeableColumn\Components\BadgeableColumn; +use Awcodes\BadgeableColumn\Components\Badge; +use Awcodes\BadgeableColumn\Components\BadgeableColumn; +use Filament\Actions; use Filament\Forms\Components\TextInput; use Filament\Notifications\Notification; use Filament\Resources\Resource; -use Filament\Tables; +use Filament\Tables\Columns; +use Filament\Tables\Filters\TernaryFilter; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; @@ -21,7 +22,7 @@ final class UserResource extends Resource { protected static ?string $model = User::class; - protected static ?string $navigationIcon = 'untitledui-users-02'; + protected static string|\BackedEnum|null $navigationIcon = 'untitledui-users-02'; public static function getNavigationGroup(): string { @@ -38,7 +39,7 @@ public static function table(Table $table): Table ->latest(); }) ->columns([ - Tables\Columns\ImageColumn::make('profile_photo_url') + Columns\ImageColumn::make('profile_photo_url') ->label('Avatar') ->circular(), BadgeableColumn::make('name') @@ -50,25 +51,25 @@ public static function table(Table $table): Table ->description(fn (User $record): ?string => $record->location) ->searchable() ->sortable(), - Tables\Columns\TextColumn::make('email') - ->label('Email') + Columns\TextColumn::make('email') + ->label(__('Email')) ->icon('untitledui-inbox') ->description(fn (User $record): ?string => $record->phone_number), - Tables\Columns\TextColumn::make('email_verified_at') + Columns\TextColumn::make('email_verified_at') ->label(__('user.validate_email')) ->placeholder('N/A') ->date(), - Tables\Columns\TextColumn::make(name: 'created_at') + Columns\TextColumn::make(name: 'created_at') ->label(__('user.inscription')) ->date(), ]) ->filters([ - Tables\Filters\TernaryFilter::make('email_verified_at') + TernaryFilter::make('email_verified_at') ->label(__('user.email_verified')) ->nullable(), ]) - ->actions([ - Tables\Actions\Action::make('ban') + ->recordActions([ + Actions\Action::make('ban') ->label(__('actions.ban')) ->icon('untitledui-archive') ->color('warning') @@ -76,7 +77,7 @@ public static function table(Table $table): Table ->modalHeading(__('user.ban.heading')) ->modalDescription(__('user.ban.description')) ->authorize('ban', User::class) - ->form([ + ->schema([ TextInput::make('banned_reason') ->label(__('user.ban.reason')) ->required(), @@ -92,7 +93,7 @@ public static function table(Table $table): Table ->send(); }) ->requiresConfirmation(), - Tables\Actions\Action::make('unban') + Actions\Action::make('unban') ->label(__('actions.unban')) ->icon('heroicon-o-check-circle') ->color('success') @@ -109,11 +110,11 @@ public static function table(Table $table): Table ->send(); }) ->requiresConfirmation(), - Tables\Actions\DeleteAction::make(), + Actions\DeleteAction::make(), ]) - ->bulkActions([ - Tables\Actions\DeleteBulkAction::make(), - Tables\Actions\BulkAction::make('delete_banned') + ->toolbarActions([ + Actions\DeleteBulkAction::make(), + Actions\BulkAction::make('delete_banned') ->label(__('Supprimer les utilisateurs bannis')) ->icon('heroicon-o-trash') ->color('danger') @@ -131,9 +132,7 @@ public static function table(Table $table): Table return; } - $bannedUsers->each(function (User $user): void { - $user->delete(); - }); + $bannedUsers->each(fn (User $user): ?bool => $user->delete()); Notification::make() ->success() diff --git a/app/Http/Controllers/NotchPayCallBackController.php b/app/Http/Controllers/NotchPayCallBackController.php index 4a185338..892d1ac5 100644 --- a/app/Http/Controllers/NotchPayCallBackController.php +++ b/app/Http/Controllers/NotchPayCallBackController.php @@ -7,6 +7,7 @@ use App\Enums\TransactionStatus; use App\Events\SponsoringPaymentInitialize; use App\Models\Transaction; +use Exception; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; @@ -49,7 +50,7 @@ public function __invoke(Request $request): RedirectResponse ); } - } catch (\Exception $e) { + } catch (Exception $e) { Log::error($e->getMessage()); session()->flash( diff --git a/app/Http/Controllers/SubscriptionController.php b/app/Http/Controllers/SubscriptionController.php index 83df2f8d..8d8d067b 100644 --- a/app/Http/Controllers/SubscriptionController.php +++ b/app/Http/Controllers/SubscriptionController.php @@ -5,13 +5,14 @@ namespace App\Http\Controllers; use App\Models\Subscribe; +use App\Models\Thread; use Illuminate\Http\RedirectResponse; final class SubscriptionController extends Controller { public function unsubscribe(Subscribe $subscription): RedirectResponse { - /** @var \App\Models\Thread $thread */ + /** @var Thread $thread */ $thread = $subscription->subscribeAble; $thread->subscribes()->where('user_id', $subscription->user->id)->delete(); diff --git a/app/Listeners/SendNewReplyNotification.php b/app/Listeners/SendNewReplyNotification.php index bf627b2f..2181011e 100644 --- a/app/Listeners/SendNewReplyNotification.php +++ b/app/Listeners/SendNewReplyNotification.php @@ -6,6 +6,7 @@ use App\Events\ReplyWasCreated; use App\Models\Subscribe; +use App\Models\Thread; use App\Models\User; use App\Notifications\NewReplyNotification; use Illuminate\Contracts\Queue\ShouldQueue; @@ -17,7 +18,7 @@ final class SendNewReplyNotification implements ShouldQueue public function handle(ReplyWasCreated $event): void { - /** @var \App\Models\Thread $thread */ + /** @var Thread $thread */ $thread = $event->reply->replyAble; foreach ($thread->subscribes as $subscription) { diff --git a/app/Livewire/Components/Discussion/Comments.php b/app/Livewire/Components/Discussion/Comments.php index 9f9e4d5d..ebcbe929 100644 --- a/app/Livewire/Components/Discussion/Comments.php +++ b/app/Livewire/Components/Discussion/Comments.php @@ -7,11 +7,13 @@ use App\Actions\Discussion\CreateDiscussionReplyAction; use App\Models\Discussion; use App\Models\Reply; -use Filament\Forms; +use Filament\Actions\Concerns\InteractsWithActions; +use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components\Textarea; use Filament\Forms\Concerns\InteractsWithForms; use Filament\Forms\Contracts\HasForms; -use Filament\Forms\Form; use Filament\Notifications\Notification; +use Filament\Schemas\Schema; use Illuminate\Contracts\View\View; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Auth; @@ -20,10 +22,11 @@ use Livewire\Component; /** - * @property Form $form + * @property \Filament\Schemas\Schema $form */ -final class Comments extends Component implements HasForms +final class Comments extends Component implements HasActions, HasForms { + use InteractsWithActions; use InteractsWithForms; public Discussion $discussion; @@ -35,11 +38,11 @@ public function mount(): void $this->form->fill(); } - public function form(Form $form): Form + public function form(Schema $schema): Schema { - return $form - ->schema([ - Forms\Components\Textarea::make('body') + return $schema + ->components([ + Textarea::make('body') ->hiddenLabel() ->placeholder(__('pages/discussion.placeholder')) ->rows(3) diff --git a/app/Livewire/Components/Forum/ReplyForm.php b/app/Livewire/Components/Forum/ReplyForm.php index 1a934ddb..53dc4a28 100644 --- a/app/Livewire/Components/Forum/ReplyForm.php +++ b/app/Livewire/Components/Forum/ReplyForm.php @@ -7,20 +7,23 @@ use App\Actions\Forum\CreateReplyAction; use App\Models\Reply; use App\Models\Thread; -use Filament\Forms; +use Filament\Actions\Concerns\InteractsWithActions; +use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components\MarkdownEditor; use Filament\Forms\Concerns\InteractsWithForms; use Filament\Forms\Contracts\HasForms; -use Filament\Forms\Form; use Filament\Notifications\Notification; +use Filament\Schemas\Schema; use Illuminate\Contracts\View\View; use Livewire\Attributes\On; use Livewire\Component; /** - * @property Form $form + * @property \Filament\Schemas\Schema $form */ -final class ReplyForm extends Component implements HasForms +final class ReplyForm extends Component implements HasActions, HasForms { + use InteractsWithActions; use InteractsWithForms; public Thread $thread; @@ -53,11 +56,11 @@ public function close(): void $this->reply = null; } - public function form(Form $form): Form + public function form(Schema $schema): Schema { - return $form - ->schema([ - Forms\Components\MarkdownEditor::make('body') + return $schema + ->components([ + MarkdownEditor::make('body') ->hiddenLabel() ->fileAttachmentsDisk('public') ->autofocus() diff --git a/app/Livewire/Components/Slideovers/ArticleForm.php b/app/Livewire/Components/Slideovers/ArticleForm.php index 1acd983a..382f3676 100644 --- a/app/Livewire/Components/Slideovers/ArticleForm.php +++ b/app/Livewire/Components/Slideovers/ArticleForm.php @@ -11,11 +11,17 @@ use App\Livewire\Traits\WithAuthenticatedUser; use App\Models\Article; use Carbon\Carbon; -use Filament\Forms; +use Filament\Actions\Concerns\InteractsWithActions; +use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components; use Filament\Forms\Concerns\InteractsWithForms; use Filament\Forms\Contracts\HasForms; -use Filament\Forms\Form; +use Filament\Infolists\Components\TextEntry; use Filament\Notifications\Notification; +use Filament\Schemas\Components\Grid; +use Filament\Schemas\Components\Group; +use Filament\Schemas\Components\Utilities; +use Filament\Schemas\Schema; use Illuminate\Contracts\View\View; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Auth; @@ -25,10 +31,11 @@ use Laravelcm\LivewireSlideOvers\SlideOverComponent; /** - * @property-read Form $form + * @property-read \Filament\Schemas\Schema $form */ -final class ArticleForm extends SlideOverComponent implements HasForms +final class ArticleForm extends SlideOverComponent implements HasActions, HasForms { + use InteractsWithActions; use InteractsWithForms; use WithAuthenticatedUser; @@ -60,48 +67,48 @@ public static function closePanelOnClickAway(): bool return false; } - public function form(Form $form): Form + public function form(Schema $schema): Schema { - return $form - ->schema([ - Forms\Components\Group::make() + return $schema + ->components([ + Group::make() ->schema([ - Forms\Components\TextInput::make('title') + Components\TextInput::make('title') ->label(__('validation.attributes.title')) ->minLength(10) ->required() ->live(onBlur: true) - ->afterStateUpdated(fn ($state, Forms\Set $set): mixed => $set('slug', Str::slug($state))), - Forms\Components\Hidden::make('slug'), - Forms\Components\TextInput::make('canonical_url') + ->afterStateUpdated(fn ($state, Utilities\Set $set): mixed => $set('slug', Str::slug($state))), + Components\Hidden::make('slug'), + Components\TextInput::make('canonical_url') ->label(__('pages/article.form.canonical_url')) ->helperText(__('pages/article.canonical_help')), - Forms\Components\Grid::make() + Grid::make() ->schema([ - Forms\Components\Toggle::make('is_draft') + Components\Toggle::make('is_draft') ->label(__('pages/article.form.draft')) ->live() ->offIcon('untitledui-check') ->onColor('success') ->onIcon('untitledui-pencil-line') ->helperText(__('pages/article.draft_help')), - Forms\Components\DatePicker::make('published_at') + Components\DatePicker::make('published_at') ->label(__('pages/article.form.published_at')) ->closeOnDateSelection() ->prefixIcon('untitledui-calendar-date') ->native(false) - ->visible(fn (Forms\Get $get): bool => $get('is_draft') === false) - ->required(fn (Forms\Get $get): bool => $get('is_draft') === false), + ->visible(fn (Utilities\Get $get): bool => $get('is_draft') === false) + ->required(fn (Utilities\Get $get): bool => $get('is_draft') === false), ]), ]) ->columnSpan(2), - Forms\Components\Group::make() + Group::make() ->schema([ - Forms\Components\SpatieMediaLibraryFileUpload::make('media') + Components\SpatieMediaLibraryFileUpload::make('media') ->collection('media') ->label(__('pages/article.form.cover')) ->maxSize(1024), - Forms\Components\Select::make('tags') + Components\Select::make('tags') ->multiple() ->relationship( name: 'tags', @@ -112,16 +119,16 @@ public function form(Form $form): Form ->required() ->minItems(1) ->maxItems(3), - Forms\Components\ToggleButtons::make('locale') + Components\ToggleButtons::make('locale') ->label(__('validation.attributes.locale')) ->options(['en' => 'En', 'fr' => 'Fr']) ->helperText(__('global.locale_help')) ->grouped(), ]) ->columnSpan(1), - Forms\Components\Group::make() + Group::make() ->schema([ - Forms\Components\MarkdownEditor::make('body') + Components\MarkdownEditor::make('body') ->toolbarButtons([ 'attachFiles', 'blockquote', @@ -139,8 +146,9 @@ public function form(Form $form): Form ->minLength(10) ->maxHeight('20.25rem') ->required(), - Forms\Components\Placeholder::make('') - ->content(fn (): HtmlString => new HtmlString(Blade::render(<<<'Blade' + TextEntry::make('placeholder') + ->hiddenLabel() + ->state(fn (): HtmlString => new HtmlString(Blade::render(<<<'Blade' Blade))), ]) diff --git a/app/Livewire/Components/Slideovers/DiscussionForm.php b/app/Livewire/Components/Slideovers/DiscussionForm.php index 1ed49ff9..cc4c3f34 100644 --- a/app/Livewire/Components/Slideovers/DiscussionForm.php +++ b/app/Livewire/Components/Slideovers/DiscussionForm.php @@ -8,11 +8,15 @@ use App\Exceptions\UnverifiedUserException; use App\Livewire\Traits\WithAuthenticatedUser; use App\Models\Discussion; -use Filament\Forms; +use Filament\Actions\Concerns\InteractsWithActions; +use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components; use Filament\Forms\Concerns\InteractsWithForms; use Filament\Forms\Contracts\HasForms; -use Filament\Forms\Form; +use Filament\Infolists\Components\TextEntry; use Filament\Notifications\Notification; +use Filament\Schemas\Components\Utilities\Set; +use Filament\Schemas\Schema; use Illuminate\Contracts\View\View; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Blade; @@ -21,10 +25,11 @@ use Laravelcm\LivewireSlideOvers\SlideOverComponent; /** - * @property Form $form + * @property \Filament\Schemas\Schema $form */ -final class DiscussionForm extends SlideOverComponent implements HasForms +final class DiscussionForm extends SlideOverComponent implements HasActions, HasForms { + use InteractsWithActions; use InteractsWithForms; use WithAuthenticatedUser; @@ -45,38 +50,38 @@ public function mount(?int $discussionId = null): void ])); } - public function form(Form $form): Form + public function form(Schema $schema): Schema { - return $form - ->schema([ - Forms\Components\Hidden::make('user_id'), - Forms\Components\TextInput::make('title') + return $schema + ->components([ + Components\Hidden::make('user_id'), + Components\TextInput::make('title') ->label(__('validation.attributes.title')) ->helperText(__('pages/discussion.min_discussion_length')) ->required() ->live(onBlur: true) - ->afterStateUpdated(function (string $operation, $state, Forms\Set $set): void { + ->afterStateUpdated(function (string $operation, $state, Set $set): void { $set('slug', Str::slug($state)); }) ->minLength(10), - Forms\Components\Hidden::make('slug'), - Forms\Components\Select::make('tags') + Components\Hidden::make('slug'), + Components\Select::make('tags') ->multiple() ->relationship( name: 'tags', titleAttribute: 'name', - modifyQueryUsing: fn ($query) => $query->whereRaw("jsonb_exists(concerns::jsonb, ?)", ['discussion']) + modifyQueryUsing: fn ($query) => $query->whereRaw('jsonb_exists(concerns::jsonb, ?)', ['discussion']) ) ->required() ->minItems(1) ->maxItems(3) ->preload(), - Forms\Components\ToggleButtons::make('locale') + Components\ToggleButtons::make('locale') ->label(__('validation.attributes.locale')) ->options(['en' => 'En', 'fr' => 'Fr']) ->helperText(__('global.locale_help')) ->grouped(), - Forms\Components\MarkdownEditor::make('body') + Components\MarkdownEditor::make('body') ->toolbarButtons([ 'blockquote', 'bold', @@ -88,8 +93,9 @@ public function form(Form $form): Form ->maxHeight('18.25rem') ->required() ->minLength(20), - Forms\Components\Placeholder::make('') - ->content(fn (): HtmlString => new HtmlString(Blade::render(<<<'Blade' + TextEntry::make('placeholder') + ->hiddenLabel() + ->state(fn (): HtmlString => new HtmlString(Blade::render(<<<'Blade' Blade))), ]) diff --git a/app/Livewire/Components/Slideovers/ThreadForm.php b/app/Livewire/Components/Slideovers/ThreadForm.php index 3fae788d..686828a6 100644 --- a/app/Livewire/Components/Slideovers/ThreadForm.php +++ b/app/Livewire/Components/Slideovers/ThreadForm.php @@ -9,11 +9,15 @@ use App\Exceptions\UnverifiedUserException; use App\Livewire\Traits\WithAuthenticatedUser; use App\Models\Thread; -use Filament\Forms; +use Filament\Actions\Concerns\InteractsWithActions; +use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components; use Filament\Forms\Concerns\InteractsWithForms; use Filament\Forms\Contracts\HasForms; -use Filament\Forms\Form; +use Filament\Infolists\Components\TextEntry; use Filament\Notifications\Notification; +use Filament\Schemas\Components\Utilities\Set; +use Filament\Schemas\Schema; use Illuminate\Contracts\View\View; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Blade; @@ -22,10 +26,11 @@ use Laravelcm\LivewireSlideOvers\SlideOverComponent; /** - * @property Form $form + * @property \Filament\Schemas\Schema $form */ -final class ThreadForm extends SlideOverComponent implements HasForms +final class ThreadForm extends SlideOverComponent implements HasActions, HasForms { + use InteractsWithActions; use InteractsWithForms; use WithAuthenticatedUser; @@ -55,29 +60,29 @@ public static function closePanelOnClickAway(): bool return false; } - public function form(Form $form): Form + public function form(Schema $schema): Schema { - return $form - ->schema([ - Forms\Components\Hidden::make('user_id'), - Forms\Components\TextInput::make('title') + return $schema + ->components([ + Components\Hidden::make('user_id'), + Components\TextInput::make('title') ->label(__('validation.attributes.title')) ->helperText(__('pages/forum.min_thread_length')) ->required() ->live(onBlur: true) - ->afterStateUpdated(function (string $operation, $state, Forms\Set $set): void { + ->afterStateUpdated(function (string $operation, $state, Set $set): void { $set('slug', Str::slug($state)); }) ->minLength(10), - Forms\Components\Hidden::make('slug'), - Forms\Components\Select::make('channels') + Components\Hidden::make('slug'), + Components\Select::make('channels') ->multiple() ->relationship(titleAttribute: 'name') ->preload() ->required() ->minItems(1) ->maxItems(3), - Forms\Components\ToggleButtons::make('locale') + Components\ToggleButtons::make('locale') ->label(__('validation.attributes.locale')) ->options([ 'en' => 'En', @@ -85,7 +90,7 @@ public function form(Form $form): Form ]) ->helperText(__('global.locale_help')) ->grouped(), - Forms\Components\MarkdownEditor::make('body') + Components\MarkdownEditor::make('body') ->fileAttachmentsDisk('public') ->toolbarButtons([ 'attachFiles', @@ -98,8 +103,9 @@ public function form(Form $form): Form ->label(__('validation.attributes.content')) ->required() ->minLength(20), - Forms\Components\Placeholder::make('') - ->content(fn (): HtmlString => new HtmlString(Blade::render(<<<'Blade' + TextEntry::make('placeholder') + ->hiddenLabel() + ->state(fn (): HtmlString => new HtmlString(Blade::render(<<<'Blade' Blade))), ]) diff --git a/app/Livewire/Components/SponsorSubscription.php b/app/Livewire/Components/SponsorSubscription.php index d55b7b70..fa81b18e 100644 --- a/app/Livewire/Components/SponsorSubscription.php +++ b/app/Livewire/Components/SponsorSubscription.php @@ -8,11 +8,17 @@ use App\Enums\TransactionType; use App\Models\Transaction; use App\Models\User; -use Filament\Forms; +use Filament\Actions\Concerns\InteractsWithActions; +use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components\Select; +use Filament\Forms\Components\TextInput; +use Filament\Forms\Components\ToggleButtons; use Filament\Forms\Concerns\InteractsWithForms; use Filament\Forms\Contracts\HasForms; -use Filament\Forms\Form; use Filament\Notifications\Notification; +use Filament\Schemas\Components\Group; +use Filament\Schemas\Components\Utilities\Get; +use Filament\Schemas\Schema; use Illuminate\Contracts\View\View; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Cache; @@ -23,10 +29,11 @@ use NotchPay\Payment; /** - * @property-read Form $form + * @property-read \Filament\Schemas\Schema $form */ -final class SponsorSubscription extends Component implements HasForms +final class SponsorSubscription extends Component implements HasActions, HasForms { + use InteractsWithActions; use InteractsWithForms; public ?array $data = []; @@ -44,19 +51,19 @@ public function mount(): void ]); } - public function form(Form $form): Form + public function form(Schema $schema): Schema { - return $form - ->schema([ - Forms\Components\TextInput::make('name') + return $schema + ->components([ + TextInput::make('name') ->label(__('validation.attributes.name')) ->minLength(5) ->required(), - Forms\Components\TextInput::make('email') + TextInput::make('email') ->label(__('validation.attributes.email')) ->email() ->required(), - Forms\Components\ToggleButtons::make('profile') + ToggleButtons::make('profile') ->label(__('pages/sponsoring.sponsor_form.profile')) ->options([ 'developer' => __('validation.attributes.freelance'), @@ -67,13 +74,13 @@ public function form(Form $form): Form 'company' => 'phosphor-buildings-duotone', ]) ->grouped(), - Forms\Components\TextInput::make('website') + TextInput::make('website') ->label(__('global.website')) ->prefixIcon('heroicon-m-globe-alt') ->url(), - Forms\Components\Group::make() + Group::make() ->schema([ - Forms\Components\Select::make('currency') + Select::make('currency') ->label(__('validation.attributes.currency')) ->live() ->native() @@ -82,16 +89,16 @@ public function form(Form $form): Form 'eur' => 'EUR', 'usd' => 'USD', ]), - Forms\Components\TextInput::make('amount') + TextInput::make('amount') ->label(__('validation.attributes.amount')) ->integer() ->required() ->afterStateUpdated(fn (?int $state): float|int => filled($state) ? abs($state) : 0) // @phpstan-ignore-line - ->prefix(fn (Forms\Get $get): ?string => match ($get('currency')) { + ->prefix(fn (Get $get): ?string => match ($get('currency')) { 'usd' => '$', default => null }) - ->suffix(fn (Forms\Get $get): ?string => match ($get('currency')) { + ->suffix(fn (Get $get): ?string => match ($get('currency')) { 'eur' => '€', 'xaf' => 'FCFA', default => null, diff --git a/app/Livewire/Components/User/Activities.php b/app/Livewire/Components/User/Activities.php index ee683fa8..c23eedec 100644 --- a/app/Livewire/Components/User/Activities.php +++ b/app/Livewire/Components/User/Activities.php @@ -20,7 +20,7 @@ final class Activities extends Component public function activities(): Collection { return Cache::remember( - key: 'activities.'.$this->user->id, + key: 'user.'.$this->user->id.'.activities', ttl: now()->addDays(3), callback: fn (): Collection => Activity::latestFeed($this->user) ); diff --git a/app/Livewire/Components/User/Password.php b/app/Livewire/Components/User/Password.php index 82d3ddfe..d437490d 100644 --- a/app/Livewire/Components/User/Password.php +++ b/app/Livewire/Components/User/Password.php @@ -4,11 +4,13 @@ namespace App\Livewire\Components\User; -use Filament\Forms; +use Filament\Actions\Concerns\InteractsWithActions; +use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components\TextInput; use Filament\Forms\Concerns\InteractsWithForms; use Filament\Forms\Contracts\HasForms; -use Filament\Forms\Form; use Filament\Notifications\Notification; +use Filament\Schemas\Schema; use Illuminate\Contracts\View\View; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; @@ -16,10 +18,11 @@ use Livewire\Component; /** - * @property Form $form + * @property \Filament\Schemas\Schema $form */ -final class Password extends Component implements HasForms +final class Password extends Component implements HasActions, HasForms { + use InteractsWithActions; use InteractsWithForms; public ?array $data = []; @@ -29,17 +32,17 @@ public function mount(): void $this->form->fill(); } - public function form(Form $form): Form + public function form(Schema $schema): Schema { - return $form - ->schema([ - Forms\Components\TextInput::make('current_password') + return $schema + ->components([ + TextInput::make('current_password') ->label(__('validation.attributes.current_password')) ->password() ->currentPassword() ->required() ->visible(fn (): bool => Auth::user()?->hasPassword() ?? false), - Forms\Components\TextInput::make('password') + TextInput::make('password') ->label(__('validation.attributes.password')) ->helperText(__('pages/account.settings.password_helpText')) ->password() @@ -54,7 +57,7 @@ public function form(Form $form): Form ->uncompromised(), ]) ->confirmed(), - Forms\Components\TextInput::make('password_confirmation') + TextInput::make('password_confirmation') ->label(__('validation.attributes.password_confirmation')) ->password() ->revealable() diff --git a/app/Livewire/Components/User/Preferences.php b/app/Livewire/Components/User/Preferences.php index 8a7a6f63..c5d9dd67 100644 --- a/app/Livewire/Components/User/Preferences.php +++ b/app/Livewire/Components/User/Preferences.php @@ -5,22 +5,26 @@ namespace App\Livewire\Components\User; use App\Models\User; -use Filament\Forms; +use Filament\Actions\Concerns\InteractsWithActions; +use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components\Select; +use Filament\Forms\Components\ToggleButtons; use Filament\Forms\Concerns\InteractsWithForms; use Filament\Forms\Contracts\HasForms; -use Filament\Forms\Form; use Filament\Notifications\Notification; +use Filament\Schemas\Schema; use Illuminate\Contracts\View\View; use Illuminate\Support\Facades\Auth; use Livewire\Attributes\Computed; use Livewire\Component; /** - * @property Form $form + * @property \Filament\Schemas\Schema $form * @property User $user */ -final class Preferences extends Component implements HasForms +final class Preferences extends Component implements HasActions, HasForms { + use InteractsWithActions; use InteractsWithForms; public ?array $data = []; @@ -39,11 +43,11 @@ public function user(): User return Auth::user(); // @phpstan-ignore-line } - public function form(Form $form): Form + public function form(Schema $schema): Schema { - return $form - ->schema([ - Forms\Components\ToggleButtons::make('theme') + return $schema + ->components([ + ToggleButtons::make('theme') ->label('Theme') ->options([ 'light' => 'Light', @@ -54,7 +58,7 @@ public function form(Form $form): Form 'dark' => 'phosphor-moon-duotone', ]) ->grouped(), - Forms\Components\Select::make('locale') + Select::make('locale') ->label(__('global.language')) ->options([ 'fr' => __('global.french'), diff --git a/app/Livewire/Components/User/Profile.php b/app/Livewire/Components/User/Profile.php index 83e27b54..dab55205 100644 --- a/app/Livewire/Components/User/Profile.php +++ b/app/Livewire/Components/User/Profile.php @@ -7,11 +7,17 @@ use App\Actions\User\UpdateUserProfileAction; use App\Models\User; use App\Traits\FormatSocialAccount; -use Filament\Forms; +use Filament\Actions\Concerns\InteractsWithActions; +use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components\SpatieMediaLibraryFileUpload; +use Filament\Forms\Components\Textarea; +use Filament\Forms\Components\TextInput; use Filament\Forms\Concerns\InteractsWithForms; use Filament\Forms\Contracts\HasForms; -use Filament\Forms\Form; use Filament\Notifications\Notification; +use Filament\Schemas\Components\Section; +use Filament\Schemas\Components\Utilities\Set; +use Filament\Schemas\Schema; use Illuminate\Contracts\View\View; use Illuminate\Support\Facades\Blade; use Illuminate\Support\HtmlString; @@ -19,12 +25,13 @@ use Ysfkaya\FilamentPhoneInput\Forms\PhoneInput; /** - * @property Form $form + * @property \Filament\Schemas\Schema $form * @property User $user */ -final class Profile extends Component implements HasForms +final class Profile extends Component implements HasActions, HasForms { use FormatSocialAccount; + use InteractsWithActions; use InteractsWithForms; public ?array $data = []; @@ -40,49 +47,49 @@ public function mount(): void $this->currentUserEmail = $this->user->email; } - public function form(Form $form): Form + public function form(Schema $schema): Schema { - return $form - ->schema([ - Forms\Components\Section::make(__('pages/account.settings.profile_title')) + return $schema + ->components([ + Section::make(__('pages/account.settings.profile_title')) ->description(__('pages/account.settings.profile_description')) ->aside() ->schema([ - Forms\Components\SpatieMediaLibraryFileUpload::make('avatar') + SpatieMediaLibraryFileUpload::make('avatar') ->label(__('validation.attributes.avatar')) ->collection('avatar') ->helperText(__('pages/account.settings.avatar_description')) ->image() ->avatar() ->maxSize(1024), - Forms\Components\TextInput::make('username') + TextInput::make('username') ->label(__('validation.attributes.username')) ->prefix('laravel.cm/user/@') ->required() ->unique(ignoreRecord: true) ->maxLength(30) ->rules(['lowercase', 'alpha_dash']), - Forms\Components\Textarea::make('bio') + Textarea::make('bio') ->label(__('validation.attributes.bio')) ->hint(__('global.characters', ['number' => 160])) ->maxLength(160) ->afterStateUpdated(fn (?string $state): string => trim(strip_tags((string) $state))) ->helperText(__('pages/account.settings.bio_description')), - Forms\Components\TextInput::make('website') + TextInput::make('website') ->label(__('validation.attributes.website')) ->prefixIcon('untitledui-globe') ->placeholder('https://laravel.cm') ->url(), ]), - Forms\Components\Section::make(__('pages/account.settings.personal_information_title')) + Section::make(__('pages/account.settings.personal_information_title')) ->description(__('pages/account.settings.personal_information_description')) ->aside() ->schema([ - Forms\Components\TextInput::make('name') + TextInput::make('name') ->label(__('validation.attributes.last_name')) ->required(), - Forms\Components\TextInput::make('email') + TextInput::make('email') ->label(__('validation.attributes.email')) ->suffixIcon(fn (): string => $this->user->hasVerifiedEmail() ? 'heroicon-m-check-circle' : 'heroicon-m-exclamation-triangle') ->suffixIconColor(fn (): string => $this->user->hasVerifiedEmail() ? 'success' : 'warning') @@ -90,22 +97,22 @@ public function form(Form $form): Form ->email() ->unique(ignoreRecord: true) ->required(), - Forms\Components\TextInput::make('location') + TextInput::make('location') ->label(__('validation.attributes.location')), PhoneInput::make('phone_number') ->label(__('validation.attributes.phone')), ]), - Forms\Components\Section::make(__('pages/account.settings.social_network_title')) + Section::make(__('pages/account.settings.social_network_title')) ->description(__('pages/account.settings.social_network_description')) ->aside() ->schema([ - Forms\Components\TextInput::make('github_profile') + TextInput::make('github_profile') ->label(__('GitHub')) ->placeholder('laravelcm') ->unique(ignoreRecord: true) ->maxLength(255) - ->afterStateUpdated(fn (Forms\Set $set, ?string $state): mixed => $set('github_profile', $this->formatGithubHandle($state))) + ->afterStateUpdated(fn (Set $set, ?string $state): mixed => $set('github_profile', $this->formatGithubHandle($state))) ->prefix( fn (): HtmlString => new HtmlString(Blade::render(<<<'Blade' Blade)) ), - Forms\Components\TextInput::make('twitter_profile') + TextInput::make('twitter_profile') ->label(__('Twitter')) ->helperText(__('pages/account.settings.twitter_helper_text')) ->unique(ignoreRecord: true) ->maxLength(255) - ->afterStateUpdated(fn (Forms\Set $set, ?string $state): mixed => $set('twitter_profile', $this->formatTwitterHandle($state))) + ->afterStateUpdated(fn (Set $set, ?string $state): mixed => $set('twitter_profile', $this->formatTwitterHandle($state))) ->prefix( fn (): HtmlString => new HtmlString(Blade::render(<<<'Blade' Blade)) ), - Forms\Components\TextInput::make('linkedin_profile') + TextInput::make('linkedin_profile') ->label(__('LinkedIn')) ->placeholder('laravelcm') ->unique(ignoreRecord: true) ->maxLength(255) - ->afterStateUpdated(fn (Forms\Set $set, ?string $state): mixed => $set('linkedin_profile', $this->formatLinkedinHandle($state))) + ->afterStateUpdated(fn (Set $set, ?string $state): mixed => $set('linkedin_profile', $this->formatLinkedinHandle($state))) ->prefix( fn (): HtmlString => new HtmlString(Blade::render(<<<'Blade' $tags + * @property Collection $tags */ #[ObservedBy(ArticleObserver::class)] final class Article extends Model implements HasMedia, ReactableInterface, Sitemapable, Viewable diff --git a/app/Models/Channel.php b/app/Models/Channel.php index afb44073..aad1dbfb 100644 --- a/app/Models/Channel.php +++ b/app/Models/Channel.php @@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\Pivot; +use Illuminate\Support\Collection; use Spatie\Translatable\HasTranslations; /** @@ -22,8 +23,8 @@ * @property-read string $color * @property-read int|null $parent_id * @property-read Channel|null $parent - * @property-read \Illuminate\Support\Collection $items - * @property-read \Illuminate\Support\Collection $threads + * @property-read Collection $items + * @property-read Collection $threads */ final class Channel extends Model { diff --git a/app/Models/Discussion.php b/app/Models/Discussion.php index f43763f9..ef69fceb 100644 --- a/app/Models/Discussion.php +++ b/app/Models/Discussion.php @@ -23,6 +23,7 @@ use CyrildeWit\EloquentViewable\InteractsWithViews; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Collection; use Illuminate\Support\Str; use Spatie\Sitemap\Contracts\Sitemapable; use Spatie\Sitemap\Tags\Url; @@ -40,10 +41,10 @@ * @property-read User $user * @property-read \Illuminate\Support\Carbon $created_at * @property-read \Illuminate\Support\Carbon $updated_at - * @property-read \Illuminate\Support\Collection $spamReports - * @property-read \Illuminate\Support\Collection $replies - * @property-read \Illuminate\Support\Collection $tags - * @property-read \Illuminate\Support\Collection $reactions + * @property-read Collection $spamReports + * @property-read Collection $replies + * @property-read Collection $tags + * @property-read Collection $reactions */ final class Discussion extends Model implements ReactableInterface, ReplyInterface, Sitemapable, SpamReportableContract, SubscribeInterface, Viewable { diff --git a/app/Models/Reply.php b/app/Models/Reply.php index 8aaa3dd5..4159aedb 100644 --- a/app/Models/Reply.php +++ b/app/Models/Reply.php @@ -77,7 +77,7 @@ public function mentionedUsers(): array return $matches[1]; } - public function to(ReplyInterface $replyable): void + public function to(ReplyInterface|Model $replyable): void { $this->replyAble()->associate($replyable); // @phpstan-ignore-line } @@ -86,9 +86,9 @@ public function to(ReplyInterface $replyable): void * @param Builder $query */ #[Scope] - protected function isSolution(Builder $query): void + protected function isSolution(Builder $query): Builder { - $query->has('solutionTo'); + return $query->has('solutionTo'); } public function delete(): bool diff --git a/app/Models/Tag.php b/app/Models/Tag.php index b78b4f48..26030b08 100644 --- a/app/Models/Tag.php +++ b/app/Models/Tag.php @@ -7,7 +7,9 @@ use App\Models\Traits\HasSlug; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\MorphPivot; use Illuminate\Database\Eloquent\Relations\MorphToMany; +use Illuminate\Support\Collection; /** * @property-read int $id @@ -15,7 +17,7 @@ * @property-read string $slug * @property-read string|null $description * @property-read array $concerns - * @property-read \Illuminate\Support\Collection $articles + * @property-read Collection $articles */ final class Tag extends Model { @@ -34,7 +36,7 @@ protected function casts(): array } /** - * @return MorphToMany + * @return MorphToMany */ public function articles(): MorphToMany { diff --git a/app/Models/Thread.php b/app/Models/Thread.php index c65426d6..60c77b3c 100644 --- a/app/Models/Thread.php +++ b/app/Models/Thread.php @@ -21,6 +21,7 @@ use Carbon\Carbon; use CyrildeWit\EloquentViewable\Contracts\Viewable; use CyrildeWit\EloquentViewable\InteractsWithViews; +use Database\Factories\ThreadFactory; use Exception; use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Builder; @@ -59,6 +60,8 @@ final class Thread extends Model implements Feedable, ReactableInterface, ReplyInterface, SpamReportableContract, SubscribeInterface, Viewable { use HasAuthor; + + /** @use HasFactory */ use HasFactory; use HasLocaleScope; use HasReplies; @@ -70,7 +73,7 @@ final class Thread extends Model implements Feedable, ReactableInterface, ReplyI use Reactable; use RecordsActivity; - public const FEED_PAGE_SIZE = 20; + public const int FEED_PAGE_SIZE = 20; protected $guarded = []; diff --git a/app/Models/User.php b/app/Models/User.php index 05adb35e..4f43f091 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -27,6 +27,7 @@ use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Auth; use Laravel\Socialite\Contracts\User as SocialUser; use Laravelcm\Gamify\Traits\Gamify; @@ -51,12 +52,12 @@ * @property-read string|null $website * @property-read string|null $banned_reason * @property-read array|null $settings - * @property-read \Illuminate\Support\Carbon|null $email_verified_at - * @property-read \Illuminate\Support\Carbon|null $last_login_at - * @property-read \Illuminate\Support\Carbon|null $banned_at - * @property-read \Illuminate\Support\Carbon $created_at - * @property-read \Illuminate\Support\Carbon $updated_at - * @property-read \Illuminate\Support\Carbon|null $last_active_at + * @property-read Carbon|null $email_verified_at + * @property-read Carbon|null $last_login_at + * @property-read Carbon|null $banned_at + * @property-read Carbon $created_at + * @property-read Carbon $updated_at + * @property-read Carbon|null $last_active_at * @property-read \Illuminate\Support\Collection $activities * @property-read \Illuminate\Support\Collection $articles * @property-read \Illuminate\Support\Collection $threads @@ -68,10 +69,10 @@ #[ObservedBy(UserObserver::class)] final class User extends Authenticatable implements FilamentUser, HasAvatar, HasCachedMediaInterface, HasMedia, HasName, MustVerifyEmail { + use Gamify; + /** @use HasFactory */ use HasFactory; - - use Gamify; use HasPlanSubscriptions; use HasProfilePhoto; use HasRoles; diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index dbddac59..d488ed98 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -14,11 +14,11 @@ use App\View\Composers\ProfileUsersComposer; use App\View\Composers\TopContributorsComposer; use Carbon\Carbon; +use Filament\Actions; use Filament\Support\Colors\Color; -use Filament\Support\Enums\MaxWidth; +use Filament\Support\Enums\Width; use Filament\Support\Facades\FilamentColor; use Filament\Support\Facades\FilamentIcon; -use Filament\Tables; use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\DB; @@ -86,7 +86,6 @@ protected function configureEloquent(): void protected function configureFilament(): void { FilamentColor::register([ - 'primary' => Color::Emerald, 'danger' => Color::Red, 'info' => Color::Blue, 'success' => Color::Green, @@ -99,17 +98,21 @@ protected function configureFilament(): void 'actions::edit-action' => 'untitledui-edit-03', ]); - Tables\Actions\CreateAction::configureUsing( - fn (Tables\Actions\Action $action): Tables\Actions\Action => $action->iconButton() - ->modalWidth(MaxWidth::ExtraLarge) + Actions\CreateAction::configureUsing( + fn (Actions\Action $action): Actions\Action => $action->iconButton() + ->modalWidth(Width::ExtraLarge) ->slideOver() ); - Tables\Actions\EditAction::configureUsing( - fn (Tables\Actions\Action $action): Tables\Actions\Action => $action->iconButton() - ->modalWidth(MaxWidth::ExtraLarge) + Actions\EditAction::configureUsing( + fn (Actions\Action $action): Actions\Action => $action->iconButton() + ->modalWidth(Width::ExtraLarge) ->slideOver() ); + + Actions\DeleteAction::configureUsing( + fn (Actions\Action $action): Actions\Action => $action->iconButton() + ); } protected function registerLocaleDate(): void diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index e59fe0af..f86e4af6 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -4,13 +4,14 @@ namespace App\Providers\Filament; +use Backstage\FilamentMails\FilamentMails; +use Backstage\FilamentMails\FilamentMailsPlugin; use Filament\Http\Middleware\Authenticate; use Filament\Http\Middleware\DisableBladeIconComponents; use Filament\Http\Middleware\DispatchServingFilamentEvent; -use Filament\Pages; +use Filament\Pages\Dashboard; use Filament\Panel; use Filament\PanelProvider; -use Filament\SpatieLaravelTranslatablePlugin; use Illuminate\Contracts\View\View; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Cookie\Middleware\EncryptCookies; @@ -19,8 +20,7 @@ use Illuminate\Session\Middleware\AuthenticateSession; use Illuminate\Session\Middleware\StartSession; use Illuminate\View\Middleware\ShareErrorsFromSession; -use Vormkracht10\FilamentMails\Facades\FilamentMails; -use Vormkracht10\FilamentMails\FilamentMailsPlugin; +use LaraZeus\SpatieTranslatable\SpatieTranslatablePlugin; final class AdminPanelProvider extends PanelProvider { @@ -44,13 +44,13 @@ public function panel(Panel $panel): Panel ->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages') ->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets') ->pages([ - Pages\Dashboard::class, + Dashboard::class, ]) ->widgets([ // ]) ->plugins([ - SpatieLaravelTranslatablePlugin::make() + SpatieTranslatablePlugin::make() ->defaultLocales(['fr', 'en']), FilamentMailsPlugin::make(), ]) diff --git a/app/Services/CacheInvalidationService.php b/app/Services/CacheInvalidationService.php index 89f875dd..6e201aac 100644 --- a/app/Services/CacheInvalidationService.php +++ b/app/Services/CacheInvalidationService.php @@ -38,6 +38,7 @@ namespace App\Services; +use Exception; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Redis; @@ -64,7 +65,7 @@ private function invalidateRedisPattern(string $pattern): void if (! empty($keys)) { Redis::connection($connection)->del($keys); } - } catch (\Exception $e) { + } catch (Exception $e) { $this->invalidateFallbackPattern(); } } diff --git a/app/Traits/HasCachedMedia.php b/app/Traits/HasCachedMedia.php index 986c5baf..680d5cff 100644 --- a/app/Traits/HasCachedMedia.php +++ b/app/Traits/HasCachedMedia.php @@ -5,6 +5,7 @@ namespace App\Traits; use App\Services\MediaCacheService; +use DateTimeInterface; trait HasCachedMedia { @@ -18,7 +19,7 @@ public function getCacheKey(string $collection): string ); } - public function getCacheTtl(): \DateTimeInterface + public function getCacheTtl(): DateTimeInterface { return now()->addYear(); } diff --git a/app/Traits/HasSubscribers.php b/app/Traits/HasSubscribers.php index 5f93e959..bea006ac 100644 --- a/app/Traits/HasSubscribers.php +++ b/app/Traits/HasSubscribers.php @@ -7,9 +7,10 @@ use App\Models\Subscribe; use App\Models\User; use Illuminate\Database\Eloquent\Relations\MorphMany; +use Illuminate\Support\Collection; /** - * @property-read \Illuminate\Support\Collection $subscribes + * @property-read Collection $subscribes */ trait HasSubscribers { diff --git a/app/Traits/Reactable.php b/app/Traits/Reactable.php index a04b4621..629b3723 100644 --- a/app/Traits/Reactable.php +++ b/app/Traits/Reactable.php @@ -7,6 +7,7 @@ use App\Models\Reaction; use App\Models\User; use Illuminate\Database\Eloquent\Collection; +use Illuminate\Database\Eloquent\Relations\MorphPivot; use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; @@ -42,7 +43,7 @@ public function reacted(?User $responder = null): bool } /** - * @return MorphToMany + * @return MorphToMany */ public function reactions(): MorphToMany { diff --git a/app/Traits/RecordsActivity.php b/app/Traits/RecordsActivity.php index 4eaa9edd..755ed390 100644 --- a/app/Traits/RecordsActivity.php +++ b/app/Traits/RecordsActivity.php @@ -50,7 +50,7 @@ protected function recordActivity(string $event, bool $useDefaultEvent = true, a protected function getActivityType(string $event): string { - $type = mb_strtolower((new ReflectionClass($this))->getShortName()); + $type = mb_strtolower(new ReflectionClass($this)->getShortName()); return "{$event}_{$type}"; } diff --git a/app/Traits/UserResponse.php b/app/Traits/UserResponse.php index e075c99f..2748f2ee 100644 --- a/app/Traits/UserResponse.php +++ b/app/Traits/UserResponse.php @@ -7,6 +7,7 @@ use App\Http\Resources\AuthenticateUserResource; use App\Http\Resources\EnterpriseResource; use App\Models\User; +use Illuminate\Support\Collection; /** * @phpstan-ignore trait.unused @@ -14,13 +15,7 @@ trait UserResponse { /** - * @return array{ - * user: AuthenticateUserResource, - * token: string, - * roles: \Illuminate\Support\Collection, - * permissions: \Illuminate\Support\Collection, - * enterprise: EnterpriseResource|null - * } + * @return array{user: AuthenticateUserResource, token: string, roles: Collection, permissions: Collection, enterprise: EnterpriseResource|null} */ public function userMetaData(User $user): array { diff --git a/app/helpers.php b/app/helpers.php index b84b125e..b8c2dd2c 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use App\Models\Discussion; +use App\Models\Thread; use Carbon\Carbon; use GrahamCampbell\Markdown\Facades\Markdown; use Illuminate\Support\Facades\Auth; @@ -83,11 +85,11 @@ function getFilter(string $key, array $filters = [], string $default = 'recent') /** * Returns the route for the replyAble. * - * @param App\Models\Thread|App\Models\Discussion $replyAble + * @param Thread|Discussion $replyAble */ function route_to_reply_able(mixed $replyAble): string { - $routeName = $replyAble instanceof \App\Models\Thread ? 'forum.show' : 'discussions.show'; + $routeName = $replyAble instanceof Thread ? 'forum.show' : 'discussions.show'; return route($routeName, $replyAble->slug); } diff --git a/composer.json b/composer.json index 8f7704e5..4dcae0d7 100644 --- a/composer.json +++ b/composer.json @@ -14,18 +14,18 @@ "ext-fileinfo": "*", "ext-json": "*", "archtechx/laravel-seo": "^0.10", - "awcodes/filament-badgeable-column": "^2.3", + "awcodes/filament-badgeable-column": "^3.0", "codeat3/blade-phosphor-icons": "^2.0", "cyrildewit/eloquent-viewable": "^7.0", "doctrine/dbal": "^4.2.1", - "filament/filament": "^3.3", - "filament/spatie-laravel-media-library-plugin": "^3.3", - "filament/spatie-laravel-translatable-plugin": "^3.3", + "filament/filament": "^4.0", + "filament/spatie-laravel-media-library-plugin": "^4.0", "gehrisandro/tailwind-merge-laravel": "^1.3", "graham-campbell/markdown": "^16.0", "guzzlehttp/guzzle": "^7.7.0", "internachi/modular": "^2.3", "jenssegers/agent": "^2.6.4", + "lara-zeus/spatie-translatable": "^1.0", "laravel-notification-channels/telegram": "^6.0", "laravel-notification-channels/twitter": "^8.1", "laravel/framework": "^12.0", @@ -49,16 +49,17 @@ "spatie/laravel-sitemap": "^7.3", "stevebauman/location": "^7.4.0", "torchlight/torchlight-laravel": "^0.6", - "vormkracht10/filament-mails": "^2.0", + "vormkracht10/filament-mails": "^3.0", "wire-elements/modal": "^2.0", "wire-elements/spotlight": "^2.0", "yarri/link-finder": "^2.7.10", - "ysfkaya/filament-phone-input": "^3.1" + "ysfkaya/filament-phone-input": "^4.0" }, "require-dev": { "barryvdh/laravel-debugbar": "^3.14", "driftingly/rector-laravel": "^2.0", "fakerphp/faker": "^1.23.0", + "filament/upgrade": "^4.0", "larastan/larastan": "^3.0", "laravel/boost": "^1.1", "laravel/breeze": "^2.0", @@ -133,7 +134,7 @@ } }, "prefer-stable": true, - "minimum-stability": "dev", + "minimum-stability": "stable", "repositories": [ { "type": "path", diff --git a/composer.lock b/composer.lock index 9ff42f13..c4834013 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "385c5568979dfa8b9579bf223bf15492", + "content-hash": "e6a46905189ec7d3b819e5548e20989d", "packages": [ { "name": "abraham/twitteroauth", @@ -194,38 +194,43 @@ }, { "name": "awcodes/filament-badgeable-column", - "version": "v2.3.3", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/awcodes/filament-badgeable-column.git", - "reference": "cd063e35670ed1f7303ed2be9a86afd66d45e5e7" + "reference": "95a511246a746d375c58bc9290eb853b5211519a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awcodes/filament-badgeable-column/zipball/cd063e35670ed1f7303ed2be9a86afd66d45e5e7", - "reference": "cd063e35670ed1f7303ed2be9a86afd66d45e5e7", + "url": "https://api.github.com/repos/awcodes/filament-badgeable-column/zipball/95a511246a746d375c58bc9290eb853b5211519a", + "reference": "95a511246a746d375c58bc9290eb853b5211519a", "shasum": "" }, "require": { - "filament/filament": "^3.0", - "php": "^8.1", + "filament/filament": "^4.0", + "php": "^8.2", "spatie/laravel-package-tools": "^1.15" }, "require-dev": { "laravel/pint": "^1.0", + "orchestra/testbench": "^9.0|^10.0", + "pestphp/pest": "^3.7", + "pestphp/pest-plugin-laravel": "^3.0", + "pestphp/pest-plugin-livewire": "^3.0", + "rector/rector": "^2.0", "spatie/laravel-ray": "^1.26" }, "type": "library", "extra": { "laravel": { "providers": [ - "Awcodes\\FilamentBadgeableColumn\\BadgeableColumnServiceProvider" + "Awcodes\\BadgeableColumn\\BadgeableColumnServiceProvider" ] } }, "autoload": { "psr-4": { - "Awcodes\\FilamentBadgeableColumn\\": "src" + "Awcodes\\BadgeableColumn\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -240,17 +245,17 @@ } ], "description": "Filament Tables column to append and prepend badges.", - "homepage": "https://github.com/awcodes/badger", + "homepage": "https://github.com/awcodes/filament-badgeable-column", "keywords": [ "awcodes", - "badger", + "badgeable-column", "filament", - "filament-badgeable-column", - "laravel" + "laravel", + "plugin" ], "support": { "issues": "https://github.com/awcodes/filament-badgeable-column/issues", - "source": "https://github.com/awcodes/filament-badgeable-column/tree/v2.3.3" + "source": "https://github.com/awcodes/filament-badgeable-column/tree/v3.0.0" }, "funding": [ { @@ -258,7 +263,7 @@ "type": "github" } ], - "time": "2025-05-12T00:33:53+00:00" + "time": "2025-08-12T14:34:30+00:00" }, { "name": "aws/aws-crt-php", @@ -316,16 +321,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.356.23", + "version": "3.356.28", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "e9253cf6073f06080a7458af54e18fc474f0c864" + "reference": "aaf809461033836d120f3bbf7a4cf67e946281d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/e9253cf6073f06080a7458af54e18fc474f0c864", - "reference": "e9253cf6073f06080a7458af54e18fc474f0c864", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/aaf809461033836d120f3bbf7a4cf67e946281d1", + "reference": "aaf809461033836d120f3bbf7a4cf67e946281d1", "shasum": "" }, "require": { @@ -407,9 +412,88 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.356.23" + "source": "https://github.com/aws/aws-sdk-php/tree/3.356.28" + }, + "time": "2025-09-29T18:04:14+00:00" + }, + { + "name": "backstage/laravel-mails", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/backstagephp/laravel-mails.git", + "reference": "b590728f2295be781ea19abd0275783d1598ca5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/backstagephp/laravel-mails/zipball/b590728f2295be781ea19abd0275783d1598ca5c", + "reference": "b590728f2295be781ea19abd0275783d1598ca5c", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0 || ^11.0 || ^12.0", + "laravel/helpers": "^1.7.0", + "php": "^8.2", + "spatie/laravel-package-tools": "^1.15.0" + }, + "require-dev": { + "larastan/larastan": "^3.0", + "laravel-notification-channels/discord": "^1.6", + "laravel-notification-channels/telegram": "^4.0 || ^5.0 || ^6.0", + "laravel/pint": "^1.17.0", + "laravel/slack-notification-channel": "^2.5 || ^3.3.2", + "nunomaduro/collision": "^7.5.0|^8.4", + "orchestra/testbench": "^8.5.0|^9.4.0", + "pestphp/pest": "^3.0", + "pestphp/pest-plugin-laravel": "^3.0", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Backstage\\Mails\\MailsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Backstage\\Mails\\": "src", + "Backstage\\Mails\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark van Eijk", + "email": "mark@vormkracht10.nl", + "role": "Developer" + } + ], + "description": "Laravel Mails can collect everything you might want to track about the mails that has been sent by your Laravel app.", + "homepage": "https://github.com/backstagephp/laravel-mails", + "keywords": [ + "backstagephp", + "laravel", + "laravel-mails" + ], + "support": { + "issues": "https://github.com/backstagephp/laravel-mails/issues", + "source": "https://github.com/backstagephp/laravel-mails/tree/v2.1.0" }, - "time": "2025-09-22T18:10:31+00:00" + "funding": [ + { + "url": "https://github.com/vormkracht10", + "type": "github" + } + ], + "time": "2025-07-22T08:08:52+00:00" }, { "name": "blade-ui-kit/blade-heroicons", @@ -690,6 +774,165 @@ ], "time": "2024-02-09T16:56:22+00:00" }, + { + "name": "chillerlan/php-qrcode", + "version": "5.0.4", + "source": { + "type": "git", + "url": "https://github.com/chillerlan/php-qrcode.git", + "reference": "390393e97a6e42ccae0e0d6205b8d4200f7ddc43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/390393e97a6e42ccae0e0d6205b8d4200f7ddc43", + "reference": "390393e97a6e42ccae0e0d6205b8d4200f7ddc43", + "shasum": "" + }, + "require": { + "chillerlan/php-settings-container": "^2.1.6 || ^3.2.1", + "ext-mbstring": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "chillerlan/php-authenticator": "^4.3.1 || ^5.2.1", + "ext-fileinfo": "*", + "phan/phan": "^5.5.1", + "phpcompatibility/php-compatibility": "10.x-dev", + "phpmd/phpmd": "^2.15", + "phpunit/phpunit": "^9.6", + "setasign/fpdf": "^1.8.2", + "slevomat/coding-standard": "^8.23.0", + "squizlabs/php_codesniffer": "^4.0.0" + }, + "suggest": { + "chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.", + "setasign/fpdf": "Required to use the QR FPDF output.", + "simple-icons/simple-icons": "SVG icons that you can use to embed as logos in the QR Code" + }, + "type": "library", + "autoload": { + "psr-4": { + "chillerlan\\QRCode\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT", + "Apache-2.0" + ], + "authors": [ + { + "name": "Kazuhiko Arase", + "homepage": "https://github.com/kazuhikoarase/qrcode-generator" + }, + { + "name": "ZXing Authors", + "homepage": "https://github.com/zxing/zxing" + }, + { + "name": "Ashot Khanamiryan", + "homepage": "https://github.com/khanamiryan/php-qrcode-detector-decoder" + }, + { + "name": "Smiley", + "email": "smiley@chillerlan.net", + "homepage": "https://github.com/codemasher" + }, + { + "name": "Contributors", + "homepage": "https://github.com/chillerlan/php-qrcode/graphs/contributors" + } + ], + "description": "A QR Code generator and reader with a user-friendly API. PHP 7.4+", + "homepage": "https://github.com/chillerlan/php-qrcode", + "keywords": [ + "phpqrcode", + "qr", + "qr code", + "qr-reader", + "qrcode", + "qrcode-generator", + "qrcode-reader" + ], + "support": { + "docs": "https://php-qrcode.readthedocs.io", + "issues": "https://github.com/chillerlan/php-qrcode/issues", + "source": "https://github.com/chillerlan/php-qrcode" + }, + "funding": [ + { + "url": "https://ko-fi.com/codemasher", + "type": "Ko-Fi" + } + ], + "time": "2025-09-19T17:30:27+00:00" + }, + { + "name": "chillerlan/php-settings-container", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/chillerlan/php-settings-container.git", + "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/95ed3e9676a1d47cab2e3174d19b43f5dbf52681", + "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^8.1" + }, + "require-dev": { + "phpmd/phpmd": "^2.15", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-deprecation-rules": "^1.2", + "phpunit/phpunit": "^10.5", + "squizlabs/php_codesniffer": "^3.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "chillerlan\\Settings\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Smiley", + "email": "smiley@chillerlan.net", + "homepage": "https://github.com/codemasher" + } + ], + "description": "A container class for immutable settings objects. Not a DI container.", + "homepage": "https://github.com/chillerlan/php-settings-container", + "keywords": [ + "Settings", + "configuration", + "container", + "helper" + ], + "support": { + "issues": "https://github.com/chillerlan/php-settings-container/issues", + "source": "https://github.com/chillerlan/php-settings-container" + }, + "funding": [ + { + "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4", + "type": "custom" + }, + { + "url": "https://ko-fi.com/codemasher", + "type": "ko_fi" + } + ], + "time": "2024-07-16T11:13:48+00:00" + }, { "name": "codeat3/blade-phosphor-icons", "version": "2.3.0", @@ -2102,16 +2345,16 @@ }, { "name": "filament/actions", - "version": "v3.3.39", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/filamentphp/actions.git", - "reference": "9eaddc610d9adc00d738b8b116cea1be35a88f85" + "reference": "4ec445a337f5d547469896dff3d4f30c5c394d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/actions/zipball/9eaddc610d9adc00d738b8b116cea1be35a88f85", - "reference": "9eaddc610d9adc00d738b8b116cea1be35a88f85", + "url": "https://api.github.com/repos/filamentphp/actions/zipball/4ec445a337f5d547469896dff3d4f30c5c394d71", + "reference": "4ec445a337f5d547469896dff3d4f30c5c394d71", "shasum": "" }, "require": { @@ -2120,13 +2363,9 @@ "filament/infolists": "self.version", "filament/notifications": "self.version", "filament/support": "self.version", - "illuminate/contracts": "^10.45|^11.0|^12.0", - "illuminate/database": "^10.45|^11.0|^12.0", - "illuminate/support": "^10.45|^11.0|^12.0", "league/csv": "^9.16", "openspout/openspout": "^4.23", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "php": "^8.2" }, "type": "library", "extra": { @@ -2151,43 +2390,35 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2025-07-16T08:51:11+00:00" + "time": "2025-09-29T08:02:20+00:00" }, { "name": "filament/filament", - "version": "v3.3.39", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/filamentphp/panels.git", - "reference": "243d0493131ed01e3442d8f023f08f07c85c338f" + "reference": "5aeda3f8bb64e85ec3eb16bc7f5bee65b134f66c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/panels/zipball/243d0493131ed01e3442d8f023f08f07c85c338f", - "reference": "243d0493131ed01e3442d8f023f08f07c85c338f", + "url": "https://api.github.com/repos/filamentphp/panels/zipball/5aeda3f8bb64e85ec3eb16bc7f5bee65b134f66c", + "reference": "5aeda3f8bb64e85ec3eb16bc7f5bee65b134f66c", "shasum": "" }, "require": { - "danharrin/livewire-rate-limiting": "^0.3|^1.0|^2.0", + "chillerlan/php-qrcode": "^5.0", "filament/actions": "self.version", "filament/forms": "self.version", "filament/infolists": "self.version", "filament/notifications": "self.version", + "filament/schemas": "self.version", "filament/support": "self.version", "filament/tables": "self.version", "filament/widgets": "self.version", - "illuminate/auth": "^10.45|^11.0|^12.0", - "illuminate/console": "^10.45|^11.0|^12.0", - "illuminate/contracts": "^10.45|^11.0|^12.0", - "illuminate/cookie": "^10.45|^11.0|^12.0", - "illuminate/database": "^10.45|^11.0|^12.0", - "illuminate/http": "^10.45|^11.0|^12.0", - "illuminate/routing": "^10.45|^11.0|^12.0", - "illuminate/session": "^10.45|^11.0|^12.0", - "illuminate/support": "^10.45|^11.0|^12.0", - "illuminate/view": "^10.45|^11.0|^12.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "php": "^8.2", + "pragmarx/google2fa": "^8.0", + "pragmarx/google2fa-qrcode": "^3.0" }, "type": "library", "extra": { @@ -2216,35 +2447,29 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2025-09-16T09:11:33+00:00" + "time": "2025-09-29T08:02:23+00:00" }, { "name": "filament/forms", - "version": "v3.3.39", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/filamentphp/forms.git", - "reference": "1927793682979fa435f7c3d29a40306b8a526297" + "reference": "d6482a25e5f0a876a24a638df221c52011678363" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/forms/zipball/1927793682979fa435f7c3d29a40306b8a526297", - "reference": "1927793682979fa435f7c3d29a40306b8a526297", + "url": "https://api.github.com/repos/filamentphp/forms/zipball/d6482a25e5f0a876a24a638df221c52011678363", + "reference": "d6482a25e5f0a876a24a638df221c52011678363", "shasum": "" }, "require": { "danharrin/date-format-converter": "^0.3", "filament/actions": "self.version", + "filament/schemas": "self.version", "filament/support": "self.version", - "illuminate/console": "^10.45|^11.0|^12.0", - "illuminate/contracts": "^10.45|^11.0|^12.0", - "illuminate/database": "^10.45|^11.0|^12.0", - "illuminate/filesystem": "^10.45|^11.0|^12.0", - "illuminate/support": "^10.45|^11.0|^12.0", - "illuminate/validation": "^10.45|^11.0|^12.0", - "illuminate/view": "^10.45|^11.0|^12.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "php": "^8.2", + "ueberdosis/tiptap-php": "^2.0" }, "type": "library", "extra": { @@ -2272,33 +2497,27 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2025-09-16T09:09:34+00:00" + "time": "2025-09-29T08:02:24+00:00" }, { "name": "filament/infolists", - "version": "v3.3.39", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/filamentphp/infolists.git", - "reference": "4533c2ccb6ef06ab7f27d81e27be0cdd4f5e72de" + "reference": "0817b9c0e5e15e0e19b57e01322083b80cf4b715" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/infolists/zipball/4533c2ccb6ef06ab7f27d81e27be0cdd4f5e72de", - "reference": "4533c2ccb6ef06ab7f27d81e27be0cdd4f5e72de", + "url": "https://api.github.com/repos/filamentphp/infolists/zipball/0817b9c0e5e15e0e19b57e01322083b80cf4b715", + "reference": "0817b9c0e5e15e0e19b57e01322083b80cf4b715", "shasum": "" }, "require": { "filament/actions": "self.version", + "filament/schemas": "self.version", "filament/support": "self.version", - "illuminate/console": "^10.45|^11.0|^12.0", - "illuminate/contracts": "^10.45|^11.0|^12.0", - "illuminate/database": "^10.45|^11.0|^12.0", - "illuminate/filesystem": "^10.45|^11.0|^12.0", - "illuminate/support": "^10.45|^11.0|^12.0", - "illuminate/view": "^10.45|^11.0|^12.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "php": "^8.2" }, "type": "library", "extra": { @@ -2323,31 +2542,26 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2025-08-12T13:15:27+00:00" + "time": "2025-09-29T08:02:20+00:00" }, { "name": "filament/notifications", - "version": "v3.3.39", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/filamentphp/notifications.git", - "reference": "adc118c7fc34a423f3c01d6936ad0316f489949c" + "reference": "33c1d2291747873838c0eedea73c9f7e9784eee7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/notifications/zipball/adc118c7fc34a423f3c01d6936ad0316f489949c", - "reference": "adc118c7fc34a423f3c01d6936ad0316f489949c", + "url": "https://api.github.com/repos/filamentphp/notifications/zipball/33c1d2291747873838c0eedea73c9f7e9784eee7", + "reference": "33c1d2291747873838c0eedea73c9f7e9784eee7", "shasum": "" }, "require": { "filament/actions": "self.version", "filament/support": "self.version", - "illuminate/contracts": "^10.45|^11.0|^12.0", - "illuminate/filesystem": "^10.45|^11.0|^12.0", - "illuminate/notifications": "^10.45|^11.0|^12.0", - "illuminate/support": "^10.45|^11.0|^12.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "php": "^8.2" }, "type": "library", "extra": { @@ -2359,7 +2573,7 @@ }, "autoload": { "files": [ - "src/Testing/Autoload.php" + "src/Testing/helpers.php" ], "psr-4": { "Filament\\Notifications\\": "src" @@ -2375,74 +2589,73 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2025-07-08T20:42:18+00:00" + "time": "2025-09-29T08:02:25+00:00" }, { - "name": "filament/spatie-laravel-media-library-plugin", - "version": "v3.3.39", + "name": "filament/schemas", + "version": "v4.1.0", "source": { "type": "git", - "url": "https://github.com/filamentphp/spatie-laravel-media-library-plugin.git", - "reference": "bd7c12baf30cc66b2f088bd0257b12071e15addf" + "url": "https://github.com/filamentphp/schemas.git", + "reference": "d5709fcc269c268436ae74292338f77e4f5a2aa4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/spatie-laravel-media-library-plugin/zipball/bd7c12baf30cc66b2f088bd0257b12071e15addf", - "reference": "bd7c12baf30cc66b2f088bd0257b12071e15addf", + "url": "https://api.github.com/repos/filamentphp/schemas/zipball/d5709fcc269c268436ae74292338f77e4f5a2aa4", + "reference": "d5709fcc269c268436ae74292338f77e4f5a2aa4", "shasum": "" }, "require": { + "danharrin/date-format-converter": "^0.3", + "filament/actions": "self.version", "filament/support": "self.version", - "illuminate/support": "^10.45|^11.0|^12.0", - "php": "^8.1", - "spatie/laravel-medialibrary": "^10.0|^11.0" + "php": "^8.2" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Schemas\\SchemasServiceProvider" + ] + } + }, "autoload": { "psr-4": { - "Filament\\": "src" + "Filament\\Schemas\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Filament support for `spatie/laravel-medialibrary`.", + "description": "Easily add beautiful UI to any Livewire component.", "homepage": "https://github.com/filamentphp/filament", "support": { "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2025-07-08T20:42:14+00:00" + "time": "2025-09-29T08:02:21+00:00" }, { - "name": "filament/spatie-laravel-translatable-plugin", - "version": "v3.3.39", + "name": "filament/spatie-laravel-media-library-plugin", + "version": "v4.1.0", "source": { "type": "git", - "url": "https://github.com/filamentphp/spatie-laravel-translatable-plugin.git", - "reference": "7de417487ee7a4edd9e66fb3243a27f84db3f543" + "url": "https://github.com/filamentphp/spatie-laravel-media-library-plugin.git", + "reference": "3e128b5d753b4443252dae003598ba49ce607341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/spatie-laravel-translatable-plugin/zipball/7de417487ee7a4edd9e66fb3243a27f84db3f543", - "reference": "7de417487ee7a4edd9e66fb3243a27f84db3f543", + "url": "https://api.github.com/repos/filamentphp/spatie-laravel-media-library-plugin/zipball/3e128b5d753b4443252dae003598ba49ce607341", + "reference": "3e128b5d753b4443252dae003598ba49ce607341", "shasum": "" }, "require": { "filament/support": "self.version", - "illuminate/support": "^10.45|^11.0|^12.0", - "php": "^8.1", - "spatie/laravel-translatable": "^6.0" + "php": "^8.2", + "spatie/laravel-medialibrary": "^11.0" }, "type": "library", - "extra": { - "laravel": { - "providers": [ - "Filament\\SpatieLaravelTranslatablePluginServiceProvider" - ] - } - }, "autoload": { "psr-4": { "Filament\\": "src" @@ -2452,44 +2665,43 @@ "license": [ "MIT" ], - "description": "Filament support for `spatie/laravel-translatable`.", + "description": "Filament support for `spatie/laravel-medialibrary`.", "homepage": "https://github.com/filamentphp/filament", "support": { "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2025-08-12T13:15:45+00:00" + "time": "2025-09-18T22:21:55+00:00" }, { "name": "filament/support", - "version": "v3.3.39", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/filamentphp/support.git", - "reference": "afafd5e7a2f8cf052f70f989b52d82d0a1df5c78" + "reference": "4fc9653075d5be21154da130386826b7d9230ae6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/support/zipball/afafd5e7a2f8cf052f70f989b52d82d0a1df5c78", - "reference": "afafd5e7a2f8cf052f70f989b52d82d0a1df5c78", + "url": "https://api.github.com/repos/filamentphp/support/zipball/4fc9653075d5be21154da130386826b7d9230ae6", + "reference": "4fc9653075d5be21154da130386826b7d9230ae6", "shasum": "" }, "require": { "blade-ui-kit/blade-heroicons": "^2.5", - "doctrine/dbal": "^3.2|^4.0", + "danharrin/livewire-rate-limiting": "^2.0", "ext-intl": "*", - "illuminate/contracts": "^10.45|^11.0|^12.0", - "illuminate/support": "^10.45|^11.0|^12.0", - "illuminate/view": "^10.45|^11.0|^12.0", - "kirschbaum-development/eloquent-power-joins": "^3.0|^4.0", + "illuminate/contracts": "^11.28|^12.0", + "kirschbaum-development/eloquent-power-joins": "^4.0", + "league/uri-components": "^7.0", "livewire/livewire": "^3.5", - "php": "^8.1", - "ryangjchandler/blade-capture-directive": "^0.2|^0.3|^1.0", - "spatie/color": "^1.5", - "spatie/invade": "^1.0|^2.0", + "nette/php-generator": "^4.0", + "php": "^8.2", + "ryangjchandler/blade-capture-directive": "^1.0", + "spatie/invade": "^2.0", "spatie/laravel-package-tools": "^1.9", - "symfony/console": "^6.0|^7.0", - "symfony/html-sanitizer": "^6.1|^7.0" + "symfony/console": "^7.0", + "symfony/html-sanitizer": "^7.0" }, "type": "library", "extra": { @@ -2517,34 +2729,27 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2025-08-12T13:15:44+00:00" + "time": "2025-09-29T08:02:19+00:00" }, { "name": "filament/tables", - "version": "v3.3.39", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/filamentphp/tables.git", - "reference": "2e1e3aeeeccd6b74e5d038325af52635d1108e4c" + "reference": "c3dc3ff22cc76b4ed21353c66b3669d0c5c4cd9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/tables/zipball/2e1e3aeeeccd6b74e5d038325af52635d1108e4c", - "reference": "2e1e3aeeeccd6b74e5d038325af52635d1108e4c", + "url": "https://api.github.com/repos/filamentphp/tables/zipball/c3dc3ff22cc76b4ed21353c66b3669d0c5c4cd9c", + "reference": "c3dc3ff22cc76b4ed21353c66b3669d0c5c4cd9c", "shasum": "" }, "require": { "filament/actions": "self.version", "filament/forms": "self.version", "filament/support": "self.version", - "illuminate/console": "^10.45|^11.0|^12.0", - "illuminate/contracts": "^10.45|^11.0|^12.0", - "illuminate/database": "^10.45|^11.0|^12.0", - "illuminate/filesystem": "^10.45|^11.0|^12.0", - "illuminate/support": "^10.45|^11.0|^12.0", - "illuminate/view": "^10.45|^11.0|^12.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "php": "^8.2" }, "type": "library", "extra": { @@ -2569,26 +2774,26 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2025-09-17T10:47:13+00:00" + "time": "2025-09-29T08:02:20+00:00" }, { "name": "filament/widgets", - "version": "v3.3.39", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/filamentphp/widgets.git", - "reference": "5b956f884aaef479f6091463cb829e7c9f2afc2c" + "reference": "5ad3577cf0d3f485678c617facb009f7cef978ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/widgets/zipball/5b956f884aaef479f6091463cb829e7c9f2afc2c", - "reference": "5b956f884aaef479f6091463cb829e7c9f2afc2c", + "url": "https://api.github.com/repos/filamentphp/widgets/zipball/5ad3577cf0d3f485678c617facb009f7cef978ac", + "reference": "5ad3577cf0d3f485678c617facb009f7cef978ac", "shasum": "" }, "require": { + "filament/schemas": "self.version", "filament/support": "self.version", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "php": "^8.2" }, "type": "library", "extra": { @@ -2613,7 +2818,7 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2025-06-12T15:11:14+00:00" + "time": "2025-09-21T21:08:23+00:00" }, { "name": "firebase/php-jwt", @@ -2952,16 +3157,16 @@ }, { "name": "giggsey/libphonenumber-for-php-lite", - "version": "9.0.14", + "version": "9.0.15", "source": { "type": "git", "url": "https://github.com/giggsey/libphonenumber-for-php-lite.git", - "reference": "af794cc2ed18edeebadf5ffe08eb6add04275709" + "reference": "bdb457250790bba0a4f8f03e3a3eceb47805499e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php-lite/zipball/af794cc2ed18edeebadf5ffe08eb6add04275709", - "reference": "af794cc2ed18edeebadf5ffe08eb6add04275709", + "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php-lite/zipball/bdb457250790bba0a4f8f03e3a3eceb47805499e", + "reference": "bdb457250790bba0a4f8f03e3a3eceb47805499e", "shasum": "" }, "require": { @@ -3026,7 +3231,7 @@ "issues": "https://github.com/giggsey/libphonenumber-for-php-lite/issues", "source": "https://github.com/giggsey/libphonenumber-for-php-lite" }, - "time": "2025-09-16T07:09:25+00:00" + "time": "2025-09-26T07:21:30+00:00" }, { "name": "graham-campbell/markdown", @@ -4053,60 +4258,118 @@ "time": "2025-05-05T16:03:34+00:00" }, { - "name": "laravel-notification-channels/telegram", - "version": "6.0.0", + "name": "lara-zeus/spatie-translatable", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/laravel-notification-channels/telegram.git", - "reference": "289eb825f6c918b21bbda19bffb900d882c9647a" + "url": "https://github.com/lara-zeus/spatie-translatable.git", + "reference": "54256890dc23c0a7fb8d4e8cc24dcf224a95b6c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel-notification-channels/telegram/zipball/289eb825f6c918b21bbda19bffb900d882c9647a", - "reference": "289eb825f6c918b21bbda19bffb900d882c9647a", + "url": "https://api.github.com/repos/lara-zeus/spatie-translatable/zipball/54256890dc23c0a7fb8d4e8cc24dcf224a95b6c7", + "reference": "54256890dc23c0a7fb8d4e8cc24dcf224a95b6c7", "shasum": "" }, "require": { - "ext-json": "*", - "guzzlehttp/guzzle": "^7.8", - "illuminate/contracts": "^11.0 || ^12.0", - "illuminate/notifications": "^11.0 || ^12.0", - "illuminate/support": "^11.0 || ^12.0", - "php": "^8.2" + "ext-intl": "*", + "filament/filament": "^4.0", + "php": "^8.1", + "spatie/laravel-translatable": "^6.0" }, "require-dev": { - "larastan/larastan": "^3.0", - "mockery/mockery": "^1.4.4", - "orchestra/testbench": "^10.0", - "pestphp/pest": "^3.0", - "pestphp/pest-plugin-laravel": "^3.0", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan-deprecation-rules": "^2.0", - "phpstan/phpstan-phpunit": "^2.0" + "larastan/larastan": "^3.4", + "laravel/pint": "^1.0", + "orchestra/testbench": "^10.2", + "phpstan/extension-installer": "^1.4", + "roave/security-advisories": "dev-latest" }, "type": "library", "extra": { "laravel": { "providers": [ - "NotificationChannels\\Telegram\\TelegramServiceProvider" + "LaraZeus\\SpatieTranslatable\\SpatieTranslatableServiceProvider" ] } }, "autoload": { "psr-4": { - "NotificationChannels\\Telegram\\": "src" + "LaraZeus\\SpatieTranslatable\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ + "description": "Filament support for `spatie/laravel-translatable`.", + "homepage": "https://github.com/lara-zeus/spatie-translatable", + "support": { + "issues": "https://github.com/lara-zeus/spatie-translatable/issues", + "source": "https://github.com/lara-zeus/spatie-translatable" + }, + "funding": [ { - "name": "Irfaq Syed", - "email": "github@lukonet.net", - "homepage": "https://lukonet.com", - "role": "Developer" + "url": "https://github.com/atmonshi", + "type": "github" + } + ], + "time": "2025-09-07T11:30:30+00:00" + }, + { + "name": "laravel-notification-channels/telegram", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/laravel-notification-channels/telegram.git", + "reference": "289eb825f6c918b21bbda19bffb900d882c9647a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-notification-channels/telegram/zipball/289eb825f6c918b21bbda19bffb900d882c9647a", + "reference": "289eb825f6c918b21bbda19bffb900d882c9647a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "^7.8", + "illuminate/contracts": "^11.0 || ^12.0", + "illuminate/notifications": "^11.0 || ^12.0", + "illuminate/support": "^11.0 || ^12.0", + "php": "^8.2" + }, + "require-dev": { + "larastan/larastan": "^3.0", + "mockery/mockery": "^1.4.4", + "orchestra/testbench": "^10.0", + "pestphp/pest": "^3.0", + "pestphp/pest-plugin-laravel": "^3.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NotificationChannels\\Telegram\\TelegramServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "NotificationChannels\\Telegram\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Irfaq Syed", + "email": "github@lukonet.net", + "homepage": "https://lukonet.com", + "role": "Developer" } ], "description": "Telegram Notifications Channel for Laravel", @@ -4187,16 +4450,16 @@ }, { "name": "laravel/framework", - "version": "v12.30.1", + "version": "v12.31.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "7f61e8679f9142f282a0184ac7ef9e3834bfd023" + "reference": "281b711710c245dd8275d73132e92635be3094df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/7f61e8679f9142f282a0184ac7ef9e3834bfd023", - "reference": "7f61e8679f9142f282a0184ac7ef9e3834bfd023", + "url": "https://api.github.com/repos/laravel/framework/zipball/281b711710c245dd8275d73132e92635be3094df", + "reference": "281b711710c245dd8275d73132e92635be3094df", "shasum": "" }, "require": { @@ -4403,7 +4666,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-09-18T21:07:07+00:00" + "time": "2025-09-23T15:33:04+00:00" }, { "name": "laravel/helpers", @@ -4464,16 +4727,16 @@ }, { "name": "laravel/nightwatch", - "version": "v1.13.8", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/laravel/nightwatch.git", - "reference": "a9534899792a453ee16b8200b281197c60dd9a63" + "reference": "e5b3d92fcd8d814683a0c79125383db13741dacf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/nightwatch/zipball/a9534899792a453ee16b8200b281197c60dd9a63", - "reference": "a9534899792a453ee16b8200b281197c60dd9a63", + "url": "https://api.github.com/repos/laravel/nightwatch/zipball/e5b3d92fcd8d814683a0c79125383db13741dacf", + "reference": "e5b3d92fcd8d814683a0c79125383db13741dacf", "shasum": "" }, "require": { @@ -4548,20 +4811,20 @@ "issues": "https://github.com/laravel/nightwatch/issues", "source": "https://github.com/laravel/nightwatch" }, - "time": "2025-09-23T05:45:29+00:00" + "time": "2025-09-29T01:28:49+00:00" }, { "name": "laravel/octane", - "version": "v2.12.2", + "version": "v2.12.3", "source": { "type": "git", "url": "https://github.com/laravel/octane.git", - "reference": "7cbb80a0bd7ccfbf0615dd33de7907c5dad21171" + "reference": "172e61d0b4dd9db263a59ff66213fa2d68f23dbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/octane/zipball/7cbb80a0bd7ccfbf0615dd33de7907c5dad21171", - "reference": "7cbb80a0bd7ccfbf0615dd33de7907c5dad21171", + "url": "https://api.github.com/repos/laravel/octane/zipball/172e61d0b4dd9db263a59ff66213fa2d68f23dbf", + "reference": "172e61d0b4dd9db263a59ff66213fa2d68f23dbf", "shasum": "" }, "require": { @@ -4638,20 +4901,20 @@ "issues": "https://github.com/laravel/octane/issues", "source": "https://github.com/laravel/octane" }, - "time": "2025-09-07T23:19:55+00:00" + "time": "2025-09-23T13:39:52+00:00" }, { "name": "laravel/prompts", - "version": "v0.3.6", + "version": "v0.3.7", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "86a8b692e8661d0fb308cec64f3d176821323077" + "reference": "a1891d362714bc40c8d23b0b1d7090f022ea27cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/86a8b692e8661d0fb308cec64f3d176821323077", - "reference": "86a8b692e8661d0fb308cec64f3d176821323077", + "url": "https://api.github.com/repos/laravel/prompts/zipball/a1891d362714bc40c8d23b0b1d7090f022ea27cc", + "reference": "a1891d362714bc40c8d23b0b1d7090f022ea27cc", "shasum": "" }, "require": { @@ -4668,8 +4931,8 @@ "illuminate/collections": "^10.0|^11.0|^12.0", "mockery/mockery": "^1.5", "pestphp/pest": "^2.3|^3.4", - "phpstan/phpstan": "^1.11", - "phpstan/phpstan-mockery": "^1.1" + "phpstan/phpstan": "^1.12.28", + "phpstan/phpstan-mockery": "^1.1.3" }, "suggest": { "ext-pcntl": "Required for the spinner to be animated." @@ -4695,22 +4958,22 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.3.6" + "source": "https://github.com/laravel/prompts/tree/v0.3.7" }, - "time": "2025-07-07T14:17:42+00:00" + "time": "2025-09-19T13:47:56+00:00" }, { "name": "laravel/serializable-closure", - "version": "v2.0.4", + "version": "v2.0.5", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "b352cf0534aa1ae6b4d825d1e762e35d43f8a841" + "reference": "3832547db6e0e2f8bb03d4093857b378c66eceed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b352cf0534aa1ae6b4d825d1e762e35d43f8a841", - "reference": "b352cf0534aa1ae6b4d825d1e762e35d43f8a841", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3832547db6e0e2f8bb03d4093857b378c66eceed", + "reference": "3832547db6e0e2f8bb03d4093857b378c66eceed", "shasum": "" }, "require": { @@ -4758,7 +5021,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2025-03-19T13:51:03+00:00" + "time": "2025-09-22T17:29:40+00:00" }, { "name": "laravel/socialite", @@ -4947,14 +5210,14 @@ "dist": { "type": "path", "url": "app-modules/gamify", - "reference": "38cdfc7c048601d31c7d9d038fd8896c1eda4d4c" + "reference": "343936faa71e1f1cf7ccc207fc7c78a6c4f0a6a0" }, "require": { - "filament/filament": "^3.2" + "php": "^8.4" }, "require-dev": { - "pestphp/pest": "^2.32", - "pestphp/pest-plugin-laravel": "^2.1" + "pestphp/pest": "^3.8", + "pestphp/pest-plugin-laravel": "^3.0" }, "type": "library", "extra": { @@ -5822,6 +6085,88 @@ ], "time": "2024-12-08T08:40:02+00:00" }, + { + "name": "league/uri-components", + "version": "7.5.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-components.git", + "reference": "4aabf0e2f2f9421ffcacab35be33e4fb5e63c44f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-components/zipball/4aabf0e2f2f9421ffcacab35be33e4fb5e63c44f", + "reference": "4aabf0e2f2f9421ffcacab35be33e4fb5e63c44f", + "shasum": "" + }, + "require": { + "league/uri": "^7.5", + "php": "^8.1" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-mbstring": "to use the sorting algorithm of URLSearchParams", + "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI components manipulation library", + "homepage": "http://uri.thephpleague.com", + "keywords": [ + "authority", + "components", + "fragment", + "host", + "middleware", + "modifier", + "path", + "port", + "query", + "rfc3986", + "scheme", + "uri", + "url", + "userinfo" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-components/tree/7.5.1" + }, + "funding": [ + { + "url": "https://github.com/nyamsprod", + "type": "github" + } + ], + "time": "2024-12-08T08:40:02+00:00" + }, { "name": "league/uri-interfaces", "version": "7.5.0", @@ -6787,6 +7132,78 @@ ], "time": "2025-09-06T13:39:36+00:00" }, + { + "name": "nette/php-generator", + "version": "v4.2.0", + "source": { + "type": "git", + "url": "https://github.com/nette/php-generator.git", + "reference": "4707546a1f11badd72f5d82af4f8a6bc64bd56ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/php-generator/zipball/4707546a1f11badd72f5d82af4f8a6bc64bd56ac", + "reference": "4707546a1f11badd72f5d82af4f8a6bc64bd56ac", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0.6", + "php": "8.1 - 8.5" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/tester": "^2.4", + "nikic/php-parser": "^5.0", + "phpstan/phpstan-nette": "^2.0@stable", + "tracy/tracy": "^2.8" + }, + "suggest": { + "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.5 features.", + "homepage": "https://nette.org", + "keywords": [ + "code", + "nette", + "php", + "scaffolding" + ], + "support": { + "issues": "https://github.com/nette/php-generator/issues", + "source": "https://github.com/nette/php-generator/tree/v4.2.0" + }, + "time": "2025-08-06T18:24:31+00:00" + }, { "name": "nette/schema", "version": "v1.3.2", @@ -7307,16 +7724,16 @@ }, { "name": "paragonie/constant_time_encoding", - "version": "v3.1.0", + "version": "v3.1.3", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "5cba5793151a917ce03cbc0452b375fa4008849e" + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/5cba5793151a917ce03cbc0452b375fa4008849e", - "reference": "5cba5793151a917ce03cbc0452b375fa4008849e", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", "shasum": "" }, "require": { @@ -7372,7 +7789,7 @@ "issues": "https://github.com/paragonie/constant_time_encoding/issues", "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2025-09-22T19:58:27+00:00" + "time": "2025-09-24T15:06:41+00:00" }, { "name": "paragonie/random_compat", @@ -7974,6 +8391,125 @@ }, "time": "2025-08-30T15:50:23+00:00" }, + { + "name": "pragmarx/google2fa", + "version": "v8.0.3", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad", + "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1.0|^2.0|^3.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa/issues", + "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.3" + }, + "time": "2024-09-05T11:56:40+00:00" + }, + { + "name": "pragmarx/google2fa-qrcode", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa-qrcode.git", + "reference": "c23ebcc3a50de0d1566016a6dd1486e183bb78e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa-qrcode/zipball/c23ebcc3a50de0d1566016a6dd1486e183bb78e1", + "reference": "c23ebcc3a50de0d1566016a6dd1486e183bb78e1", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "pragmarx/google2fa": "^4.0|^5.0|^6.0|^7.0|^8.0" + }, + "require-dev": { + "bacon/bacon-qr-code": "^2.0", + "chillerlan/php-qrcode": "^1.0|^2.0|^3.0|^4.0", + "khanamiryan/qrcode-detector-decoder": "^1.0", + "phpunit/phpunit": "~4|~5|~6|~7|~8|~9" + }, + "suggest": { + "bacon/bacon-qr-code": "For QR Code generation, requires imagick", + "chillerlan/php-qrcode": "For QR Code generation" + }, + "type": "library", + "extra": { + "component": "package", + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "PragmaRX\\Google2FAQRCode\\": "src/", + "PragmaRX\\Google2FAQRCode\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "QR Code package for Google2FA", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa", + "qr code", + "qrcode" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa-qrcode/issues", + "source": "https://github.com/antonioribeiro/google2fa-qrcode/tree/v3.0.1" + }, + "time": "2025-09-19T23:02:26+00:00" + }, { "name": "predis/predis", "version": "v3.2.0", @@ -8997,6 +9533,84 @@ ], "time": "2025-02-25T09:09:36+00:00" }, + { + "name": "scrivo/highlight.php", + "version": "v9.18.1.10", + "source": { + "type": "git", + "url": "https://github.com/scrivo/highlight.php.git", + "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/850f4b44697a2552e892ffe71490ba2733c2fc6e", + "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.7", + "sabberworm/php-css-parser": "^8.3", + "symfony/finder": "^2.8|^3.4|^5.4", + "symfony/var-dumper": "^2.8|^3.4|^5.4" + }, + "suggest": { + "ext-mbstring": "Allows highlighting code with unicode characters and supports language with unicode keywords" + }, + "type": "library", + "autoload": { + "files": [ + "HighlightUtilities/functions.php" + ], + "psr-0": { + "Highlight\\": "", + "HighlightUtilities\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Geert Bergman", + "homepage": "http://www.scrivo.org/", + "role": "Project Author" + }, + { + "name": "Vladimir Jimenez", + "homepage": "https://allejo.io", + "role": "Maintainer" + }, + { + "name": "Martin Folkers", + "homepage": "https://twobrain.io", + "role": "Contributor" + } + ], + "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", + "keywords": [ + "code", + "highlight", + "highlight.js", + "highlight.php", + "syntax" + ], + "support": { + "issues": "https://github.com/scrivo/highlight.php/issues", + "source": "https://github.com/scrivo/highlight.php" + }, + "funding": [ + { + "url": "https://github.com/allejo", + "type": "github" + } + ], + "time": "2022-12-17T21:53:22+00:00" + }, { "name": "seld/jsonlint", "version": "1.11.0", @@ -9209,85 +9823,26 @@ ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://github.com/freekmurze", - "role": "Developer" - } - ], - "description": "Convert a webpage to an image or pdf using headless Chrome", - "homepage": "https://github.com/spatie/browsershot", - "keywords": [ - "chrome", - "convert", - "headless", - "image", - "pdf", - "puppeteer", - "screenshot", - "webpage" - ], - "support": { - "source": "https://github.com/spatie/browsershot/tree/5.0.10" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2025-05-15T07:10:57+00:00" - }, - { - "name": "spatie/color", - "version": "1.8.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/color.git", - "reference": "142af7fec069a420babea80a5412eb2f646dcd8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/color/zipball/142af7fec069a420babea80a5412eb2f646dcd8c", - "reference": "142af7fec069a420babea80a5412eb2f646dcd8c", - "shasum": "" - }, - "require": { - "php": "^7.3|^8.0" - }, - "require-dev": { - "pestphp/pest": "^1.22", - "phpunit/phpunit": "^6.5||^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Color\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sebastian De Deyne", - "email": "sebastian@spatie.be", - "homepage": "https://spatie.be", + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://github.com/freekmurze", "role": "Developer" } ], - "description": "A little library to handle color conversions", - "homepage": "https://github.com/spatie/color", + "description": "Convert a webpage to an image or pdf using headless Chrome", + "homepage": "https://github.com/spatie/browsershot", "keywords": [ - "color", - "conversion", - "rgb", - "spatie" + "chrome", + "convert", + "headless", + "image", + "pdf", + "puppeteer", + "screenshot", + "webpage" ], "support": { - "issues": "https://github.com/spatie/color/issues", - "source": "https://github.com/spatie/color/tree/1.8.0" + "source": "https://github.com/spatie/browsershot/tree/5.0.10" }, "funding": [ { @@ -9295,7 +9850,7 @@ "type": "github" } ], - "time": "2025-02-10T09:22:41+00:00" + "time": "2025-05-15T07:10:57+00:00" }, { "name": "spatie/crawler", @@ -9441,16 +9996,16 @@ }, { "name": "spatie/image", - "version": "3.8.5", + "version": "3.8.6", "source": { "type": "git", "url": "https://github.com/spatie/image.git", - "reference": "a63f60b7387ebeacab463e79a95deb7ffed75430" + "reference": "0872c5968a7f044fe1e960c26433e54ceaede696" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/image/zipball/a63f60b7387ebeacab463e79a95deb7ffed75430", - "reference": "a63f60b7387ebeacab463e79a95deb7ffed75430", + "url": "https://api.github.com/repos/spatie/image/zipball/0872c5968a7f044fe1e960c26433e54ceaede696", + "reference": "0872c5968a7f044fe1e960c26433e54ceaede696", "shasum": "" }, "require": { @@ -9498,7 +10053,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/image/tree/3.8.5" + "source": "https://github.com/spatie/image/tree/3.8.6" }, "funding": [ { @@ -9510,7 +10065,7 @@ "type": "github" } ], - "time": "2025-06-27T12:44:55+00:00" + "time": "2025-09-25T12:06:17+00:00" }, { "name": "spatie/image-optimizer", @@ -10411,6 +10966,71 @@ ], "time": "2025-09-19T10:37:01+00:00" }, + { + "name": "spatie/shiki-php", + "version": "2.3.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/shiki-php.git", + "reference": "a2e78a9ff8a1290b25d550be8fbf8285c13175c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/shiki-php/zipball/a2e78a9ff8a1290b25d550be8fbf8285c13175c5", + "reference": "a2e78a9ff8a1290b25d550be8fbf8285c13175c5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^8.0", + "symfony/process": "^5.4|^6.4|^7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^v3.0", + "pestphp/pest": "^1.8", + "phpunit/phpunit": "^9.5", + "spatie/pest-plugin-snapshots": "^1.1", + "spatie/ray": "^1.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\ShikiPhp\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Rias Van der Veken", + "email": "rias@spatie.be", + "role": "Developer" + }, + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Highlight code using Shiki in PHP", + "homepage": "https://github.com/spatie/shiki-php", + "keywords": [ + "shiki", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/shiki-php/tree/2.3.2" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2025-02-21T14:16:57+00:00" + }, { "name": "spatie/temporary-directory", "version": "2.3.0", @@ -10617,16 +11237,16 @@ }, { "name": "symfony/console", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7" + "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", - "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", + "url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", + "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", "shasum": "" }, "require": { @@ -10691,7 +11311,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.3" + "source": "https://github.com/symfony/console/tree/v7.3.4" }, "funding": [ { @@ -10711,7 +11331,7 @@ "type": "tidelift" } ], - "time": "2025-08-25T06:35:40+00:00" + "time": "2025-09-22T15:31:00+00:00" }, { "name": "symfony/css-selector", @@ -10918,16 +11538,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.3.2", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3" + "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/0b31a944fcd8759ae294da4d2808cbc53aebd0c3", - "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", + "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", "shasum": "" }, "require": { @@ -10975,7 +11595,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.3.2" + "source": "https://github.com/symfony/error-handler/tree/v7.3.4" }, "funding": [ { @@ -10995,7 +11615,7 @@ "type": "tidelift" } ], - "time": "2025-07-07T08:17:57+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/event-dispatcher", @@ -11370,16 +11990,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00" + "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7475561ec27020196c49bb7c4f178d33d7d3dc00", - "reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c061c7c18918b1b64268771aad04b40be41dd2e6", + "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6", "shasum": "" }, "require": { @@ -11429,7 +12049,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.3.3" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.4" }, "funding": [ { @@ -11449,20 +12069,20 @@ "type": "tidelift" } ], - "time": "2025-08-20T08:04:18+00:00" + "time": "2025-09-16T08:38:17+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b" + "reference": "b796dffea7821f035047235e076b60ca2446e3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/72c304de37e1a1cec6d5d12b81187ebd4850a17b", - "reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b796dffea7821f035047235e076b60ca2446e3cf", + "reference": "b796dffea7821f035047235e076b60ca2446e3cf", "shasum": "" }, "require": { @@ -11547,7 +12167,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.3.3" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.4" }, "funding": [ { @@ -11567,20 +12187,20 @@ "type": "tidelift" } ], - "time": "2025-08-29T08:23:45+00:00" + "time": "2025-09-27T12:32:17+00:00" }, { "name": "symfony/mailer", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575" + "reference": "ab97ef2f7acf0216955f5845484235113047a31d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/a32f3f45f1990db8c4341d5122a7d3a381c7e575", - "reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575", + "url": "https://api.github.com/repos/symfony/mailer/zipball/ab97ef2f7acf0216955f5845484235113047a31d", + "reference": "ab97ef2f7acf0216955f5845484235113047a31d", "shasum": "" }, "require": { @@ -11631,7 +12251,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.3.3" + "source": "https://github.com/symfony/mailer/tree/v7.3.4" }, "funding": [ { @@ -11651,20 +12271,20 @@ "type": "tidelift" } ], - "time": "2025-08-13T11:49:31+00:00" + "time": "2025-09-17T05:51:54+00:00" }, { "name": "symfony/mime", - "version": "v7.3.2", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1" + "reference": "b1b828f69cbaf887fa835a091869e55df91d0e35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/e0a0f859148daf1edf6c60b398eb40bfc96697d1", - "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1", + "url": "https://api.github.com/repos/symfony/mime/zipball/b1b828f69cbaf887fa835a091869e55df91d0e35", + "reference": "b1b828f69cbaf887fa835a091869e55df91d0e35", "shasum": "" }, "require": { @@ -11719,7 +12339,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.3.2" + "source": "https://github.com/symfony/mime/tree/v7.3.4" }, "funding": [ { @@ -11739,7 +12359,7 @@ "type": "tidelift" } ], - "time": "2025-07-15T13:41:35+00:00" + "time": "2025-09-16T08:38:17+00:00" }, { "name": "symfony/polyfill-ctype", @@ -12732,16 +13352,16 @@ }, { "name": "symfony/process", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "32241012d521e2e8a9d713adb0812bb773b907f1" + "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/32241012d521e2e8a9d713adb0812bb773b907f1", - "reference": "32241012d521e2e8a9d713adb0812bb773b907f1", + "url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b", + "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b", "shasum": "" }, "require": { @@ -12773,7 +13393,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.3.3" + "source": "https://github.com/symfony/process/tree/v7.3.4" }, "funding": [ { @@ -12793,7 +13413,7 @@ "type": "tidelift" } ], - "time": "2025-08-18T09:42:54+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -12880,16 +13500,16 @@ }, { "name": "symfony/routing", - "version": "v7.3.2", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4" + "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/7614b8ca5fa89b9cd233e21b627bfc5774f586e4", - "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4", + "url": "https://api.github.com/repos/symfony/routing/zipball/8dc648e159e9bac02b703b9fbd937f19ba13d07c", + "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c", "shasum": "" }, "require": { @@ -12941,7 +13561,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.3.2" + "source": "https://github.com/symfony/routing/tree/v7.3.4" }, "funding": [ { @@ -12961,7 +13581,7 @@ "type": "tidelift" } ], - "time": "2025-07-15T11:36:08+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/service-contracts", @@ -13048,16 +13668,16 @@ }, { "name": "symfony/string", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c" + "reference": "f96476035142921000338bad71e5247fbc138872" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", - "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", + "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872", + "reference": "f96476035142921000338bad71e5247fbc138872", "shasum": "" }, "require": { @@ -13072,7 +13692,6 @@ }, "require-dev": { "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3.0", @@ -13115,7 +13734,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.3.3" + "source": "https://github.com/symfony/string/tree/v7.3.4" }, "funding": [ { @@ -13135,20 +13754,20 @@ "type": "tidelift" } ], - "time": "2025-08-25T06:35:40+00:00" + "time": "2025-09-11T14:36:48+00:00" }, { "name": "symfony/translation", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "e0837b4cbcef63c754d89a4806575cada743a38d" + "reference": "ec25870502d0c7072d086e8ffba1420c85965174" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/e0837b4cbcef63c754d89a4806575cada743a38d", - "reference": "e0837b4cbcef63c754d89a4806575cada743a38d", + "url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174", + "reference": "ec25870502d0c7072d086e8ffba1420c85965174", "shasum": "" }, "require": { @@ -13215,7 +13834,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.3.3" + "source": "https://github.com/symfony/translation/tree/v7.3.4" }, "funding": [ { @@ -13235,7 +13854,7 @@ "type": "tidelift" } ], - "time": "2025-08-01T21:02:37+00:00" + "time": "2025-09-07T11:39:36+00:00" }, { "name": "symfony/translation-contracts", @@ -13391,16 +14010,16 @@ }, { "name": "symfony/var-dumper", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f" + "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", - "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", + "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", "shasum": "" }, "require": { @@ -13454,7 +14073,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.3" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.4" }, "funding": [ { @@ -13474,7 +14093,7 @@ "type": "tidelift" } ], - "time": "2025-08-13T11:49:31+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -13596,6 +14215,75 @@ }, "time": "2025-03-22T15:38:26+00:00" }, + { + "name": "ueberdosis/tiptap-php", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ueberdosis/tiptap-php.git", + "reference": "458194ad0f8b0cf616fecdf451a84f9a6c1f3056" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ueberdosis/tiptap-php/zipball/458194ad0f8b0cf616fecdf451a84f9a6c1f3056", + "reference": "458194ad0f8b0cf616fecdf451a84f9a6c1f3056", + "shasum": "" + }, + "require": { + "php": "^8.0", + "scrivo/highlight.php": "^9.18", + "spatie/shiki-php": "^2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.5", + "pestphp/pest": "^1.21", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Tiptap\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Hans Pagel", + "email": "humans@tiptap.dev", + "role": "Developer" + } + ], + "description": "A PHP package to work with Tiptap output", + "homepage": "https://github.com/ueberdosis/tiptap-php", + "keywords": [ + "prosemirror", + "tiptap", + "ueberdosis" + ], + "support": { + "issues": "https://github.com/ueberdosis/tiptap-php/issues", + "source": "https://github.com/ueberdosis/tiptap-php/tree/2.0.0" + }, + "funding": [ + { + "url": "https://tiptap.dev/pricing", + "type": "custom" + }, + { + "url": "https://github.com/ueberdosis", + "type": "github" + }, + { + "url": "https://opencollective.com/tiptap", + "type": "open_collective" + } + ], + "time": "2025-06-26T14:11:46+00:00" + }, { "name": "vlucas/phpdotenv", "version": "v5.6.2", @@ -13756,50 +14444,46 @@ }, { "name": "vormkracht10/filament-mails", - "version": "v2.3.8", + "version": "v3.0.4", "source": { "type": "git", "url": "https://github.com/backstagephp/filament-mails.git", - "reference": "c8127787cba01da16132617e09c46aa2d9ffa181" + "reference": "24d5d50c5848f8e8d06a5f9f37b891aa9cc5e8b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/backstagephp/filament-mails/zipball/c8127787cba01da16132617e09c46aa2d9ffa181", - "reference": "c8127787cba01da16132617e09c46aa2d9ffa181", + "url": "https://api.github.com/repos/backstagephp/filament-mails/zipball/24d5d50c5848f8e8d06a5f9f37b891aa9cc5e8b4", + "reference": "24d5d50c5848f8e8d06a5f9f37b891aa9cc5e8b4", "shasum": "" }, "require": { - "filament/filament": "^3.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.15.0", - "vormkracht10/laravel-mails": "^1.0" + "backstage/laravel-mails": "^2.0", + "filament/filament": "^4.0", + "php": "^8.2", + "spatie/laravel-package-tools": "^1.15.0" }, "require-dev": { - "laravel/pint": "^1.0", - "nunomaduro/collision": "^7.9", - "nunomaduro/larastan": "^2.0.1", - "orchestra/testbench": "^8.0", - "pestphp/pest": "^2.1", - "pestphp/pest-plugin-arch": "^2.0", - "pestphp/pest-plugin-laravel": "^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0" + "laravel/pint": "^1.16", + "nunomaduro/collision": "^8.8.0", + "orchestra/testbench": "^9.0|^10.0", + "pestphp/pest": "^3.7", + "pestphp/pest-plugin-arch": "^3.1.0", + "pestphp/pest-plugin-laravel": "^3.0" }, "type": "library", "extra": { "laravel": { "aliases": { - "FilamentMails": "Vormkracht10\\FilamentMails\\Facades\\FilamentMails" + "FilamentMails": "Backstage\\FilamentMails\\Facades\\FilamentMails" }, "providers": [ - "Vormkracht10\\FilamentMails\\FilamentMailsServiceProvider" + "Backstage\\FilamentMails\\FilamentMailsServiceProvider" ] } }, "autoload": { "psr-4": { - "Vormkracht10\\FilamentMails\\": "src/" + "Backstage\\FilamentMails\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -13814,94 +14498,15 @@ } ], "description": "View logged mails and events in a beautiful Filament UI.", - "homepage": "https://github.com/vormkracht10/filament-mails", + "homepage": "https://github.com/backstagephp/filament-mails", "keywords": [ + "backstagephp", "filament-mails", - "laravel", - "vormkracht10" - ], - "support": { - "issues": "https://github.com/vormkracht10/filament-mails/issues", - "source": "https://github.com/vormkracht10/filament-mails" - }, - "funding": [ - { - "url": "https://github.com/vormkracht10", - "type": "github" - } - ], - "time": "2025-05-26T17:26:20+00:00" - }, - { - "name": "vormkracht10/laravel-mails", - "version": "v1.4.4", - "source": { - "type": "git", - "url": "https://github.com/backstagephp/laravel-mails.git", - "reference": "0d3827c416b15a06db1e6f3b6676903d91bb6c13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/backstagephp/laravel-mails/zipball/0d3827c416b15a06db1e6f3b6676903d91bb6c13", - "reference": "0d3827c416b15a06db1e6f3b6676903d91bb6c13", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^10.0 || ^11.0 || ^12.0", - "laravel/helpers": "^1.7.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.15.0" - }, - "require-dev": { - "larastan/larastan": "^3.0", - "laravel-notification-channels/discord": "^1.6", - "laravel-notification-channels/telegram": "^4.0 || ^5.0 || ^6.0", - "laravel/pint": "^1.17.0", - "laravel/slack-notification-channel": "^2.5 || ^3.3.2", - "nunomaduro/collision": "^7.5.0|^8.4", - "orchestra/testbench": "^8.5.0|^9.4.0", - "pestphp/pest": "^3.0", - "pestphp/pest-plugin-laravel": "^3.0", - "phpstan/extension-installer": "^1.4", - "phpstan/phpstan-deprecation-rules": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Vormkracht10\\Mails\\MailsServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Vormkracht10\\Mails\\": "src", - "Vormkracht10\\Mails\\Database\\Factories\\": "database/factories" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark van Eijk", - "email": "mark@vormkracht10.nl", - "role": "Developer" - } - ], - "description": "Laravel Mails can collect everything you might want to track about the mails that has been sent by your Laravel app.", - "homepage": "https://github.com/vormkracht10/laravel-mails", - "keywords": [ - "laravel", - "laravel-mails", - "vormkracht10" + "laravel" ], "support": { - "issues": "https://github.com/backstagephp/laravel-mails/issues", - "source": "https://github.com/backstagephp/laravel-mails/tree/v1.4.4" + "issues": "https://github.com/backstagephp/filament-mails/issues", + "source": "https://github.com/backstagephp/filament-mails" }, "funding": [ { @@ -13909,7 +14514,7 @@ "type": "github" } ], - "time": "2025-05-20T09:41:51+00:00" + "time": "2025-09-26T08:39:10+00:00" }, { "name": "webmozart/assert", @@ -14162,36 +14767,36 @@ }, { "name": "ysfkaya/filament-phone-input", - "version": "v3.2.4", + "version": "v4.0.0", "source": { "type": "git", "url": "https://github.com/ysfkaya/filament-phone-input.git", - "reference": "e7fa55066d61650719d53245999ee6492fa6e870" + "reference": "9258ed00da844b60cf72ac8dbbacbef33e92b787" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ysfkaya/filament-phone-input/zipball/e7fa55066d61650719d53245999ee6492fa6e870", - "reference": "e7fa55066d61650719d53245999ee6492fa6e870", + "url": "https://api.github.com/repos/ysfkaya/filament-phone-input/zipball/9258ed00da844b60cf72ac8dbbacbef33e92b787", + "reference": "9258ed00da844b60cf72ac8dbbacbef33e92b787", "shasum": "" }, "require": { - "filament/filament": "^3.0", - "php": "^8.1", - "propaganistas/laravel-phone": "^5.0|^6.0", + "filament/filament": "^4.0", + "php": "^8.2", + "propaganistas/laravel-phone": "^6.0", "spatie/laravel-package-tools": "^1.92" }, "require-dev": { "laravel/pint": "^1.0", - "nunomaduro/collision": "^7.9|^8.1", - "nunomaduro/larastan": "^2.0|^3.0", - "orchestra/testbench-dusk": "^8.0|^9.0|^10.0", - "pestphp/pest": "^2.0|^3.0", - "pestphp/pest-plugin-arch": "^2.0|^3.0", - "pestphp/pest-plugin-laravel": "^2.0|^3.0", - "pestphp/pest-plugin-livewire": "^2.1|^3.0", + "nunomaduro/collision": "^8.1", + "nunomaduro/larastan": "^3.0", + "orchestra/testbench-dusk": "^10.0", + "pestphp/pest": "^3.0", + "pestphp/pest-plugin-arch": "^3.0", + "pestphp/pest-plugin-laravel": "^3.0", + "pestphp/pest-plugin-livewire": "^3.0", "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", - "phpstan/phpstan-phpunit": "^1.0|^2.0" + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0" }, "type": "library", "extra": { @@ -14220,9 +14825,9 @@ ], "support": { "issues": "https://github.com/ysfkaya/filament-phone-input/issues", - "source": "https://github.com/ysfkaya/filament-phone-input/tree/v3.2.4" + "source": "https://github.com/ysfkaya/filament-phone-input/tree/v4.0.0" }, - "time": "2025-09-04T19:22:20+00:00" + "time": "2025-08-23T17:08:36+00:00" } ], "packages-dev": [ @@ -14563,6 +15168,53 @@ ], "time": "2025-08-14T07:29:31+00:00" }, + { + "name": "filament/upgrade", + "version": "v4.1.0", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/upgrade.git", + "reference": "72f47ecdf4972f84085f300f19da04b9c835f60c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/upgrade/zipball/72f47ecdf4972f84085f300f19da04b9c835f60c", + "reference": "72f47ecdf4972f84085f300f19da04b9c835f60c", + "shasum": "" + }, + "require": { + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "rector/rector": "^2.0" + }, + "bin": [ + "bin/filament-v4" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Upgrade\\UpgradeServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Upgrade\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Upgrade Filament v3 code to Filament v4.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2025-09-11T14:01:25+00:00" + }, { "name": "filp/whoops", "version": "2.18.4", @@ -14877,16 +15529,16 @@ }, { "name": "laravel/boost", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "85f7de54a6b60f684fc9f7f6df5ad94f4f7d0d24" + "reference": "ef8800843efc581965c38393adb63ba336dc3979" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/85f7de54a6b60f684fc9f7f6df5ad94f4f7d0d24", - "reference": "85f7de54a6b60f684fc9f7f6df5ad94f4f7d0d24", + "url": "https://api.github.com/repos/laravel/boost/zipball/ef8800843efc581965c38393adb63ba336dc3979", + "reference": "ef8800843efc581965c38393adb63ba336dc3979", "shasum": "" }, "require": { @@ -14897,7 +15549,7 @@ "illuminate/support": "^10.49.0|^11.45.3|^12.28.1", "laravel/mcp": "^0.2.0", "laravel/prompts": "0.1.25|^0.3.6", - "laravel/roster": "^0.2.6", + "laravel/roster": "^0.2.8", "php": "^8.1" }, "require-dev": { @@ -14905,7 +15557,8 @@ "mockery/mockery": "^1.6.12", "orchestra/testbench": "^8.36.0|^9.15.0|^10.6", "pestphp/pest": "^2.36.0|^3.8.4", - "phpstan/phpstan": "^2.1.27" + "phpstan/phpstan": "^2.1.27", + "rector/rector": "^2.1" }, "type": "library", "extra": { @@ -14938,7 +15591,7 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2025-09-18T13:05:07+00:00" + "time": "2025-09-30T09:34:43+00:00" }, { "name": "laravel/breeze", @@ -15003,16 +15656,16 @@ }, { "name": "laravel/mcp", - "version": "v0.2.0", + "version": "v0.2.1", "source": { "type": "git", "url": "https://github.com/laravel/mcp.git", - "reference": "56fade6882756d5828cc90b86611d29616c2d754" + "reference": "0ecf0c04b20e5946ae080e8d67984d5c555174b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/mcp/zipball/56fade6882756d5828cc90b86611d29616c2d754", - "reference": "56fade6882756d5828cc90b86611d29616c2d754", + "url": "https://api.github.com/repos/laravel/mcp/zipball/0ecf0c04b20e5946ae080e8d67984d5c555174b0", + "reference": "0ecf0c04b20e5946ae080e8d67984d5c555174b0", "shasum": "" }, "require": { @@ -15072,7 +15725,7 @@ "issues": "https://github.com/laravel/mcp/issues", "source": "https://github.com/laravel/mcp" }, - "time": "2025-09-18T12:58:47+00:00" + "time": "2025-09-24T15:48:16+00:00" }, { "name": "laravel/pail", @@ -15282,16 +15935,16 @@ }, { "name": "laravel/sail", - "version": "v1.45.0", + "version": "v1.46.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "019a2933ff4a9199f098d4259713f9bc266a874e" + "reference": "eb90c4f113c4a9637b8fdd16e24cfc64f2b0ae6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/019a2933ff4a9199f098d4259713f9bc266a874e", - "reference": "019a2933ff4a9199f098d4259713f9bc266a874e", + "url": "https://api.github.com/repos/laravel/sail/zipball/eb90c4f113c4a9637b8fdd16e24cfc64f2b0ae6e", + "reference": "eb90c4f113c4a9637b8fdd16e24cfc64f2b0ae6e", "shasum": "" }, "require": { @@ -15341,7 +15994,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2025-08-25T19:28:31+00:00" + "time": "2025-09-23T13:44:39+00:00" }, { "name": "mockery/mockery", @@ -16242,16 +16895,16 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.28", + "version": "2.1.29", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "578fa296a166605d97b94091f724f1257185d278" + "url": "https://github.com/phpstan/phpstan-phar-composer-source.git", + "reference": "git" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/578fa296a166605d97b94091f724f1257185d278", - "reference": "578fa296a166605d97b94091f724f1257185d278", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d618573eed4a1b6b75e37b2e0b65ac65c885d88e", + "reference": "d618573eed4a1b6b75e37b2e0b65ac65c885d88e", "shasum": "" }, "require": { @@ -16296,7 +16949,7 @@ "type": "github" } ], - "time": "2025-09-19T08:58:49+00:00" + "time": "2025-09-25T06:58:18+00:00" }, { "name": "phpunit/php-code-coverage", @@ -17267,16 +17920,16 @@ }, { "name": "sebastian/exporter", - "version": "6.3.1", + "version": "6.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "8f67e53d3fcaf53105f95cc14f1630493d0fa2e6" + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/8f67e53d3fcaf53105f95cc14f1630493d0fa2e6", - "reference": "8f67e53d3fcaf53105f95cc14f1630493d0fa2e6", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", "shasum": "" }, "require": { @@ -17333,7 +17986,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.1" + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" }, "funding": [ { @@ -17353,7 +18006,7 @@ "type": "tidelift" } ], - "time": "2025-09-22T05:34:00+00:00" + "time": "2025-09-24T06:12:51+00:00" }, { "name": "sebastian/global-state", @@ -18094,7 +18747,7 @@ } ], "aliases": [], - "minimum-stability": "dev", + "minimum-stability": "stable", "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, diff --git a/config/filament-mails.php b/config/filament-mails.php index 82344d85..5d49be76 100644 --- a/config/filament-mails.php +++ b/config/filament-mails.php @@ -2,9 +2,9 @@ declare(strict_types=1); -use Vormkracht10\FilamentMails\Resources\EventResource; -use Vormkracht10\FilamentMails\Resources\MailResource; -use Vormkracht10\FilamentMails\Resources\SuppressionResource; +use Backstage\FilamentMails\Resources\EventResource; +use Backstage\FilamentMails\Resources\MailResource; +use Backstage\FilamentMails\Resources\SuppressionResource; return [ 'resources' => [ diff --git a/config/filament.php b/config/filament.php index bf4c60a0..ee517d76 100644 --- a/config/filament.php +++ b/config/filament.php @@ -22,6 +22,12 @@ // 'broadcaster' => 'pusher', // 'key' => env('VITE_PUSHER_APP_KEY'), // 'cluster' => env('VITE_PUSHER_APP_CLUSTER'), + // 'wsHost' => env('VITE_PUSHER_HOST'), + // 'wsPort' => env('VITE_PUSHER_PORT'), + // 'wssPort' => env('VITE_PUSHER_PORT'), + // 'authEndpoint' => '/broadcasting/auth', + // 'disableStats' => true, + // 'encrypted' => true, // 'forceTLS' => true, // ], @@ -32,11 +38,85 @@ | Default Filesystem Disk |-------------------------------------------------------------------------- | - | This is the storage disk Filament will use to put media. You may use any - | of the disks defined in the `config/filesystems.php`. + | This is the storage disk Filament will use to store files. You may use + | any of the disks defined in the `config/filesystems.php`. | */ - 'default_filesystem_disk' => env('FILAMENT_FILESYSTEM_DISK', 'public'), + 'default_filesystem_disk' => env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Assets Path + |-------------------------------------------------------------------------- + | + | This is the directory where Filament's assets will be published to. It + | is relative to the `public` directory of your Laravel application. + | + | After changing the path, you should run `php artisan filament:assets`. + | + */ + + 'assets_path' => null, + + /* + |-------------------------------------------------------------------------- + | Cache Path + |-------------------------------------------------------------------------- + | + | This is the directory that Filament will use to store cache files that + | are used to optimize the registration of components. + | + | After changing the path, you should run `php artisan filament:cache-components`. + | + */ + + 'cache_path' => base_path('bootstrap/cache/filament'), + + /* + |-------------------------------------------------------------------------- + | Livewire Loading Delay + |-------------------------------------------------------------------------- + | + | This sets the delay before loading indicators appear. + | + | Setting this to 'none' makes indicators appear immediately, which can be + | desirable for high-latency connections. Setting it to 'default' applies + | Livewire's standard 200ms delay. + | + */ + + 'livewire_loading_delay' => 'default', + + /* + |-------------------------------------------------------------------------- + | File Generation + |-------------------------------------------------------------------------- + | + | Artisan commands that generate files can be configured here by setting + | configuration flags that will impact their location or content. + | + | Often, this is useful to preserve file generation behavior from a + | previous version of Filament, to ensure consistency between older and + | newer generated files. These flags are often documented in the upgrade + | guide for the version of Filament you are upgrading to. + | + */ + + 'file_generation' => [ + 'flags' => [], + ], + + /* + |-------------------------------------------------------------------------- + | System Route Prefix + |-------------------------------------------------------------------------- + | + | This is the prefix used for the system routes that Filament registers, + | such as the routes for downloading exports and failed import rows. + | + */ + + 'system_route_prefix' => 'filament', ]; diff --git a/config/gamify.php b/config/gamify.php index f5aa2b6c..02a1fa16 100644 --- a/config/gamify.php +++ b/config/gamify.php @@ -6,6 +6,7 @@ use Laravelcm\Gamify\Models\Reputation; return [ + 'payee_model' => User::class, 'reputation_model' => Reputation::class, @@ -15,4 +16,5 @@ 'broadcast_on_private_channel' => true, 'channel_name' => 'user.reputation.', + ]; diff --git a/config/livewire.php b/config/livewire.php index d91716d3..6decbb4e 100644 --- a/config/livewire.php +++ b/config/livewire.php @@ -131,7 +131,7 @@ 'navigate' => [ 'show_progress_bar' => true, - 'progress_bar_color' => '#ffdc44', + 'progress_bar_color' => '#099170', ], /* diff --git a/config/mails.php b/config/mails.php index a88ae65e..9e5be8bf 100644 --- a/config/mails.php +++ b/config/mails.php @@ -2,14 +2,13 @@ declare(strict_types=1); -use Vormkracht10\Mails\Models\Mail; -use Vormkracht10\Mails\Models\MailAttachment; -use Vormkracht10\Mails\Models\MailEvent; +use Backstage\Mails\Events\MailEvent; +use Backstage\Mails\Models\Mail; +use Backstage\Mails\Models\MailAttachment; return [ // Eloquent model to use for sent emails - 'models' => [ 'mail' => Mail::class, 'event' => MailEvent::class, @@ -17,7 +16,6 @@ ], // Table names for saving sent emails and polymorphic relations to database - 'database' => [ 'tables' => [ 'mails' => 'mails', diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 5ef96ce9..8ba81b4b 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -42,9 +42,8 @@ services: SESSION_PATH: ${SESSION_PATH} SESSION_DOMAIN: ${SESSION_DOMAIN} BROADCAST_CONNECTION: ${BROADCAST_CONNECTION} - FILESYSTEM_DISK: ${FILESYSTEM_DISK} MEDIA_DISK: ${MEDIA_DISK} - FILAMENT_FILESYSTEM_DISK: ${MEDIA_DISK} + FILESYSTEM_DISK: ${FILESYSTEM_DISK} FILAMENT_PATH: ${FILAMENT_PATH} QUEUE_CONNECTION: ${QUEUE_CONNECTION} CACHE_STORE: ${CACHE_STORE} @@ -177,9 +176,8 @@ services: SESSION_PATH: ${SESSION_PATH} SESSION_DOMAIN: ${SESSION_DOMAIN} BROADCAST_CONNECTION: ${BROADCAST_CONNECTION} - FILESYSTEM_DISK: ${FILESYSTEM_DISK} MEDIA_DISK: ${MEDIA_DISK} - FILAMENT_FILESYSTEM_DISK: ${MEDIA_DISK} + FILESYSTEM_DISK: ${FILESYSTEM_DISK} FILAMENT_PATH: ${FILAMENT_PATH} QUEUE_CONNECTION: ${QUEUE_CONNECTION} CACHE_STORE: ${CACHE_STORE} @@ -257,20 +255,6 @@ services: DB_PASSWORD_SECOND: '${DB_PASSWORD_SECOND:-}' BOOST_BROWSER_LOGS_WATCHER: '${BOOST_BROWSER_LOGS_WATCHER:-false}' OCTANE_SERVER: 'frankenphp' - CADDY_GLOBAL_OPTIONS: | - servers { - trusted_proxies static private_ranges - } - CADDY_SERVER_EXTRA_DIRECTIVES: | - @static { - file - path *.ico *.css *.js *.gif *.webp *.avif *.jpg *.jpeg *.png *.svg *.woff *.woff2 - } - header @static Cache-Control "public, max-age=31536000, s-maxage=31536000" - FRANKENPHP_CONFIG: | - worker { - file ./public/frankenphp-worker.php - } volumes: - storage:/var/www/html/storage networks: @@ -321,9 +305,8 @@ services: SESSION_PATH: ${SESSION_PATH} SESSION_DOMAIN: ${SESSION_DOMAIN} BROADCAST_CONNECTION: ${BROADCAST_CONNECTION} - FILESYSTEM_DISK: ${FILESYSTEM_DISK} MEDIA_DISK: ${MEDIA_DISK} - FILAMENT_FILESYSTEM_DISK: ${MEDIA_DISK} + FILESYSTEM_DISK: ${FILESYSTEM_DISK} FILAMENT_PATH: ${FILAMENT_PATH} QUEUE_CONNECTION: ${QUEUE_CONNECTION} CACHE_STORE: ${CACHE_STORE} @@ -401,20 +384,6 @@ services: DB_PASSWORD_SECOND: '${DB_PASSWORD_SECOND:-}' BOOST_BROWSER_LOGS_WATCHER: '${BOOST_BROWSER_LOGS_WATCHER:-false}' OCTANE_SERVER: 'frankenphp' - CADDY_GLOBAL_OPTIONS: | - servers { - trusted_proxies static private_ranges - } - CADDY_SERVER_EXTRA_DIRECTIVES: | - @static { - file - path *.ico *.css *.js *.gif *.webp *.avif *.jpg *.jpeg *.png *.svg *.woff *.woff2 - } - header @static Cache-Control "public, max-age=31536000, s-maxage=31536000" - FRANKENPHP_CONFIG: | - worker { - file ./public/frankenphp-worker.php - } volumes: - storage:/var/www/html/storage networks: diff --git a/package-lock.json b/package-lock.json index 8f2da6ee..1665cd27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,17 +4,16 @@ "requires": true, "packages": { "": { - "dependencies": { - "@tailwindplus/elements": "^1.0.13" - }, "devDependencies": { "@alpinejs/collapse": "^3.14.3", "@alpinejs/intersect": "^3.6.1", "@awcodes/alpine-floating-ui": "^3.5.0", "@ryangjchandler/alpine-tooltip": "^2.0.1", - "@tailwindcss/aspect-ratio": "^0.4.2", - "@tailwindcss/forms": "^0.5.7", - "@tailwindcss/typography": "^0.5.10", + "@tailwindcss/forms": "^0.5.10", + "@tailwindcss/postcss": "^4.1.13", + "@tailwindcss/typography": "^0.5.18", + "@tailwindcss/vite": "^4.1.13", + "@tailwindplus/elements": "^1.0.13", "alpinejs": "^3.12.0", "autoprefixer": "^10.4.16", "highlight.js": "^11.7.0", @@ -25,7 +24,7 @@ "postcss-preset-env": "^10.1.0", "prettier": "^3.2.5", "prettier-plugin-tailwindcss": "^0.6.8", - "tailwindcss": "^3.4.10", + "tailwindcss": "^4.1.13", "tippy.js": "^6.3.7", "vite": "^7.1.7" } @@ -1766,22 +1765,17 @@ "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==", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "license": "ISC", "dependencies": { - "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" + "minipass": "^7.0.4" }, "engines": { - "node": ">=12" + "node": ">=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { @@ -1795,6 +1789,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1813,9 +1818,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1823,55 +1828,6 @@ "@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, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2186,16 +2142,6 @@ "tippy.js": "^6.3.1" } }, - "node_modules/@tailwindcss/aspect-ratio": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/aspect-ratio/-/aspect-ratio-0.4.2.tgz", - "integrity": "sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1" - } - }, "node_modules/@tailwindcss/forms": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", @@ -2209,26 +2155,315 @@ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" } }, + "node_modules/@tailwindcss/node": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.13.tgz", + "integrity": "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.5.1", + "lightningcss": "1.30.1", + "magic-string": "^0.30.18", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.13" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.13.tgz", + "integrity": "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.13", + "@tailwindcss/oxide-darwin-arm64": "4.1.13", + "@tailwindcss/oxide-darwin-x64": "4.1.13", + "@tailwindcss/oxide-freebsd-x64": "4.1.13", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.13", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.13", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.13", + "@tailwindcss/oxide-linux-x64-musl": "4.1.13", + "@tailwindcss/oxide-wasm32-wasi": "4.1.13", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.13", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.13" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.13.tgz", + "integrity": "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.13.tgz", + "integrity": "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.13.tgz", + "integrity": "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.13.tgz", + "integrity": "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.13.tgz", + "integrity": "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.13.tgz", + "integrity": "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.13.tgz", + "integrity": "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.13.tgz", + "integrity": "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.13.tgz", + "integrity": "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.13.tgz", + "integrity": "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.5", + "@emnapi/runtime": "^1.4.5", + "@emnapi/wasi-threads": "^1.0.4", + "@napi-rs/wasm-runtime": "^0.2.12", + "@tybys/wasm-util": "^0.10.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.13.tgz", + "integrity": "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.13.tgz", + "integrity": "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.13.tgz", + "integrity": "sha512-HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.13", + "@tailwindcss/oxide": "4.1.13", + "postcss": "^8.4.41", + "tailwindcss": "4.1.13" + } + }, "node_modules/@tailwindcss/typography": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", - "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.18.tgz", + "integrity": "sha512-dDIgwZOlf+tVkZ7A029VvQ1+ngKATENDjMEx2N35s2yPjfTS05RWSM8ilhEWSa5DMJ6ci2Ha9WNZEd2GQjrdQg==", "dev": true, "license": "MIT", "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.13.tgz", + "integrity": "sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.13", + "@tailwindcss/oxide": "4.1.13", + "tailwindcss": "4.1.13" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, "node_modules/@tailwindplus/elements": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@tailwindplus/elements/-/elements-1.0.13.tgz", "integrity": "sha512-Y0K4D47rf/+Bnj2NLPl+AJykujDsEtcF+CL1DiVnE/qjmxA50+FSACNKmoyAPURq6RF/IrS0YIb8xUjtvstCSw==", + "dev": true, "license": "SEE LICENSE IN LICENSE.md" }, "node_modules/@types/estree": { @@ -2265,60 +2500,6 @@ "@vue/reactivity": "~3.1.1" } }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "ISC", - "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, - "license": "MIT" - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2364,53 +2545,10 @@ "postcss": "^8.1.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.25.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", - "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "node_modules/browserslist": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", + "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", "dev": true, "funding": [ { @@ -2450,16 +2588,6 @@ "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, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001741", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz", @@ -2481,72 +2609,14 @@ ], "license": "CC-BY-4.0" }, - "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, - "license": "MIT", - "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, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 6" + "node": ">=18" } }, "node_modules/cosmiconfig": { @@ -2576,21 +2646,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, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/css-blank-pseudo": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", @@ -2749,26 +2804,15 @@ "node": ">=4" } }, - "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, - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "node_modules/detect-libc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", + "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } }, "node_modules/electron-to-chromium": { "version": "1.5.215", @@ -2777,12 +2821,19 @@ "dev": true, "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==", + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, - "license": "MIT" + "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", @@ -2856,76 +2907,6 @@ "node": ">=6" } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -2955,62 +2936,12 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } + "license": "ISC" }, "node_modules/highlight.js": { "version": "11.11.1", @@ -3046,101 +2977,6 @@ "dev": true, "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, - "license": "MIT", - "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, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/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, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jiti": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", @@ -3198,83 +3034,267 @@ "vite": "^7.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==", + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", "dev": true, - "license": "MIT", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, "engines": { - "node": ">=14" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/antonk52" + "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==", + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "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/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "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==", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC" + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8.6" + "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==", + "dev": true, + "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/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/mini-svg-data-uri": { @@ -3287,22 +3307,6 @@ "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, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -3313,16 +3317,17 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" } }, "node_modules/nanoid": { @@ -3351,16 +3356,6 @@ "dev": true, "license": "MIT" }, - "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", @@ -3371,33 +3366,6 @@ "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, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "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, - "license": "BlueOak-1.0.0" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3430,40 +3398,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, - "license": "MIT", - "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, - "license": "MIT" - }, - "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, - "license": "BlueOak-1.0.0", - "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/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3484,26 +3418,6 @@ "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -3983,44 +3897,6 @@ "postcss": "^8.4" } }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "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-lab-function": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.11.tgz", @@ -4051,42 +3927,6 @@ "postcss": "^8.4" } }, - "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" - } - ], - "license": "MIT", - "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-loader": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.2.0.tgz", @@ -4145,72 +3985,32 @@ "postcss": "^8.4" } }, - "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==", + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", "dev": true, "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "type": "github", + "url": "https://github.com/sponsors/csstools" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], - "license": "MIT", + "license": "MIT-0", "dependencies": { - "postcss-selector-parser": "^6.1.1" + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">=12.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-nesting": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", - "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-resolve-nested": "^3.1.0", - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.4" } }, "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { @@ -4663,71 +4463,6 @@ } } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/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, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "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", @@ -4738,17 +4473,6 @@ "node": ">=4" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rollup": { "version": "4.50.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", @@ -4790,30 +4514,6 @@ "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" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -4827,42 +4527,6 @@ "node": ">=10" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4873,229 +4537,42 @@ "node": ">=0.10.0" } }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "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", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "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==", + "node_modules/tailwindcss": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz", + "integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==", "dev": true, "license": "MIT" }, - "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==", + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" + "node": ">=6" }, "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, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/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, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "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==", + "node_modules/tar": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "thenify": ">= 3.1.0 < 4" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=0.8" + "node": ">=18" } }, "node_modules/tinyglobby": { @@ -5156,26 +4633,6 @@ "@popperjs/core": "^2.9.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/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, - "license": "Apache-2.0" - }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -5331,131 +4788,14 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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, - "license": "MIT", - "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", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 14.6" + "node": ">=18" } } } diff --git a/package.json b/package.json index 6f01a95c..6c1deb96 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,11 @@ "@alpinejs/intersect": "^3.6.1", "@awcodes/alpine-floating-ui": "^3.5.0", "@ryangjchandler/alpine-tooltip": "^2.0.1", - "@tailwindcss/aspect-ratio": "^0.4.2", - "@tailwindcss/forms": "^0.5.7", - "@tailwindcss/typography": "^0.5.10", + "@tailwindcss/forms": "^0.5.10", + "@tailwindcss/typography": "^0.5.18", + "@tailwindcss/vite": "^4.1.13", + "@tailwindcss/postcss": "^4.1.13", + "@tailwindplus/elements": "^1.0.13", "alpinejs": "^3.12.0", "autoprefixer": "^10.4.16", "highlight.js": "^11.7.0", @@ -24,11 +26,8 @@ "postcss-preset-env": "^10.1.0", "prettier": "^3.2.5", "prettier-plugin-tailwindcss": "^0.6.8", - "tailwindcss": "^3.4.10", + "tailwindcss": "^4.1.13", "tippy.js": "^6.3.7", "vite": "^7.1.7" - }, - "dependencies": { - "@tailwindplus/elements": "^1.0.13" } } diff --git a/phpunit.ci.xml b/phpunit.ci.xml index 123810b7..2ba3a8b8 100644 --- a/phpunit.ci.xml +++ b/phpunit.ci.xml @@ -25,7 +25,6 @@ - @@ -34,4 +33,4 @@ ./app - \ No newline at end of file + diff --git a/phpunit.xml b/phpunit.xml index a5e78db8..5f305fa2 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -25,7 +25,6 @@ - diff --git a/postcss.config.js b/postcss.config.js index 2e7af2b7..a7f73a2d 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,5 @@ export default { plugins: { - tailwindcss: {}, - autoprefixer: {}, + '@tailwindcss/postcss': {}, }, } diff --git a/resources/css/app.css b/resources/css/app.css index 4e4a288a..5fb99ec6 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1,47 +1,134 @@ -@import 'tailwindcss/base'; -@import 'tailwindcss/components'; -@import 'tailwindcss/utilities'; +@import 'tailwindcss'; -@import 'base.css'; -@import 'tag.css'; -@import 'forms.css'; -@import 'torchlight.css'; -@import 'forum.css'; -@import 'header.css'; +@import './components/base.css'; +@import './components/forms.css'; +@import './components/forum.css'; +@import './components/header.css'; +@import './components/tag.css'; +@import './components/torchlight.css'; +@import './components/typography.css'; + +@plugin '@tailwindcss/typography'; +@plugin '@tailwindcss/forms'; + +@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; +@source '../../vendor/filament/**/*.blade.php'; +@source '../../storage/framework/views/*.php'; +@source '../**/*.blade.php'; +@source '../**/*.js'; + +:root { + --laravel: #F56857; + --livewire: #fb70a9; + --inertia: #8b5cf6; + --javascript: #f7df1e; + --typesript: #007acc; + --react: #53c1de; + --vue-js: #41b883; + --php: #777bb3; + --digital-ocean: #0080ff; + --forge: #19b69b; + --packages: #4f46e5; + --outils: #22d3ee; + --tailwindcss: #06b6d4; + --design: #78350f; + --alpinejs: #2d3441; + --open-source: #f97316; + --freelance: #f43f5e; + --salaire: #c7d2fe; + --projets: #14b8a6; + --entrepreneuriat: #0ea5e9; + --paiement-en-ligne: #10b981; + --branding: #ec4899; + --applications: #0284c7; + --developpement: #4d7c0f; + --event: #36bffa; + --tutoriel: #164e63; + --communaute: #dd2590; + --astuces: #d6bbfb; +} + +@theme { + /* Custom Colors */ + --color-flag-green: #099170; + --color-flag-red: #e21b30; + --color-flag-yellow: #ffdc44; + --color-black: #161B22; + + --color-gray-50: oklch(98.5% 0 0); + --color-gray-100: oklch(96.7% 0.001 286.375); + --color-gray-200: oklch(92% 0.004 286.32); + --color-gray-300: oklch(87.1% 0.006 286.286); + --color-gray-400: oklch(70.5% 0.015 286.067); + --color-gray-500: oklch(55.2% 0.016 285.938); + --color-gray-600: oklch(44.2% 0.017 285.786); + --color-gray-700: oklch(37% 0.013 285.805); + --color-gray-800: oklch(27.4% 0.006 286.033); + --color-gray-900: oklch(21% 0.006 285.885); + --color-gray-950: oklch(14.1% 0.005 285.823); + + --color-primary-50: #ecfdf6; + --color-primary-100: #d2f9e8; + --color-primary-200: #a9f1d5; + --color-primary-300: #71e4be; + --color-primary-400: #38cfa2; + --color-primary-500: #15b48a; + --color-primary-600: #099170; + --color-primary-700: #07755d; + --color-primary-800: #085d4b; + --color-primary-900: #084c3f; + --color-primary-950: #032b24; + + /* Font Families */ + --font-family-heading: Rota, ui-sans-serif, system-ui; + --font-family-mono: "Geist Mono", ui-monospace, monospace; + --font-family-sans: "Instrument Sans", ui-sans-serif, system-ui; + + /* Custom Widths */ + --width-90: 22.5rem; + + /* Animation Variables */ + --marquee-duration: 15s; + + /* Animation Durations */ + --animate-fade-in: fade-in 0.5s linear forwards; + --animate-marquee: marquee var(--marquee-duration) linear infinite; + --animate-spin-slow: spin 4s linear infinite; + --animate-spin-slower: spin 6s linear infinite; + --animate-spin-reverse: spin-reverse 1s linear infinite; + --animate-spin-reverse-slow: spin-reverse 4s linear infinite; + --animate-spin-reverse-slower: spin-reverse 6s linear infinite; + --animate-scroll-slow: scroll 30s linear infinite; + --animate-rotate: rotate 8s linear infinite; +} + +@keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes marquee { + 100% { transform: translateY(-50%); } +} + +@keyframes spin-reverse { + to { transform: rotate(-360deg); } +} + +@keyframes scroll { + from { transform: translateX(0); } + to { transform: translateX(-100%); } +} + +@keyframes rotate { + 0% { transform: rotate(0deg) scale(10); } + 100% { transform: rotate(-360deg) scale(10); } +} + +@custom-variant dark (&:where(.dark, .dark *)); @property --border-angle { inherits: false; initial-value: 0deg; syntax: ''; } - -:root { - --laravel: #F56857; - --livewire: #fb70a9; - --inertia: #8b5cf6; - --javascript: #f7df1e; - --typesript: #007acc; - --react: #53c1de; - --vue-js: #41b883; - --php: #777bb3; - --digital-ocean: #0080ff; - --forge: #19b69b; - --packages: #4f46e5; - --outils: #22d3ee; - --tailwindcss: #06b6d4; - --design: #78350f; - --alpinejs: #2d3441; - --open-source: #f97316; - --freelance: #f43f5e; - --salaire: #c7d2fe; - --projets: #14b8a6; - --entrepreneuriat: #0ea5e9; - --paiement-en-ligne: #10b981; - --branding: #ec4899; - --applications: #0284c7; - --developpement: #4d7c0f; - --event: #36bffa; - --tutoriel: #164e63; - --communaute: #dd2590; - --astuces: #d6bbfb; -} diff --git a/resources/css/base.css b/resources/css/base.css deleted file mode 100644 index ba9e27cc..00000000 --- a/resources/css/base.css +++ /dev/null @@ -1,62 +0,0 @@ -html, -body { height: 100%; } -input { width: 100%; } - -[x-cloak] { - display: none !important; -} - -@font-face { - font-family: 'Rota'; - src: url('../fonts/rota/rota-semibold-webfont.woff2') format('woff2'), - url('../fonts/rota/rota-semibold-webfont.woff') format('woff'); - font-weight: 600; - font-style: swap; -} - -@font-face { - font-family: 'Rota'; - src: url('../fonts/rota/rota-regular-webfont.woff2') format('woff2'), - url('../fonts/rota/rota-regular-webfont.woff') format('woff'); - font-weight: 400; - font-style: swap; -} - -@font-face { - font-family: 'Rota'; - src: url('../fonts/rota/rota-medium-webfont.woff2') format('woff2'), - url('../fonts/rota/rota-medium-webfont.woff') format('woff'); - font-weight: 500; - font-style: swap; -} - -@font-face { - font-family: 'Rota'; - src: url('../fonts/rota/rota-bold-webfont.woff2') format('woff2'), - url('../fonts/rota/rota-bold-webfont.woff') format('woff'); - font-weight: 700; - font-style: swap; -} - -.hide-scroll::-webkit-scrollbar { - display: none; -} - -.prose iframe { - @apply w-full; -} - -.animate-scroll-slow:nth-child(2) { - animation-duration: 40s; - animation-delay: 500ms; -} - -.animate-scroll-slow:nth-child(3) { - animation-duration: 50s; - animation-delay: 750ms; -} - -/* Fix style for the phone country input */ -.iti--inline-dropdown .iti__dropdown-content { - @apply mt-2 rounded-lg border-gray-200 dark:border-white/10 shadow !important; -} diff --git a/resources/css/components/base.css b/resources/css/components/base.css new file mode 100644 index 00000000..af4bf093 --- /dev/null +++ b/resources/css/components/base.css @@ -0,0 +1,72 @@ +html, +body { height: 100%; } +input { width: 100%; } + +[x-cloak] { + display: none !important; +} + +@font-face { + font-family: 'Rota'; + src: url('../../fonts/rota/rota-semibold-webfont.woff2') format('woff2'), + url('../../fonts/rota/rota-semibold-webfont.woff') format('woff'); + font-weight: 600; + font-style: swap; +} + +@font-face { + font-family: 'Rota'; + src: url('../../fonts/rota/rota-regular-webfont.woff2') format('woff2'), + url('../../fonts/rota/rota-regular-webfont.woff') format('woff'); + font-weight: 400; + font-style: swap; +} + +@font-face { + font-family: 'Rota'; + src: url('../../fonts/rota/rota-medium-webfont.woff2') format('woff2'), + url('../../fonts/rota/rota-medium-webfont.woff') format('woff'); + font-weight: 500; + font-style: swap; +} + +@font-face { + font-family: 'Rota'; + src: url('../../fonts/rota/rota-bold-webfont.woff2') format('woff2'), + url('../../fonts/rota/rota-bold-webfont.woff') format('woff'); + font-weight: 700; + font-style: swap; +} + +.hide-scroll::-webkit-scrollbar { + display: none; +} + +.prose iframe { + @apply w-full; +} + +.animate-scroll-slow:nth-child(2) { + animation-duration: 40s; + animation-delay: 500ms; +} + +.animate-scroll-slow:nth-child(3) { + animation-duration: 50s; + animation-delay: 750ms; +} + +/* Fix style for the phone country input */ +.iti--inline-dropdown .iti__dropdown-content { + @apply !mt-2 !rounded-lg !border-gray-200 dark:!border-white/10 !shadow; +} + +/* Gradient */ +.section-gradient { + background: radial-gradient(60% 60% at 22% 0, #f4f4f5, #ffffff); + position: relative +} + +.dark .section-gradient { + background: radial-gradient(60% 60% at 22% 0, #0d1d1c, #151515); +} diff --git a/resources/css/forms.css b/resources/css/components/forms.css similarity index 100% rename from resources/css/forms.css rename to resources/css/components/forms.css diff --git a/resources/css/forum.css b/resources/css/components/forum.css similarity index 100% rename from resources/css/forum.css rename to resources/css/components/forum.css diff --git a/resources/css/header.css b/resources/css/components/header.css similarity index 100% rename from resources/css/header.css rename to resources/css/components/header.css diff --git a/resources/css/tag.css b/resources/css/components/tag.css similarity index 100% rename from resources/css/tag.css rename to resources/css/components/tag.css diff --git a/resources/css/torchlight.css b/resources/css/components/torchlight.css similarity index 100% rename from resources/css/torchlight.css rename to resources/css/components/torchlight.css diff --git a/resources/css/components/typography.css b/resources/css/components/typography.css new file mode 100644 index 00000000..2e140ad5 --- /dev/null +++ b/resources/css/components/typography.css @@ -0,0 +1,39 @@ +.prose img { + border-radius: theme(borderRadius.lg); +} + +.prose h1, .prose h2, .prose h3, .prose h4 { + font-family: Rota, sans-serif; +} + +.prose blockquote { + font-style: normal; +} + +.prose blockquote p:first-of-type::before { + content: none; +} + +.prose blockquote p:first-of-type::after { + content: none; +} + +.prose pre, .prose code, .prose p > code { + font-weight: theme(fontWeight.medium); + font-family: "Geist Mono", monospace; + color: theme(colors.amber.500); +} + +.prose li strong, .prose strong { + color: theme(colors.gray.700); + font-weight: 400; +} + +.prose.heading-off h1, +.prose.heading-off h2, +.prose.heading-off h3, +.prose.heading-off h4, +.prose.heading-off h5 { + margin: 10px 0; + font-size: theme(fontSize.base); +} diff --git a/resources/css/filament/admin/custom-theme.css b/resources/css/filament/admin/custom-theme.css new file mode 100644 index 00000000..a78b547e --- /dev/null +++ b/resources/css/filament/admin/custom-theme.css @@ -0,0 +1,64 @@ +.fi-body { + .fi-simple-header .fi-logo { + @apply !h-16; + > svg { + @apply h-full; + } + } + + &.fi-panel-admin { + .fi-sidebar-header { + @apply bg-white ring-1 ring-gray-200/60 lg:shadow-none dark:bg-gray-900 dark:ring-white/10; + .fi-logo { + @apply !h-10; + > svg { + @apply h-full; + } + } + + .fi-icon-btn { + @apply size-10 text-gray-400 rounded-lg -translate-x-2 translate-y-px hover:bg-gray-100 dark:text-gray-500 dark:hover:bg-gray-800; + svg { + display:none; + } + &::after { + content: url('data:image/svg+xml;utf8,'); + @apply size-6 inline-block; /* Ensure the element can have a color */ + } + &:hover::after { + content: url('data:image/svg+xml;utf8,'); + @apply inline-block; /* Ensure the element can have a color */ + } + } + } + + .fi-topbar { + > nav { + @apply shadow-none ring-1 ring-gray-200/60 bg-white dark:bg-gray-900 dark:ring-white/10; + } + } + + .fi-sidebar-nav { + @apply px-0; + + .fi-sidebar-nav-groups { + @apply px-2; + } + + .fi-sidebar-item { + @apply border-l-4 border-transparent rounded-none hover:bg-gray-100 hover:border-gray-200 dark:hover:bg-gray-900 dark:hover:border-gray-700; + &.fi-active { + @apply border-primary-400 hover:border-primary-400 hover:bg-transparent; + } + } + + .fi-sidebar-item-button, .fi-sidebar-group-button { + @apply bg-transparent px-5; + } + } + + .fi-main-ctn { + @apply bg-transparent; + } + } +} diff --git a/resources/css/filament/admin/tailwind.config.js b/resources/css/filament/admin/tailwind.config.js deleted file mode 100644 index bef338c5..00000000 --- a/resources/css/filament/admin/tailwind.config.js +++ /dev/null @@ -1,11 +0,0 @@ -import preset from '../../../../vendor/filament/filament/tailwind.config.preset' - -export default { - presets: [preset], - content: [ - './app/Filament/**/*.php', - './app/Livewire/**/*.php', - './resources/views/filament/**/*.blade.php', - './vendor/filament/**/*.blade.php', - ], -} diff --git a/resources/css/filament/admin/theme.css b/resources/css/filament/admin/theme.css index 176c7c5f..af8a48f6 100644 --- a/resources/css/filament/admin/theme.css +++ b/resources/css/filament/admin/theme.css @@ -1,6 +1,7 @@ -@import '/vendor/filament/filament/resources/css/theme.css'; +@import '../../../../vendor/filament/filament/resources/css/theme.css'; -@config './tailwind.config.js'; +@source '../../../../app/Filament'; +@source '../../../../resources/views/filament'; *::-webkit-scrollbar-track { background-color: transparent; @@ -32,68 +33,3 @@ .hide-scroll::-webkit-scrollbar { display: none; } - -.fi-body { - .fi-simple-header .fi-logo { - @apply h-16 !important; - > svg { - @apply h-full; - } - } - - &.fi-panel-admin { - .fi-sidebar-header { - @apply bg-white ring-1 ring-gray-200/60 lg:shadow-none dark:bg-gray-900 dark:ring-white/10; - .fi-logo { - @apply h-10 !important; - > svg { - @apply h-full; - } - } - - .fi-icon-btn { - @apply size-10 text-gray-400 rounded-lg -translate-x-2 translate-y-px hover:bg-gray-100 dark:text-gray-500 dark:hover:bg-gray-800; - svg { - display:none; - } - &::after { - content: url('data:image/svg+xml;utf8,'); - @apply size-6 inline-block; /* Ensure the element can have a color */ - } - &:hover::after { - content: url('data:image/svg+xml;utf8,'); - @apply inline-block; /* Ensure the element can have a color */ - } - } - } - - .fi-topbar { - > nav { - @apply shadow-none ring-1 ring-gray-200/60 bg-white dark:bg-gray-900 dark:ring-white/10; - } - } - - .fi-sidebar-nav { - @apply px-0; - - .fi-sidebar-nav-groups { - @apply px-2; - } - - .fi-sidebar-item { - @apply border-l-4 border-transparent rounded-none hover:bg-gray-100 hover:border-gray-200 dark:hover:bg-gray-900 dark:hover:border-gray-700; - &.fi-active { - @apply border-primary-400 hover:border-primary-400 hover:bg-transparent; - } - } - - .fi-sidebar-item-button, .fi-sidebar-group-button { - @apply bg-transparent px-5; - } - } - - .fi-main-ctn { - @apply bg-transparent; - } - } -} diff --git a/resources/views/ads/ln.blade.php b/resources/views/ads/ln.blade.php index 09c16960..49bf9510 100644 --- a/resources/views/ads/ln.blade.php +++ b/resources/views/ads/ln.blade.php @@ -1,5 +1,5 @@
+ class="relative space-y-3 bg-white dark:bg-gray-800 ring-1 ring-gray-200 rounded-lg p-4 dark:ring-white/10 shadow-xs transition-all transform duration-200 ease-in-out hover:scale-105 hover:rotate-2 overflow-hidden">
+
{{ $article->title }} diff --git a/resources/views/components/buttons/default.blade.php b/resources/views/components/buttons/default.blade.php index f0cd4d26..2e57d689 100644 --- a/resources/views/components/buttons/default.blade.php +++ b/resources/views/components/buttons/default.blade.php @@ -1,5 +1,5 @@ @php - $classes = 'inline-flex justify-center py-2 px-4 bg-white border-0 ring-1 ring-gray-200 dark:ring-white/20 rounded-lg shadow-sm text-sm text-gray-700 hover:text-gray-900 dark:text-gray-400 hover:bg-white/50 dark:hover:bg-white/10 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-white focus:ring-green-500 dark:bg-gray-800 dark:focus:ring-offset-gray-900'; + $classes = 'inline-flex items-center justify-center py-2 px-4 bg-white ring-1 ring-gray-200 dark:ring-white/20 rounded-lg shadow-xs font-medium text-sm text-gray-700 hover:text-gray-900 hover:bg-white/50 dark:text-white dark:hover:text-white dark:bg-gray-800 dark:hover:bg-white/10 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-offset-white focus:ring-primary-500 dark:focus:ring-offset-gray-900'; @endphp @if ($attributes->hasAny(['href', ':href'])) diff --git a/resources/views/components/buttons/primary.blade.php b/resources/views/components/buttons/primary.blade.php index 9e8f4df0..42be306c 100644 --- a/resources/views/components/buttons/primary.blade.php +++ b/resources/views/components/buttons/primary.blade.php @@ -1,5 +1,5 @@ @php - $classes = 'inline-flex items-center justify-center py-2 px-4 border-0 text-sm font-medium rounded-lg text-white bg-green-600 hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-white focus:ring-green-500 dark:ring-offset-gray-900'; + $classes = 'inline-flex items-center justify-center py-2 px-4 text-sm font-medium rounded-lg text-white bg-primary-600 hover:bg-primary-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-offset-white focus:ring-primary-500 dark:bg-primary-400/10 dark:hover:bg-primary-800/20 dark:text-primary-400 dark:ring-primary-500/20 dark:focus:ring-offset-gray-900'; @endphp @if ($attributes->hasAny(['href', ':href'])) diff --git a/resources/views/components/form-slider-over.blade.php b/resources/views/components/form-slider-over.blade.php index 8884f4fb..6d6b0338 100644 --- a/resources/views/components/form-slider-over.blade.php +++ b/resources/views/components/form-slider-over.blade.php @@ -14,7 +14,7 @@
diff --git a/resources/views/components/layouts/footer.blade.php b/resources/views/components/layouts/footer.blade.php index fc7c343e..d835f63c 100644 --- a/resources/views/components/layouts/footer.blade.php +++ b/resources/views/components/layouts/footer.blade.php @@ -1,132 +1,124 @@ -