From 324e57e5f5dc16dc47536acbd22285853b6948ea Mon Sep 17 00:00:00 2001 From: Toy Rik Date: Sat, 21 Feb 2026 09:13:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B4=D0=B5=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=BE=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Domain/Shared/Exceptions/AppException.php | 22 +- .../Shared/Repositories/BaseRepository.php | 46 + src/app/Domain/User/Actions/ShowAction.php | 23 + src/app/Domain/User/Data/ShowRequest.php | 29 + src/app/Domain/User/Data/UpdateRequest.php | 14 + .../User/Repositories/UserRepository.php | 13 + src/app/Helpers/MenuHelper.php | 56 + src/app/Http/Controllers/UserController.php | 14 +- .../Http/Middleware/CheckRoleMiddleware.php | 2 + src/app/Providers/FortifyServiceProvider.php | 2 +- src/composer.json | 3 +- src/composer.lock | 1054 +++++++++++------ src/package-lock.json | 27 + src/package.json | 3 + src/pint.json | 11 +- src/public/favicon.ico | Bin 0 -> 15086 bytes src/resources/css/app.css | 280 ++++- src/resources/img/avatar.png | Bin 0 -> 8118 bytes src/resources/img/avatar2.png | Bin 0 -> 9246 bytes src/resources/img/logo.png | Bin 0 -> 16253 bytes src/resources/js/app.js | 10 + .../common/page-breadcrumb.blade.php | 1 + .../components/profile/address-card.blade.php | 0 .../profile/personal-info-card.blade.php | 0 .../components/profile/profile-card.blade.php | 0 src/resources/views/layouts/app.blade.php | 15 +- .../layouts/partials/app-header.blade.php | 117 +- .../views/layouts/partials/head.blade.php | 34 +- .../views/layouts/partials/sidebar.blade.php | 229 ++++ .../views/{ => pages}/auth/login.blade.php | 0 .../views/{ => pages}/user/index.blade.php | 0 src/resources/views/pages/user/show.blade.php | 13 + src/routes/web.php | 15 +- src/tests/Feature/UserControllerTest.php | 23 + 34 files changed, 1647 insertions(+), 409 deletions(-) create mode 100644 src/app/Domain/Shared/Repositories/BaseRepository.php create mode 100644 src/app/Domain/User/Actions/ShowAction.php create mode 100644 src/app/Domain/User/Data/ShowRequest.php create mode 100644 src/app/Domain/User/Data/UpdateRequest.php create mode 100644 src/app/Domain/User/Repositories/UserRepository.php create mode 100644 src/app/Helpers/MenuHelper.php create mode 100644 src/resources/img/avatar.png create mode 100644 src/resources/img/avatar2.png create mode 100644 src/resources/img/logo.png create mode 100644 src/resources/views/components/common/page-breadcrumb.blade.php create mode 100644 src/resources/views/components/profile/address-card.blade.php create mode 100644 src/resources/views/components/profile/personal-info-card.blade.php create mode 100644 src/resources/views/components/profile/profile-card.blade.php create mode 100644 src/resources/views/layouts/partials/sidebar.blade.php rename src/resources/views/{ => pages}/auth/login.blade.php (100%) rename src/resources/views/{ => pages}/user/index.blade.php (100%) create mode 100644 src/resources/views/pages/user/show.blade.php create mode 100644 src/tests/Feature/UserControllerTest.php diff --git a/src/app/Domain/Shared/Exceptions/AppException.php b/src/app/Domain/Shared/Exceptions/AppException.php index 660ddd0..4744bcd 100644 --- a/src/app/Domain/Shared/Exceptions/AppException.php +++ b/src/app/Domain/Shared/Exceptions/AppException.php @@ -8,6 +8,7 @@ use Illuminate\Contracts\Support\Arrayable; use Exception; use Illuminate\Http\JsonResponse; use Illuminate\Support\Carbon; +use Symfony\Component\HttpFoundation\Response; use Throwable; class AppException extends Exception implements Arrayable @@ -16,11 +17,10 @@ class AppException extends Exception implements Arrayable public function __construct( string $errorSlug, - string $message = "", - int $code = 0, + string $message = "", + int $code = 0, Throwable|null $previous = null - ) - { + ) { $this->errorSlug = $errorSlug; parent::__construct($message, $code, $previous); } @@ -70,4 +70,16 @@ class AppException extends Exception implements Arrayable ): never { throw new self($slug, $message, $code, $previous); } -} \ No newline at end of file + + public static function serviceUnavailable( + string $message = 'Ошибка сервера', + Throwable|null $previous = null, + ): never { + throw new self( + errorSlug: 'service_unavailable', + message: $message, + code: Response::HTTP_SERVICE_UNAVAILABLE, + previous: $previous + ); + } +} diff --git a/src/app/Domain/Shared/Repositories/BaseRepository.php b/src/app/Domain/Shared/Repositories/BaseRepository.php new file mode 100644 index 0000000..4b1bba3 --- /dev/null +++ b/src/app/Domain/Shared/Repositories/BaseRepository.php @@ -0,0 +1,46 @@ +model)) { + AppException::serviceUnavailable('model должен быть определён в репозитории'); + } + + if (!is_subclass_of($this->model, Model::class)) { + AppException::serviceUnavailable('Модель репозитория должна быть подклассом Illuminate\Database\Eloquent\Model'); + } + + parent::__construct(); + } + + public function __get($key) + { + AppException::serviceUnavailable('Невозможно получить свойство напрямую через репозиторий'); + } + + /** + * Подмена возвращаемого значения не репозиторий а модель + * + * @return Builder + */ + public function newQueryWithoutScopes(): Builder + { + $calledClass = get_called_class(); + $instance = new $calledClass(); + $model = new $instance->model(); + return $model->newQuery(); + } +} + diff --git a/src/app/Domain/User/Actions/ShowAction.php b/src/app/Domain/User/Actions/ShowAction.php new file mode 100644 index 0000000..49e5ac6 --- /dev/null +++ b/src/app/Domain/User/Actions/ShowAction.php @@ -0,0 +1,23 @@ +userRepository->whereUuid($request->user_uuid)->firstOrFail(); + } +} diff --git a/src/app/Domain/User/Data/ShowRequest.php b/src/app/Domain/User/Data/ShowRequest.php new file mode 100644 index 0000000..8290a26 --- /dev/null +++ b/src/app/Domain/User/Data/ShowRequest.php @@ -0,0 +1,29 @@ + 'Идентификатор пользователя' + ]; + } +} diff --git a/src/app/Domain/User/Data/UpdateRequest.php b/src/app/Domain/User/Data/UpdateRequest.php new file mode 100644 index 0000000..ea20bad --- /dev/null +++ b/src/app/Domain/User/Data/UpdateRequest.php @@ -0,0 +1,14 @@ + 'dashboard', + 'name' => 'Dashboard', + 'path' => route('dashboard') + ], + [ + 'icon' => 'user-profile', + 'name' => 'User Profile', + 'path' => auth()->check() ? route('users.show', ['user_uuid' => auth()->user()->uuid]) : '#' + ] + ]; + } + + public static function getOterItems(): array + { + return []; + } + + public static function getMenuGroups(): array + { + return [ + [ + 'title' => 'Menu', + 'items' => self::getMainNavItems(), + ], + [ + 'title' => 'Others', + 'items' => self::getOterItems() + ] + ]; + } + + public static function isActive($path) + { + return request()->is($path, '/'); + } + + public static function getIconSvg($iconName) + { + $icons = [ + 'dashboard' => '', + ]; + return $icons[$iconName] ?? ''; + } +} diff --git a/src/app/Http/Controllers/UserController.php b/src/app/Http/Controllers/UserController.php index 4601eb7..7c89efe 100644 --- a/src/app/Http/Controllers/UserController.php +++ b/src/app/Http/Controllers/UserController.php @@ -4,10 +4,20 @@ declare(strict_types=1); namespace App\Http\Controllers; +use App\Domain\User\Actions\ShowAction; +use App\Domain\User\Data\ShowRequest; +use Illuminate\Contracts\View\View; + class UserController extends Controller { - public function index() + public function index(): View { - return view('user.index', []); + return view('pages.user.index', []); + } + + public function show(ShowRequest $request, ShowAction $action): View + { + $data = $action->execute($request); + return view('pages.user.show', ['data' => $data]); } } diff --git a/src/app/Http/Middleware/CheckRoleMiddleware.php b/src/app/Http/Middleware/CheckRoleMiddleware.php index 05264aa..ca4f02a 100644 --- a/src/app/Http/Middleware/CheckRoleMiddleware.php +++ b/src/app/Http/Middleware/CheckRoleMiddleware.php @@ -1,5 +1,7 @@ =14" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" + }, + "time": "2026-02-07T07:09:04+00:00" + }, { "name": "doctrine/inflector", "version": "2.1.0", @@ -1222,16 +1270,16 @@ }, { "name": "laravel/framework", - "version": "v12.49.0", + "version": "v12.51.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "4bde4530545111d8bdd1de6f545fa8824039fcb5" + "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/4bde4530545111d8bdd1de6f545fa8824039fcb5", - "reference": "4bde4530545111d8bdd1de6f545fa8824039fcb5", + "url": "https://api.github.com/repos/laravel/framework/zipball/ce4de3feb211e47c4f959d309ccf8a2733b1bc16", + "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16", "shasum": "" }, "require": { @@ -1440,34 +1488,34 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-01-28T03:40:49+00:00" + "time": "2026-02-10T18:20:19+00:00" }, { "name": "laravel/prompts", - "version": "v0.3.11", + "version": "v0.3.13", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "dd2a2ed95acacbcccd32fd98dee4c946ae7a7217" + "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/dd2a2ed95acacbcccd32fd98dee4c946ae7a7217", - "reference": "dd2a2ed95acacbcccd32fd98dee4c946ae7a7217", + "url": "https://api.github.com/repos/laravel/prompts/zipball/ed8c466571b37e977532fb2fd3c272c784d7050d", + "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d", "shasum": "" }, "require": { "composer-runtime-api": "^2.2", "ext-mbstring": "*", "php": "^8.1", - "symfony/console": "^6.2|^7.0" + "symfony/console": "^6.2|^7.0|^8.0" }, "conflict": { "illuminate/console": ">=10.17.0 <10.25.0", "laravel/framework": ">=10.17.0 <10.25.0" }, "require-dev": { - "illuminate/collections": "^10.0|^11.0|^12.0", + "illuminate/collections": "^10.0|^11.0|^12.0|^13.0", "mockery/mockery": "^1.5", "pestphp/pest": "^2.3|^3.4|^4.0", "phpstan/phpstan": "^1.12.28", @@ -1497,33 +1545,33 @@ "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.11" + "source": "https://github.com/laravel/prompts/tree/v0.3.13" }, - "time": "2026-01-27T02:55:06+00:00" + "time": "2026-02-06T12:17:10+00:00" }, { "name": "laravel/serializable-closure", - "version": "v2.0.8", + "version": "v2.0.9", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "7581a4407012f5f53365e11bafc520fd7f36bc9b" + "reference": "8f631589ab07b7b52fead814965f5a800459cb3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/7581a4407012f5f53365e11bafc520fd7f36bc9b", - "reference": "7581a4407012f5f53365e11bafc520fd7f36bc9b", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/8f631589ab07b7b52fead814965f5a800459cb3e", + "reference": "8f631589ab07b7b52fead814965f5a800459cb3e", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "illuminate/support": "^10.0|^11.0|^12.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", "nesbot/carbon": "^2.67|^3.0", "pestphp/pest": "^2.36|^3.0|^4.0", "phpstan/phpstan": "^2.0", - "symfony/var-dumper": "^6.2.0|^7.0.0" + "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" }, "type": "library", "extra": { @@ -1560,7 +1608,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-01-08T16:22:46+00:00" + "time": "2026-02-03T06:55:34+00:00" }, { "name": "laravel/tinker", @@ -2292,16 +2340,16 @@ }, { "name": "nesbot/carbon", - "version": "3.11.0", + "version": "3.11.1", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "bdb375400dcd162624531666db4799b36b64e4a1" + "reference": "f438fcc98f92babee98381d399c65336f3a3827f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1", - "reference": "bdb375400dcd162624531666db4799b36b64e4a1", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/f438fcc98f92babee98381d399c65336f3a3827f", + "reference": "f438fcc98f92babee98381d399c65336f3a3827f", "shasum": "" }, "require": { @@ -2325,7 +2373,7 @@ "phpstan/extension-installer": "^1.4.3", "phpstan/phpstan": "^2.1.22", "phpunit/phpunit": "^10.5.53", - "squizlabs/php_codesniffer": "^3.13.4" + "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" }, "bin": [ "bin/carbon" @@ -2368,14 +2416,14 @@ } ], "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.com", + "homepage": "https://carbonphp.github.io/carbon/", "keywords": [ "date", "datetime", "time" ], "support": { - "docs": "https://carbon.nesbot.com/docs", + "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html", "issues": "https://github.com/CarbonPHP/carbon/issues", "source": "https://github.com/CarbonPHP/carbon" }, @@ -2393,20 +2441,20 @@ "type": "tidelift" } ], - "time": "2025-12-02T21:04:28+00:00" + "time": "2026-01-29T09:26:29+00:00" }, { "name": "nette/schema", - "version": "v1.3.3", + "version": "v1.3.4", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004" + "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/2befc2f42d7c715fd9d95efc31b1081e5d765004", - "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004", + "url": "https://api.github.com/repos/nette/schema/zipball/086497a2f34b82fede9b5a41cc8e131d087cd8f7", + "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7", "shasum": "" }, "require": { @@ -2414,8 +2462,8 @@ "php": "8.1 - 8.5" }, "require-dev": { - "nette/tester": "^2.5.2", - "phpstan/phpstan-nette": "^2.0@stable", + "nette/tester": "^2.6", + "phpstan/phpstan": "^2.0@stable", "tracy/tracy": "^2.8" }, "type": "library", @@ -2456,22 +2504,22 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.3" + "source": "https://github.com/nette/schema/tree/v1.3.4" }, - "time": "2025-10-30T22:57:59+00:00" + "time": "2026-02-08T02:54:00+00:00" }, { "name": "nette/utils", - "version": "v4.1.1", + "version": "v4.1.2", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72" + "reference": "f76b5dc3d6c6d3043c8d937df2698515b99cbaf5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/c99059c0315591f1a0db7ad6002000288ab8dc72", - "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72", + "url": "https://api.github.com/repos/nette/utils/zipball/f76b5dc3d6c6d3043c8d937df2698515b99cbaf5", + "reference": "f76b5dc3d6c6d3043c8d937df2698515b99cbaf5", "shasum": "" }, "require": { @@ -2484,7 +2532,7 @@ "require-dev": { "jetbrains/phpstorm-attributes": "^1.2", "nette/tester": "^2.5", - "phpstan/phpstan-nette": "^2.0@stable", + "phpstan/phpstan": "^2.0@stable", "tracy/tracy": "^2.9" }, "suggest": { @@ -2545,9 +2593,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.1" + "source": "https://github.com/nette/utils/tree/v4.1.2" }, - "time": "2025-12-22T12:14:32+00:00" + "time": "2026-02-03T17:21:09+00:00" }, { "name": "nikic/php-parser", @@ -2763,6 +2811,253 @@ }, "time": "2025-09-24T15:06:41+00:00" }, + { + "name": "phpdocumentor/reflection", + "version": "6.4.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/Reflection.git", + "reference": "5e5db15b34e6eae755cb97beaa7fe076ae9e8d4c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/5e5db15b34e6eae755cb97beaa7fe076ae9e8d4c", + "reference": "5e5db15b34e6eae755cb97beaa7fe076ae9e8d4c", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "nikic/php-parser": "~4.18 || ^5.0", + "php": "8.1.*|8.2.*|8.3.*|8.4.*|8.5.*", + "phpdocumentor/reflection-common": "^2.1", + "phpdocumentor/reflection-docblock": "^5", + "phpdocumentor/type-resolver": "^1.4", + "symfony/polyfill-php80": "^1.28", + "webmozart/assert": "^1.7" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/coding-standard": "^13.0", + "eliashaeussler/phpunit-attributes": "^1.8", + "mikey179/vfsstream": "~1.2", + "mockery/mockery": "~1.6.0", + "phpspec/prophecy-phpunit": "^2.4", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^10.5.53", + "psalm/phar": "^6.0", + "rector/rector": "^1.0.0", + "squizlabs/php_codesniffer": "^3.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-5.x": "5.3.x-dev", + "dev-6.x": "6.0.x-dev" + } + }, + "autoload": { + "files": [ + "src/php-parser/Modifiers.php" + ], + "psr-4": { + "phpDocumentor\\": "src/phpDocumentor" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Reflection library to do Static Analysis for PHP Projects", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/Reflection/issues", + "source": "https://github.com/phpDocumentor/Reflection/tree/6.4.4" + }, + "time": "2025-11-25T21:21:18+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.6.6", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/5cee1d3dfc2d2aa6599834520911d246f656bcb8", + "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", + "webmozart/assert": "^1.9.1 || ^2" + }, + "require-dev": { + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.6" + }, + "time": "2025-12-22T21:13:58+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0" + }, + "time": "2025-11-21T15:09:14+00:00" + }, { "name": "phpoption/phpoption", "version": "1.9.5", @@ -2838,6 +3133,53 @@ ], "time": "2025-12-27T19:41:33+00:00" }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.3.2", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" + }, + "time": "2026-01-25T14:56:51+00:00" + }, { "name": "pragmarx/google2fa", "version": "v9.0.0", @@ -3579,6 +3921,228 @@ }, "time": "2025-12-14T04:43:48+00:00" }, + { + "name": "spatie/laravel-data", + "version": "4.19.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-data.git", + "reference": "41ed0472250676f19440fb24d7b62a8d43abdb89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/41ed0472250676f19440fb24d7b62a8d43abdb89", + "reference": "41ed0472250676f19440fb24d7b62a8d43abdb89", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0|^11.0|^12.0", + "php": "^8.1", + "phpdocumentor/reflection": "^6.0", + "spatie/laravel-package-tools": "^1.9.0", + "spatie/php-structure-discoverer": "^2.0" + }, + "require-dev": { + "fakerphp/faker": "^1.14", + "friendsofphp/php-cs-fixer": "^3.0", + "inertiajs/inertia-laravel": "^2.0", + "livewire/livewire": "^3.0", + "mockery/mockery": "^1.6", + "nesbot/carbon": "^2.63|^3.0", + "orchestra/testbench": "^8.37.0|^9.16|^10.9", + "pestphp/pest": "^2.36|^3.8|^4.3", + "pestphp/pest-plugin-laravel": "^2.4|^3.0|^4.0", + "pestphp/pest-plugin-livewire": "^2.1|^3.0|^4.0", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "spatie/invade": "^1.0", + "spatie/laravel-typescript-transformer": "^2.5", + "spatie/pest-plugin-snapshots": "^2.1", + "spatie/test-time": "^1.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelData\\LaravelDataServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\LaravelData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ruben Van Assche", + "email": "ruben@spatie.be", + "role": "Developer" + } + ], + "description": "Create unified resources and data transfer objects", + "homepage": "https://github.com/spatie/laravel-data", + "keywords": [ + "laravel", + "laravel-data", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-data/issues", + "source": "https://github.com/spatie/laravel-data/tree/4.19.1" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-01-28T13:10:20+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.92.7", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "f09a799850b1ed765103a4f0b4355006360c49a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f09a799850b1ed765103a4f0b4355006360c49a5", + "reference": "f09a799850b1ed765103a4f0b4355006360c49a5", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^9.28|^10.0|^11.0|^12.0", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "orchestra/testbench": "^7.7|^8.0|^9.0|^10.0", + "pestphp/pest": "^1.23|^2.1|^3.1", + "phpunit/php-code-coverage": "^9.0|^10.0|^11.0", + "phpunit/phpunit": "^9.5.24|^10.5|^11.5", + "spatie/pest-plugin-test-time": "^1.1|^2.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.92.7" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2025-07-17T15:46:43+00:00" + }, + { + "name": "spatie/php-structure-discoverer", + "version": "2.3.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/php-structure-discoverer.git", + "reference": "552a5b974a9853a32e5677a66e85ae615a96a90b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/php-structure-discoverer/zipball/552a5b974a9853a32e5677a66e85ae615a96a90b", + "reference": "552a5b974a9853a32e5677a66e85ae615a96a90b", + "shasum": "" + }, + "require": { + "illuminate/collections": "^11.0|^12.0", + "php": "^8.3", + "spatie/laravel-package-tools": "^1.92.7", + "symfony/finder": "^6.0|^7.3.5|^8.0" + }, + "require-dev": { + "amphp/parallel": "^2.3.2", + "illuminate/console": "^11.0|^12.0", + "nunomaduro/collision": "^7.0|^8.8.3", + "orchestra/testbench": "^9.5|^10.8", + "pestphp/pest": "^3.8|^4.0", + "pestphp/pest-plugin-laravel": "^3.2|^4.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.2", + "spatie/laravel-ray": "^1.43.1" + }, + "suggest": { + "amphp/parallel": "When you want to use the Parallel discover worker" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\StructureDiscoverer\\StructureDiscovererServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\StructureDiscoverer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ruben Van Assche", + "email": "ruben@spatie.be", + "role": "Developer" + } + ], + "description": "Automatically discover structures within your PHP application", + "homepage": "https://github.com/spatie/php-structure-discoverer", + "keywords": [ + "discover", + "laravel", + "php", + "php-structure-discoverer" + ], + "support": { + "issues": "https://github.com/spatie/php-structure-discoverer/issues", + "source": "https://github.com/spatie/php-structure-discoverer/tree/2.3.3" + }, + "funding": [ + { + "url": "https://github.com/LaravelAutoDiscoverer", + "type": "github" + } + ], + "time": "2025-11-24T16:41:01+00:00" + }, { "name": "symfony/clock", "version": "v8.0.0", @@ -6283,6 +6847,64 @@ } ], "time": "2024-11-21T01:49:47+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-date": "*", + "ext-filter": "*", + "php": "^7.2 || ^8.0" + }, + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.12.1" + }, + "time": "2025-10-29T15:56:20+00:00" } ], "packages-dev": [ @@ -6379,54 +7001,6 @@ ], "time": "2026-01-08T07:23:06+00:00" }, - { - "name": "doctrine/deprecations", - "version": "1.1.5", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", - "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", - "psr/log": "^1 || ^2 || ^3" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" - }, - "time": "2025-04-07T20:06:18+00:00" - }, { "name": "fakerphp/faker", "version": "v1.24.1", @@ -7764,228 +8338,6 @@ }, "time": "2022-02-21T01:04:05+00:00" }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.6.6", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/5cee1d3dfc2d2aa6599834520911d246f656bcb8", - "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.1", - "ext-filter": "*", - "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7|^2.0", - "webmozart/assert": "^1.9.1 || ^2" - }, - "require-dev": { - "mockery/mockery": "~1.3.5 || ~1.6.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-webmozart-assert": "^1.2", - "phpunit/phpunit": "^9.5", - "psalm/phar": "^5.26" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.6" - }, - "time": "2025-12-22T21:13:58+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.12.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", - "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.18|^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0" - }, - "time": "2025-11-21T15:09:14+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "2.3.2", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", - "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^5.3.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^9.6", - "symfony/process": "^5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" - }, - "time": "2026-01-25T14:56:51+00:00" - }, { "name": "phpunit/php-code-coverage", "version": "12.5.2", @@ -9558,68 +9910,6 @@ } ], "time": "2025-12-08T11:19:18+00:00" - }, - { - "name": "webmozart/assert", - "version": "2.1.2", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/ce6a2f100c404b2d32a1dd1270f9b59ad4f57649", - "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-date": "*", - "ext-filter": "*", - "php": "^8.2" - }, - "suggest": { - "ext-intl": "", - "ext-simplexml": "", - "ext-spl": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-feature/2-0": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - }, - { - "name": "Woody Gilk", - "email": "woody.gilk@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.1.2" - }, - "time": "2026-01-13T14:02:24+00:00" } ], "aliases": [], diff --git a/src/package-lock.json b/src/package-lock.json index 14e993c..16842c7 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -4,6 +4,9 @@ "requires": true, "packages": { "": { + "dependencies": { + "alpinejs": "^3.15.8" + }, "devDependencies": { "@tailwindcss/vite": "^4.0.0", "axios": "^1.11.0", @@ -1134,6 +1137,30 @@ "dev": true, "license": "MIT" }, + "node_modules/@vue/reactivity": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", + "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.1.5" + } + }, + "node_modules/@vue/shared": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", + "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==", + "license": "MIT" + }, + "node_modules/alpinejs": { + "version": "3.15.8", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.15.8.tgz", + "integrity": "sha512-zxIfCRTBGvF1CCLIOMQOxAyBuqibxSEwS6Jm1a3HGA9rgrJVcjEWlwLcQTVGAWGS8YhAsTRLVrtQ5a5QT9bSSQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "~3.1.1" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", diff --git a/src/package.json b/src/package.json index 7686b29..a0d8f26 100644 --- a/src/package.json +++ b/src/package.json @@ -13,5 +13,8 @@ "laravel-vite-plugin": "^2.0.0", "tailwindcss": "^4.0.0", "vite": "^7.0.7" + }, + "dependencies": { + "alpinejs": "^3.15.8" } } diff --git a/src/pint.json b/src/pint.json index c684bc5..57fdcdf 100644 --- a/src/pint.json +++ b/src/pint.json @@ -5,6 +5,15 @@ ], "rules": { "declare_strict_types": true, - "concat_space": {"spacing": "one"} + "concat_space": {"spacing": "one"}, + "braces_position": { + "control_structures_opening_brace": "same_line", + "functions_opening_brace": "next_line_unless_newline_at_signature_end", + "anonymous_functions_opening_brace": "same_line", + "classes_opening_brace": "next_line_unless_newline_at_signature_end", + "anonymous_classes_opening_brace": "next_line_unless_newline_at_signature_end", + "allow_single_line_empty_anonymous_classes": false, + "allow_single_line_anonymous_functions": false + } } } \ No newline at end of file diff --git a/src/public/favicon.ico b/src/public/favicon.ico index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..80c30586edf231d4cc5eedffcf8c7161f886543b 100644 GIT binary patch literal 15086 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 T_*5hGw<37`R5@u`hjsr4is3zo literal 0 HcmV?d00001 diff --git a/src/resources/css/app.css b/src/resources/css/app.css index 3e6abea..893cf7d 100644 --- a/src/resources/css/app.css +++ b/src/resources/css/app.css @@ -6,6 +6,282 @@ @source '../**/*.js'; @theme { - --font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', - 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-*: initial; + --font-outfit: Outfit, sans-serif; + + --breakpoint-*: initial; + --breakpoint-2xsm: 375px; + --breakpoint-xsm: 425px; + --breakpoint-3xl: 2000px; + --breakpoint-sm: 640px; + --breakpoint-md: 768px; + --breakpoint-lg: 1024px; + --breakpoint-xl: 1280px; + --breakpoint-2xl: 1536px; + + --text-title-2xl: 72px; + --text-title-2xl--line-height: 90px; + --text-title-xl: 60px; + --text-title-xl--line-height: 72px; + --text-title-lg: 48px; + --text-title-lg--line-height: 60px; + --text-title-md: 36px; + --text-title-md--line-height: 44px; + --text-title-sm: 30px; + --text-title-sm--line-height: 38px; + --text-theme-xl: 20px; + --text-theme-xl--line-height: 30px; + --text-theme-sm: 14px; + --text-theme-sm--line-height: 20px; + --text-theme-xs: 12px; + --text-theme-xs--line-height: 18px; + + --color-current: currentColor; + --color-transparent: transparent; + --color-white: #ffffff; + --color-black: #101828; + + --color-brand-25: #f2f7ff; + --color-brand-50: #ecf3ff; + --color-brand-100: #dde9ff; + --color-brand-200: #c2d6ff; + --color-brand-300: #9cb9ff; + --color-brand-400: #7592ff; + --color-brand-500: #465fff; + --color-brand-600: #3641f5; + --color-brand-700: #2a31d8; + --color-brand-800: #252dae; + --color-brand-900: #262e89; + --color-brand-950: #161950; + + --color-blue-light-25: #f5fbff; + --color-blue-light-50: #f0f9ff; + --color-blue-light-100: #e0f2fe; + --color-blue-light-200: #b9e6fe; + --color-blue-light-300: #7cd4fd; + --color-blue-light-400: #36bffa; + --color-blue-light-500: #0ba5ec; + --color-blue-light-600: #0086c9; + --color-blue-light-700: #026aa2; + --color-blue-light-800: #065986; + --color-blue-light-900: #0b4a6f; + --color-blue-light-950: #062c41; + + --color-gray-25: #fcfcfd; + --color-gray-50: #f9fafb; + --color-gray-100: #f2f4f7; + --color-gray-200: #e4e7ec; + --color-gray-300: #d0d5dd; + --color-gray-400: #98a2b3; + --color-gray-500: #667085; + --color-gray-600: #475467; + --color-gray-700: #344054; + --color-gray-800: #1d2939; + --color-gray-900: #101828; + --color-gray-950: #0c111d; + --color-gray-dark: #1a2231; + + --color-orange-25: #fffaf5; + --color-orange-50: #fff6ed; + --color-orange-100: #ffead5; + --color-orange-200: #fddcab; + --color-orange-300: #feb273; + --color-orange-400: #fd853a; + --color-orange-500: #fb6514; + --color-orange-600: #ec4a0a; + --color-orange-700: #c4320a; + --color-orange-800: #9c2a10; + --color-orange-900: #7e2410; + --color-orange-950: #511c10; + + --color-success-25: #f6fef9; + --color-success-50: #ecfdf3; + --color-success-100: #d1fadf; + --color-success-200: #a6f4c5; + --color-success-300: #6ce9a6; + --color-success-400: #32d583; + --color-success-500: #12b76a; + --color-success-600: #039855; + --color-success-700: #027a48; + --color-success-800: #05603a; + --color-success-900: #054f31; + --color-success-950: #053321; + + --color-error-25: #fffbfa; + --color-error-50: #fef3f2; + --color-error-100: #fee4e2; + --color-error-200: #fecdca; + --color-error-300: #fda29b; + --color-error-400: #f97066; + --color-error-500: #f04438; + --color-error-600: #d92d20; + --color-error-700: #b42318; + --color-error-800: #912018; + --color-error-900: #7a271a; + --color-error-950: #55160c; + + --color-warning-25: #fffcf5; + --color-warning-50: #fffaeb; + --color-warning-100: #fef0c7; + --color-warning-200: #fedf89; + --color-warning-300: #fec84b; + --color-warning-400: #fdb022; + --color-warning-500: #f79009; + --color-warning-600: #dc6803; + --color-warning-700: #b54708; + --color-warning-800: #93370d; + --color-warning-900: #7a2e0e; + --color-warning-950: #4e1d09; + + --color-theme-pink-500: #ee46bc; + + --color-theme-purple-500: #7a5af8; + + --shadow-theme-md: 0px 4px 8px -2px rgba(16, 24, 40, 0.1), 0px 2px 4px -2px rgba(16, 24, 40, 0.06); + --shadow-theme-lg: 0px 12px 16px -4px rgba(16, 24, 40, 0.08), + 0px 4px 6px -2px rgba(16, 24, 40, 0.03); + --shadow-theme-sm: 0px 1px 3px 0px rgba(16, 24, 40, 0.1), 0px 1px 2px 0px rgba(16, 24, 40, 0.06); + --shadow-theme-xs: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + --shadow-theme-xl: 0px 20px 24px -4px rgba(16, 24, 40, 0.08), + 0px 8px 8px -4px rgba(16, 24, 40, 0.03); + --shadow-datepicker: -5px 0 0 #262d3c, 5px 0 0 #262d3c; + --shadow-focus-ring: 0px 0px 0px 4px rgba(70, 95, 255, 0.12); + --shadow-slider-navigation: 0px 1px 2px 0px rgba(16, 24, 40, 0.1), + 0px 1px 3px 0px rgba(16, 24, 40, 0.1); + --shadow-tooltip: 0px 4px 6px -2px rgba(16, 24, 40, 0.05), + -8px 0px 20px 8px rgba(16, 24, 40, 0.05); + + --drop-shadow-4xl: 0 35px 35px rgba(0, 0, 0, 0.25), 0 45px 65px rgba(0, 0, 0, 0.15); + + --z-index-1: 1; + --z-index-9: 9; + --z-index-99: 99; + --z-index-999: 999; + --z-index-9999: 9999; + --z-index-99999: 99999; + --z-index-999999: 999999; } + +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentColor); + } + button:not(:disabled), + [role='button']:not(:disabled) { + cursor: pointer; + } + body { + @apply relative font-normal font-outfit z-1 bg-gray-50; + } +} + +@utility menu-item { + @apply relative flex items-center w-full gap-3 px-3 py-2 font-medium rounded-lg text-theme-sm; +} + +@utility menu-item-active { + @apply bg-brand-50 text-brand-500 dark:bg-brand-500/[0.12] dark:text-brand-400; +} + +@utility menu-item-inactive { + @apply text-gray-700 hover:bg-gray-100 group-hover:text-gray-700 dark:text-gray-300 dark:hover:bg-white/5 dark:hover:text-gray-300; +} + +@utility menu-item-icon { + @apply text-gray-500 group-hover:text-gray-700 dark:text-gray-400; +} + +@utility menu-item-icon-active { + @apply text-brand-500 dark:text-brand-400; +} + +@utility menu-item-icon-inactive { + @apply text-gray-500 group-hover:text-gray-700 dark:text-gray-400 dark:group-hover:text-gray-300; +} + +@utility menu-item-arrow { + @apply relative; +} + +@utility menu-item-arrow-active { + @apply rotate-180 text-brand-500 dark:text-brand-400; +} + +@utility menu-item-arrow-inactive { + @apply text-gray-500 group-hover:text-gray-700 dark:text-gray-400 dark:group-hover:text-gray-300; +} + +@utility menu-dropdown-item { + @apply relative flex items-center gap-3 rounded-lg px-3 py-2.5 text-theme-sm font-medium; +} + +@utility menu-dropdown-item-active { + @apply bg-brand-50 text-brand-500 dark:bg-brand-500/[0.12] dark:text-brand-400; +} + +@utility menu-dropdown-item-inactive { + @apply text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-white/5; +} + +@utility menu-dropdown-item { + @apply text-theme-sm relative flex items-center gap-3 rounded-lg px-3 py-2.5 font-medium; +} + +@utility menu-dropdown-item-active { + @apply bg-brand-50 text-brand-500 dark:bg-brand-500/[0.12] dark:text-brand-400; +} + +@utility menu-dropdown-item-inactive { + @apply text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-white/5; +} + +@utility menu-dropdown-badge { + @apply text-success-600 dark:text-success-500 block rounded-full px-2.5 py-0.5 text-xs font-medium uppercase; +} + +@utility menu-dropdown-badge-active { + @apply bg-success-100 dark:bg-success-500/20; +} + +@utility menu-dropdown-badge-inactive { + @apply bg-success-50 group-hover:bg-success-100 dark:bg-success-500/15 dark:group-hover:bg-success-500/20; +} + +@utility menu-dropdown-badge-pro { + @apply text-brand-600 dark:text-brand-500 block rounded-full px-2.5 py-0.5 text-xs font-medium uppercase; +} + +@utility menu-dropdown-badge-pro-active { + @apply bg-brand-100 dark:bg-brand-500/20; +} + +@utility menu-dropdown-badge-pro-inactive { + @apply bg-brand-50 group-hover:bg-brand-100 dark:bg-brand-500/15 dark:group-hover:bg-brand-500/20; +} + +@utility no-scrollbar { + /* Chrome, Safari and Opera */ + &::-webkit-scrollbar { + display: none; + } + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +@utility custom-scrollbar { + &::-webkit-scrollbar { + @apply size-1.5; + } + + &::-webkit-scrollbar-track { + @apply rounded-full; + } + + &::-webkit-scrollbar-thumb { + @apply bg-gray-200 rounded-full dark:bg-gray-700; + } +} \ No newline at end of file diff --git a/src/resources/img/avatar.png b/src/resources/img/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..a71d2a3a2eb44e9ad921bb859674fdefeea57ed2 GIT binary patch literal 8118 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 QI{*Lx07*qoM6N<$f{pkEn*aa+ literal 0 HcmV?d00001 diff --git a/src/resources/img/avatar2.png b/src/resources/img/avatar2.png new file mode 100644 index 0000000000000000000000000000000000000000..26ce4ae6cc76675c0d44bd7dac6d6b4980327652 GIT binary patch literal 9246 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 A#{d8T literal 0 HcmV?d00001 diff --git a/src/resources/img/logo.png b/src/resources/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b4231467b26509f1e84e06ab3eefe9003a338533 GIT binary patch literal 16253 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 literal 0 HcmV?d00001 diff --git a/src/resources/js/app.js b/src/resources/js/app.js index e59d6a0..f290186 100644 --- a/src/resources/js/app.js +++ b/src/resources/js/app.js @@ -1 +1,11 @@ import './bootstrap'; +import Alpine from 'alpinejs'; + +window.Alpine = Alpine; + +Alpine.start(); + +document.addEventListener('DOMContentLoaded', () => { + // console.log($store.isExpande) +}); + diff --git a/src/resources/views/components/common/page-breadcrumb.blade.php b/src/resources/views/components/common/page-breadcrumb.blade.php new file mode 100644 index 0000000..60aaa6d --- /dev/null +++ b/src/resources/views/components/common/page-breadcrumb.blade.php @@ -0,0 +1 @@ +@props(['pageTitle' => 'Page']) \ No newline at end of file diff --git a/src/resources/views/components/profile/address-card.blade.php b/src/resources/views/components/profile/address-card.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/src/resources/views/components/profile/personal-info-card.blade.php b/src/resources/views/components/profile/personal-info-card.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/src/resources/views/components/profile/profile-card.blade.php b/src/resources/views/components/profile/profile-card.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/src/resources/views/layouts/app.blade.php b/src/resources/views/layouts/app.blade.php index 954e491..54cc6af 100644 --- a/src/resources/views/layouts/app.blade.php +++ b/src/resources/views/layouts/app.blade.php @@ -3,8 +3,21 @@ @include('layouts.partials.head') - +
+ @include('layouts.partials.sidebar')
@include('layouts.partials.app-header')
diff --git a/src/resources/views/layouts/partials/app-header.blade.php b/src/resources/views/layouts/partials/app-header.blade.php index 7f27a61..78ab645 100644 --- a/src/resources/views/layouts/partials/app-header.blade.php +++ b/src/resources/views/layouts/partials/app-header.blade.php @@ -1,11 +1,108 @@ -
- -
- @csrf - -
+
+
+
+ + + + + + + + + + Logo + + + + + + + + +
+ +
+ + + +
+ @csrf + +
+
+
diff --git a/src/resources/views/layouts/partials/head.blade.php b/src/resources/views/layouts/partials/head.blade.php index 589a81b..a87ac91 100644 --- a/src/resources/views/layouts/partials/head.blade.php +++ b/src/resources/views/layouts/partials/head.blade.php @@ -3,4 +3,36 @@ @vite(['resources/css/app.css', 'resources/js/app.js']) -{{ config('app.name', 'Laravel') }} | @yield('title') \ No newline at end of file +{{ config('app.name', 'Laravel') }} | @yield('title') + \ No newline at end of file diff --git a/src/resources/views/layouts/partials/sidebar.blade.php b/src/resources/views/layouts/partials/sidebar.blade.php new file mode 100644 index 0000000..60e064d --- /dev/null +++ b/src/resources/views/layouts/partials/sidebar.blade.php @@ -0,0 +1,229 @@ + +@php + use App\Helpers\MenuHelper; + $menuGroups = MenuHelper::getMenuGroups(); + + // Get current path + $currentPath = request()->path(); +@endphp + + + + +
diff --git a/src/resources/views/auth/login.blade.php b/src/resources/views/pages/auth/login.blade.php similarity index 100% rename from src/resources/views/auth/login.blade.php rename to src/resources/views/pages/auth/login.blade.php diff --git a/src/resources/views/user/index.blade.php b/src/resources/views/pages/user/index.blade.php similarity index 100% rename from src/resources/views/user/index.blade.php rename to src/resources/views/pages/user/index.blade.php diff --git a/src/resources/views/pages/user/show.blade.php b/src/resources/views/pages/user/show.blade.php new file mode 100644 index 0000000..e5a29c5 --- /dev/null +++ b/src/resources/views/pages/user/show.blade.php @@ -0,0 +1,13 @@ +@extends ('layouts.app') + +@section ('content') +

{{ $data }}

+ + +
+

Profile

+ + + +
+@endsection diff --git a/src/routes/web.php b/src/routes/web.php index c239adf..b04283c 100644 --- a/src/routes/web.php +++ b/src/routes/web.php @@ -13,7 +13,16 @@ Route::get('/', function () { Route::middleware(['auth', 'verified'])->group(function () { Route::get('/dashboard', [DashboardController::class, 'index']) ->name('dashboard'); - Route::get('/users', [UserController::class, 'index']) - ->name('user.index') - ->middleware('role:admin'); + Route::controller(UserController::class) + ->prefix('/users') + ->as('users.') + ->group(static function (): void { + Route::get('/', 'index') + ->name('index') + ->middleware('role:admin'); + Route::get('/{user_uuid}', 'show') + ->name('show') + ->whereUuid('user_uuid'); + }); + }); diff --git a/src/tests/Feature/UserControllerTest.php b/src/tests/Feature/UserControllerTest.php new file mode 100644 index 0000000..3572a4b --- /dev/null +++ b/src/tests/Feature/UserControllerTest.php @@ -0,0 +1,23 @@ +create(); + + $response = actingAs($user) + ->get(route('users.show', ['user_uuid' => $user->uuid])); + + $response->assertOk(); + $response->assertViewIs('pages.user.show'); + $response->assertViewHas('data', $user); +});