' . $text . '';
+ } elseif ($markType === 'link') {
+ $href = (string) (($mark['attrs']['href'] ?? '') ?: '');
+ if ($this->isSafeUrl($href)) {
+ $text = '' . $text . '';
+ }
+ }
+ }
+
+ return $text;
+ }
+
+ $inner = '';
+ foreach ($content as $child) {
+ if (is_array($child)) {
+ $inner .= $this->renderTipTapNode($child);
+ }
+ }
+
+ return match ($type) {
+ 'paragraph' => '' . $inner . '
', + 'heading' => '' . $inner . '', + 'bulletList' => '
' . e($this->extractTipTapText($node)) . '',
+ 'image' => $this->renderImageNode($attrs),
+ 'artworkEmbed' => $this->renderArtworkEmbedNode($attrs),
+ 'galleryBlock' => $this->renderGalleryBlockNode($attrs),
+ 'videoEmbed' => $this->renderVideoEmbedNode($attrs),
+ 'downloadAsset' => $this->renderDownloadAssetNode($attrs),
+ default => $inner,
+ };
+ }
+
+ private function renderImageNode(array $attrs): string
+ {
+ $src = (string) ($attrs['src'] ?? '');
+ if (! $this->isSafeUrl($src)) {
+ return '';
+ }
+
+ return '
';
- $sanitized = strip_tags($content, $allowedTags);
-
- $sanitized = preg_replace('/\son\w+\s*=\s*"[^"]*"/i', '', $sanitized) ?? $sanitized;
- $sanitized = preg_replace('/\son\w+\s*=\s*\'[^\']*\'/i', '', $sanitized) ?? $sanitized;
- $sanitized = preg_replace('/\s(href|src)\s*=\s*"\s*javascript:[^"]*"/i', ' $1="#"', $sanitized) ?? $sanitized;
- $sanitized = preg_replace('/\s(href|src)\s*=\s*\'\s*javascript:[^\']*\'/i', ' $1="#"', $sanitized) ?? $sanitized;
-
- $linked = preg_replace_callback(
- '/(?])(https?:\/\/[^\s<]+)/i',
- static function (array $matches): string {
- $url = $matches[1] ?? '';
- $escapedUrl = e($url);
-
- return '' . $escapedUrl . '';
- },
- $sanitized,
- );
-
- return (string) ($linked ?? $sanitized);
+ return app(ForumContentRenderer::class)->render($raw);
}
}
diff --git a/app/Support/UsernamePolicy.php b/app/Support/UsernamePolicy.php
index 45266879..3b841ce6 100644
--- a/app/Support/UsernamePolicy.php
+++ b/app/Support/UsernamePolicy.php
@@ -23,7 +23,7 @@ final class UsernamePolicy
public static function regex(): string
{
- return (string) config('usernames.regex', '/^[a-zA-Z0-9_-]+$/');
+ return (string) config('usernames.regex', '/^[a-zA-Z0-9_]{3,20}$/');
}
/**
@@ -31,7 +31,12 @@ final class UsernamePolicy
*/
public static function reserved(): array
{
- return array_values(array_unique(array_map(static fn (string $v): string => strtolower(trim($v)), (array) config('usernames.reserved', []))));
+ $pool = [
+ ...(array) config('usernames.reserved', []),
+ ...(array) config('skinbase.reserved_usernames', []),
+ ];
+
+ return array_values(array_unique(array_map(static fn (string $v): string => strtolower(trim($v)), $pool)));
}
public static function normalize(string $value): string
diff --git a/bootstrap/app.php b/bootstrap/app.php
index a1d2eaea..81db6687 100644
--- a/bootstrap/app.php
+++ b/bootstrap/app.php
@@ -21,6 +21,7 @@ return Application::configure(basePath: dirname(__DIR__))
$middleware->alias([
'admin.moderation' => \App\Http\Middleware\EnsureAdminOrModerator::class,
+ 'creator.access' => \App\Http\Middleware\EnsureCreatorAccess::class,
'ensure.onboarding.complete'=> \App\Http\Middleware\EnsureOnboardingComplete::class,
'onboarding' => \App\Http\Middleware\EnsureOnboardingComplete::class,
'normalize.username' => \App\Http\Middleware\NormalizeUsername::class,
diff --git a/bootstrap/providers.php b/bootstrap/providers.php
index 8dc3a487..bdf4f005 100644
--- a/bootstrap/providers.php
+++ b/bootstrap/providers.php
@@ -3,4 +3,7 @@
return [
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
+ Klevze\ControlPanel\ServiceProvider::class,
+ cPad\Plugins\News\ServiceProvider::class,
+ cPad\Plugins\Forum\ServiceProvider::class,
];
diff --git a/composer.json b/composer.json
index ac35a644..35d66103 100644
--- a/composer.json
+++ b/composer.json
@@ -10,8 +10,12 @@
"license": "MIT",
"require": {
"php": "^8.2",
+ "alexusmai/laravel-file-manager": "*",
+ "composer/installers": "^2.3",
+ "gumlet/php-image-resize": "*",
"inertiajs/inertia-laravel": "^1.0",
"intervention/image": "^3.11",
+ "jenssegers/agent": "*",
"laravel/framework": "^12.0",
"laravel/scout": "^10.24",
"laravel/socialite": "^5.24",
@@ -19,7 +23,8 @@
"league/commonmark": "^2.8",
"meilisearch/meilisearch-php": "^1.16",
"predis/predis": "^3.4",
- "socialiteproviders/discord": "^4.2"
+ "socialiteproviders/discord": "^4.2",
+ "yajra/laravel-datatables-oracle": "*"
},
"require-dev": {
"fakerphp/faker": "^1.23",
@@ -38,12 +43,16 @@
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
- "Database\\Seeders\\": "database/seeders/"
+ "Database\\Seeders\\": "database/seeders/",
+ "Klevze\\ControlPanel\\": "packages/klevze/ControlPanel/",
+ "cPad\\Plugins\\": "packages/klevze/Plugins/"
}
},
"autoload-dev": {
"psr-4": {
- "Tests\\": "tests/"
+ "Tests\\": "tests/",
+ "Klevze\\ControlPanel\\": "packages/klevze/ControlPanel/",
+ "cPad\\Plugins\\": "packages/klevze/Plugins/"
}
},
"scripts": {
@@ -92,6 +101,7 @@
"preferred-install": "dist",
"sort-packages": true,
"allow-plugins": {
+ "composer/installers": true,
"pestphp/pest-plugin": true,
"php-http/discovery": true
}
diff --git a/composer.lock b/composer.lock
index 2771fc6e..8d569a7a 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,8 +4,67 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "f41a3c183d57f21c1da57768230a539d",
+ "content-hash": "55c6c34cf31c8b3b0426511b32c3ac6a",
"packages": [
+ {
+ "name": "alexusmai/laravel-file-manager",
+ "version": "3.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/alexusmai/laravel-file-manager.git",
+ "reference": "58ed1930c50c17ca01b24f82131378f0bd1d1a03"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/alexusmai/laravel-file-manager/zipball/58ed1930c50c17ca01b24f82131378f0bd1d1a03",
+ "reference": "58ed1930c50c17ca01b24f82131378f0bd1d1a03",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-zip": "*",
+ "intervention/image-laravel": "^1.2.0",
+ "laravel/framework": "^9.0|^10.0|^11.0|^12.0",
+ "league/flysystem": "^3.0",
+ "php": "^8.1"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Alexusmai\\LaravelFileManager\\FileManagerServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Alexusmai\\LaravelFileManager\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aleksandr Manekin",
+ "email": "alexusmai@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "File manager for Laravel",
+ "homepage": "https://github.com/alexusami/laravel-file-manager",
+ "keywords": [
+ "file",
+ "laravel",
+ "manager"
+ ],
+ "support": {
+ "issues": "https://github.com/alexusmai/laravel-file-manager/issues",
+ "source": "https://github.com/alexusmai/laravel-file-manager/tree/3.3.2"
+ },
+ "time": "2025-12-09T11:45:27+00:00"
+ },
{
"name": "brick/math",
"version": "0.14.8",
@@ -135,6 +194,152 @@
],
"time": "2024-02-09T16:56:22+00:00"
},
+ {
+ "name": "composer/installers",
+ "version": "v2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/installers.git",
+ "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/installers/zipball/12fb2dfe5e16183de69e784a7b84046c43d97e8e",
+ "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0 || ^2.0",
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "composer/composer": "^1.10.27 || ^2.7",
+ "composer/semver": "^1.7.2 || ^3.4.0",
+ "phpstan/phpstan": "^1.11",
+ "phpstan/phpstan-phpunit": "^1",
+ "symfony/phpunit-bridge": "^7.1.1",
+ "symfony/process": "^5 || ^6 || ^7"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Composer\\Installers\\Plugin",
+ "branch-alias": {
+ "dev-main": "2.x-dev"
+ },
+ "plugin-modifies-install-path": true
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Installers\\": "src/Composer/Installers"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kyle Robinson Young",
+ "email": "kyle@dontkry.com",
+ "homepage": "https://github.com/shama"
+ }
+ ],
+ "description": "A multi-framework Composer library installer",
+ "homepage": "https://composer.github.io/installers/",
+ "keywords": [
+ "Dolibarr",
+ "Eliasis",
+ "Hurad",
+ "ImageCMS",
+ "Kanboard",
+ "Lan Management System",
+ "MODX Evo",
+ "MantisBT",
+ "Mautic",
+ "Maya",
+ "OXID",
+ "Plentymarkets",
+ "Porto",
+ "RadPHP",
+ "SMF",
+ "Starbug",
+ "Thelia",
+ "Whmcs",
+ "WolfCMS",
+ "agl",
+ "annotatecms",
+ "attogram",
+ "bitrix",
+ "cakephp",
+ "chef",
+ "cockpit",
+ "codeigniter",
+ "concrete5",
+ "concreteCMS",
+ "croogo",
+ "dokuwiki",
+ "drupal",
+ "eZ Platform",
+ "elgg",
+ "expressionengine",
+ "fuelphp",
+ "grav",
+ "installer",
+ "itop",
+ "known",
+ "kohana",
+ "laravel",
+ "lavalite",
+ "lithium",
+ "magento",
+ "majima",
+ "mako",
+ "matomo",
+ "mediawiki",
+ "miaoxing",
+ "modulework",
+ "modx",
+ "moodle",
+ "osclass",
+ "pantheon",
+ "phpbb",
+ "piwik",
+ "ppi",
+ "processwire",
+ "puppet",
+ "pxcms",
+ "reindex",
+ "roundcube",
+ "shopware",
+ "silverstripe",
+ "sydes",
+ "sylius",
+ "tastyigniter",
+ "wordpress",
+ "yawik",
+ "zend",
+ "zikula"
+ ],
+ "support": {
+ "issues": "https://github.com/composer/installers/issues",
+ "source": "https://github.com/composer/installers/tree/v2.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-06-24T20:46:46+00:00"
+ },
{
"name": "dflydev/dot-access-data",
"version": "v3.0.3",
@@ -704,6 +909,64 @@
],
"time": "2025-12-27T19:43:20+00:00"
},
+ {
+ "name": "gumlet/php-image-resize",
+ "version": "2.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/gumlet/php-image-resize.git",
+ "reference": "0cf9469c98f4a90ecad780c9ca7339c37f235e0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/gumlet/php-image-resize/zipball/0cf9469c98f4a90ecad780c9ca7339c37f235e0c",
+ "reference": "0cf9469c98f4a90ecad780c9ca7339c37f235e0c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "ext-gd": "*",
+ "php": ">=8.1.0"
+ },
+ "require-dev": {
+ "ext-exif": "*",
+ "ext-gd": "*",
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^10.0"
+ },
+ "suggest": {
+ "ext-exif": "Auto-rotate jpeg files"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Gumlet\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aditya Patadia",
+ "homepage": "http://aditya.patadia.org/"
+ }
+ ],
+ "description": "PHP class to re-size and scale images",
+ "homepage": "https://github.com/gumlet/php-image-resize",
+ "keywords": [
+ "image",
+ "php",
+ "resize",
+ "scale"
+ ],
+ "support": {
+ "issues": "https://github.com/gumlet/php-image-resize/issues",
+ "source": "https://github.com/gumlet/php-image-resize/tree/2.1.3"
+ },
+ "time": "2026-01-09T04:01:14+00:00"
+ },
{
"name": "guzzlehttp/guzzle",
"version": "7.10.0",
@@ -1254,16 +1517,16 @@
},
{
"name": "intervention/image",
- "version": "3.11.6",
+ "version": "3.11.7",
"source": {
"type": "git",
"url": "https://github.com/Intervention/image.git",
- "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1"
+ "reference": "2159bcccff18f09d2a392679b81a82c5a003f9bb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Intervention/image/zipball/5f6d27d9fd56312c47f347929e7ac15345c605a1",
- "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1",
+ "url": "https://api.github.com/repos/Intervention/image/zipball/2159bcccff18f09d2a392679b81a82c5a003f9bb",
+ "reference": "2159bcccff18f09d2a392679b81a82c5a003f9bb",
"shasum": ""
},
"require": {
@@ -1310,7 +1573,7 @@
],
"support": {
"issues": "https://github.com/Intervention/image/issues",
- "source": "https://github.com/Intervention/image/tree/3.11.6"
+ "source": "https://github.com/Intervention/image/tree/3.11.7"
},
"funding": [
{
@@ -1326,20 +1589,239 @@
"type": "ko_fi"
}
],
- "time": "2025-12-17T13:38:29+00:00"
+ "time": "2026-02-19T13:11:17+00:00"
},
{
- "name": "laravel/framework",
- "version": "v12.51.0",
+ "name": "intervention/image-laravel",
+ "version": "1.5.7",
"source": {
"type": "git",
- "url": "https://github.com/laravel/framework.git",
- "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16"
+ "url": "https://github.com/Intervention/image-laravel.git",
+ "reference": "86a53a154024e8b2f52cbdeac13f6bdb1aaedfaa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/ce4de3feb211e47c4f959d309ccf8a2733b1bc16",
- "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16",
+ "url": "https://api.github.com/repos/Intervention/image-laravel/zipball/86a53a154024e8b2f52cbdeac13f6bdb1aaedfaa",
+ "reference": "86a53a154024e8b2f52cbdeac13f6bdb1aaedfaa",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/http": "^8|^9|^10|^11|^12|^13",
+ "illuminate/routing": "^8|^9|^10|^11|^12|^13",
+ "illuminate/support": "^8|^9|^10|^11|^12|^13",
+ "intervention/image": "^3.11",
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "ext-fileinfo": "*",
+ "orchestra/testbench": "^8.18 || ^9.9 || ^10.6",
+ "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "Image": "Intervention\\Image\\Laravel\\Facades\\Image"
+ },
+ "providers": [
+ "Intervention\\Image\\Laravel\\ServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Intervention\\Image\\Laravel\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oliver Vogel",
+ "email": "oliver@intervention.io",
+ "homepage": "https://intervention.io/"
+ }
+ ],
+ "description": "Laravel Integration of Intervention Image",
+ "homepage": "https://image.intervention.io/",
+ "keywords": [
+ "gd",
+ "image",
+ "imagick",
+ "laravel",
+ "resize",
+ "thumbnail",
+ "watermark"
+ ],
+ "support": {
+ "issues": "https://github.com/Intervention/image-laravel/issues",
+ "source": "https://github.com/Intervention/image-laravel/tree/1.5.7"
+ },
+ "funding": [
+ {
+ "url": "https://paypal.me/interventionio",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/Intervention",
+ "type": "github"
+ },
+ {
+ "url": "https://ko-fi.com/interventionphp",
+ "type": "ko_fi"
+ }
+ ],
+ "time": "2026-02-28T06:49:50+00:00"
+ },
+ {
+ "name": "jaybizzle/crawler-detect",
+ "version": "v1.3.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JayBizzle/Crawler-Detect.git",
+ "reference": "7f7a45b5d5df9c95ba6b2008544e6cf8e66de6f5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/7f7a45b5d5df9c95ba6b2008544e6cf8e66de6f5",
+ "reference": "7f7a45b5d5df9c95ba6b2008544e6cf8e66de6f5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8|^5.5|^6.5|^7.5|^8.5|^9.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Jaybizzle\\CrawlerDetect\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mark Beech",
+ "email": "m@rkbee.ch",
+ "role": "Developer"
+ }
+ ],
+ "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent",
+ "homepage": "https://github.com/JayBizzle/Crawler-Detect/",
+ "keywords": [
+ "crawler",
+ "crawler detect",
+ "crawler detector",
+ "crawlerdetect",
+ "php crawler detect"
+ ],
+ "support": {
+ "issues": "https://github.com/JayBizzle/Crawler-Detect/issues",
+ "source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.3.7"
+ },
+ "time": "2026-02-02T19:15:54+00:00"
+ },
+ {
+ "name": "jenssegers/agent",
+ "version": "v2.6.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jenssegers/agent.git",
+ "reference": "daa11c43729510b3700bc34d414664966b03bffe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jenssegers/agent/zipball/daa11c43729510b3700bc34d414664966b03bffe",
+ "reference": "daa11c43729510b3700bc34d414664966b03bffe",
+ "shasum": ""
+ },
+ "require": {
+ "jaybizzle/crawler-detect": "^1.2",
+ "mobiledetect/mobiledetectlib": "^2.7.6",
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5.0|^6.0|^7.0"
+ },
+ "suggest": {
+ "illuminate/support": "Required for laravel service providers"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "Agent": "Jenssegers\\Agent\\Facades\\Agent"
+ },
+ "providers": [
+ "Jenssegers\\Agent\\AgentServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Jenssegers\\Agent\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jens Segers",
+ "homepage": "https://jenssegers.com"
+ }
+ ],
+ "description": "Desktop/mobile user agent parser with support for Laravel, based on Mobiledetect",
+ "homepage": "https://github.com/jenssegers/agent",
+ "keywords": [
+ "Agent",
+ "browser",
+ "desktop",
+ "laravel",
+ "mobile",
+ "platform",
+ "user agent",
+ "useragent"
+ ],
+ "support": {
+ "issues": "https://github.com/jenssegers/agent/issues",
+ "source": "https://github.com/jenssegers/agent/tree/v2.6.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/jenssegers",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/jenssegers/agent",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-06-13T08:05:20+00:00"
+ },
+ {
+ "name": "laravel/framework",
+ "version": "v12.53.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/framework.git",
+ "reference": "f57f035c0d34503d9ff30be76159bb35a003cd1f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/f57f035c0d34503d9ff30be76159bb35a003cd1f",
+ "reference": "f57f035c0d34503d9ff30be76159bb35a003cd1f",
"shasum": ""
},
"require": {
@@ -1548,7 +2030,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2026-02-10T18:20:19+00:00"
+ "time": "2026-02-24T14:35:15+00:00"
},
{
"name": "laravel/prompts",
@@ -1691,16 +2173,16 @@
},
{
"name": "laravel/serializable-closure",
- "version": "v2.0.9",
+ "version": "v2.0.10",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
- "reference": "8f631589ab07b7b52fead814965f5a800459cb3e"
+ "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/8f631589ab07b7b52fead814965f5a800459cb3e",
- "reference": "8f631589ab07b7b52fead814965f5a800459cb3e",
+ "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/870fc81d2f879903dfc5b60bf8a0f94a1609e669",
+ "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669",
"shasum": ""
},
"require": {
@@ -1748,7 +2230,7 @@
"issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure"
},
- "time": "2026-02-03T06:55:34+00:00"
+ "time": "2026-02-20T19:59:49+00:00"
},
{
"name": "laravel/socialite",
@@ -1890,16 +2372,16 @@
},
{
"name": "league/commonmark",
- "version": "2.8.0",
+ "version": "2.8.1",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/commonmark.git",
- "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb"
+ "reference": "84b1ca48347efdbe775426f108622a42735a6579"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4efa10c1e56488e658d10adf7b7b7dcd19940bfb",
- "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/84b1ca48347efdbe775426f108622a42735a6579",
+ "reference": "84b1ca48347efdbe775426f108622a42735a6579",
"shasum": ""
},
"require": {
@@ -1924,9 +2406,9 @@
"phpstan/phpstan": "^1.8.2",
"phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
"scrutinizer/ocular": "^1.8.1",
- "symfony/finder": "^5.3 | ^6.0 | ^7.0",
- "symfony/process": "^5.4 | ^6.0 | ^7.0",
- "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0",
+ "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0",
+ "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0",
+ "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0",
"unleashedtech/php-coding-standard": "^3.1.1",
"vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0"
},
@@ -1993,7 +2475,7 @@
"type": "tidelift"
}
],
- "time": "2025-11-26T21:48:24+00:00"
+ "time": "2026-03-05T21:37:03+00:00"
},
{
"name": "league/config",
@@ -2079,16 +2561,16 @@
},
{
"name": "league/flysystem",
- "version": "3.31.0",
+ "version": "3.32.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
- "reference": "1717e0b3642b0df65ecb0cc89cdd99fa840672ff"
+ "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1717e0b3642b0df65ecb0cc89cdd99fa840672ff",
- "reference": "1717e0b3642b0df65ecb0cc89cdd99fa840672ff",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/254b1595b16b22dbddaaef9ed6ca9fdac4956725",
+ "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725",
"shasum": ""
},
"require": {
@@ -2156,9 +2638,9 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
- "source": "https://github.com/thephpleague/flysystem/tree/3.31.0"
+ "source": "https://github.com/thephpleague/flysystem/tree/3.32.0"
},
- "time": "2026-01-23T15:38:47+00:00"
+ "time": "2026-02-25T17:01:41+00:00"
},
{
"name": "league/flysystem-local",
@@ -2603,6 +3085,68 @@
},
"time": "2025-09-18T10:15:45+00:00"
},
+ {
+ "name": "mobiledetect/mobiledetectlib",
+ "version": "2.8.45",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/serbanghita/Mobile-Detect.git",
+ "reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/96aaebcf4f50d3d2692ab81d2c5132e425bca266",
+ "reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8.36"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Detection": "namespaced/"
+ },
+ "classmap": [
+ "Mobile_Detect.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Serban Ghita",
+ "email": "serbanghita@gmail.com",
+ "homepage": "http://mobiledetect.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.",
+ "homepage": "https://github.com/serbanghita/Mobile-Detect",
+ "keywords": [
+ "detect mobile devices",
+ "mobile",
+ "mobile detect",
+ "mobile detector",
+ "php mobile detect"
+ ],
+ "support": {
+ "issues": "https://github.com/serbanghita/Mobile-Detect/issues",
+ "source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.45"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/serbanghita",
+ "type": "github"
+ }
+ ],
+ "time": "2023-11-07T21:57:25+00:00"
+ },
{
"name": "monolog/monolog",
"version": "3.10.0",
@@ -2813,16 +3357,16 @@
},
{
"name": "nette/schema",
- "version": "v1.3.4",
+ "version": "v1.3.5",
"source": {
"type": "git",
"url": "https://github.com/nette/schema.git",
- "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7"
+ "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/schema/zipball/086497a2f34b82fede9b5a41cc8e131d087cd8f7",
- "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7",
+ "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002",
+ "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002",
"shasum": ""
},
"require": {
@@ -2830,8 +3374,10 @@
"php": "8.1 - 8.5"
},
"require-dev": {
+ "nette/phpstan-rules": "^1.0",
"nette/tester": "^2.6",
- "phpstan/phpstan": "^2.0@stable",
+ "phpstan/extension-installer": "^1.4@stable",
+ "phpstan/phpstan": "^2.1.39@stable",
"tracy/tracy": "^2.8"
},
"type": "library",
@@ -2872,22 +3418,22 @@
],
"support": {
"issues": "https://github.com/nette/schema/issues",
- "source": "https://github.com/nette/schema/tree/v1.3.4"
+ "source": "https://github.com/nette/schema/tree/v1.3.5"
},
- "time": "2026-02-08T02:54:00+00:00"
+ "time": "2026-02-23T03:47:12+00:00"
},
{
"name": "nette/utils",
- "version": "v4.1.2",
+ "version": "v4.1.3",
"source": {
"type": "git",
"url": "https://github.com/nette/utils.git",
- "reference": "f76b5dc3d6c6d3043c8d937df2698515b99cbaf5"
+ "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/utils/zipball/f76b5dc3d6c6d3043c8d937df2698515b99cbaf5",
- "reference": "f76b5dc3d6c6d3043c8d937df2698515b99cbaf5",
+ "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe",
+ "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe",
"shasum": ""
},
"require": {
@@ -2899,8 +3445,10 @@
},
"require-dev": {
"jetbrains/phpstorm-attributes": "^1.2",
+ "nette/phpstan-rules": "^1.0",
"nette/tester": "^2.5",
- "phpstan/phpstan": "^2.0@stable",
+ "phpstan/extension-installer": "^1.4@stable",
+ "phpstan/phpstan": "^2.1@stable",
"tracy/tracy": "^2.9"
},
"suggest": {
@@ -2961,9 +3509,9 @@
],
"support": {
"issues": "https://github.com/nette/utils/issues",
- "source": "https://github.com/nette/utils/tree/v4.1.2"
+ "source": "https://github.com/nette/utils/tree/v4.1.3"
},
- "time": "2026-02-03T17:21:09+00:00"
+ "time": "2026-02-13T03:05:33+00:00"
},
{
"name": "nikic/php-parser",
@@ -3025,31 +3573,31 @@
},
{
"name": "nunomaduro/termwind",
- "version": "v2.3.3",
+ "version": "v2.4.0",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/termwind.git",
- "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017"
+ "reference": "712a31b768f5daea284c2169a7d227031001b9a8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/6fb2a640ff502caace8e05fd7be3b503a7e1c017",
- "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017",
+ "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8",
+ "reference": "712a31b768f5daea284c2169a7d227031001b9a8",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": "^8.2",
- "symfony/console": "^7.3.6"
+ "symfony/console": "^7.4.4 || ^8.0.4"
},
"require-dev": {
- "illuminate/console": "^11.46.1",
- "laravel/pint": "^1.25.1",
+ "illuminate/console": "^11.47.0",
+ "laravel/pint": "^1.27.1",
"mockery/mockery": "^1.6.12",
- "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.1.3",
+ "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.3.2",
"phpstan/phpstan": "^1.12.32",
"phpstan/phpstan-strict-rules": "^1.6.2",
- "symfony/var-dumper": "^7.3.5",
+ "symfony/var-dumper": "^7.3.5 || ^8.0.4",
"thecodingmachine/phpstan-strict-rules": "^1.0.0"
},
"type": "library",
@@ -3081,7 +3629,7 @@
"email": "enunomaduro@gmail.com"
}
],
- "description": "Its like Tailwind CSS, but for the console.",
+ "description": "It's like Tailwind CSS, but for the console.",
"keywords": [
"cli",
"console",
@@ -3092,7 +3640,7 @@
],
"support": {
"issues": "https://github.com/nunomaduro/termwind/issues",
- "source": "https://github.com/nunomaduro/termwind/tree/v2.3.3"
+ "source": "https://github.com/nunomaduro/termwind/tree/v2.4.0"
},
"funding": [
{
@@ -3108,7 +3656,7 @@
"type": "github"
}
],
- "time": "2025-11-20T02:34:59+00:00"
+ "time": "2026-02-16T23:10:27+00:00"
},
{
"name": "paragonie/constant_time_encoding",
@@ -3970,16 +4518,16 @@
},
{
"name": "psy/psysh",
- "version": "v0.12.20",
+ "version": "v0.12.21",
"source": {
"type": "git",
"url": "https://github.com/bobthecow/psysh.git",
- "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373"
+ "reference": "4821fab5b7cd8c49a673a9fd5754dc9162bb9e97"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bobthecow/psysh/zipball/19678eb6b952a03b8a1d96ecee9edba518bb0373",
- "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4821fab5b7cd8c49a673a9fd5754dc9162bb9e97",
+ "reference": "4821fab5b7cd8c49a673a9fd5754dc9162bb9e97",
"shasum": ""
},
"require": {
@@ -4043,9 +4591,9 @@
],
"support": {
"issues": "https://github.com/bobthecow/psysh/issues",
- "source": "https://github.com/bobthecow/psysh/tree/v0.12.20"
+ "source": "https://github.com/bobthecow/psysh/tree/v0.12.21"
},
- "time": "2026-02-11T15:05:28+00:00"
+ "time": "2026-03-06T21:21:28+00:00"
},
{
"name": "ralouphie/getallheaders",
@@ -4448,16 +4996,16 @@
},
{
"name": "symfony/console",
- "version": "v7.4.4",
+ "version": "v7.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894"
+ "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/41e38717ac1dd7a46b6bda7d6a82af2d98a78894",
- "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894",
+ "url": "https://api.github.com/repos/symfony/console/zipball/e1e6770440fb9c9b0cf725f81d1361ad1835329d",
+ "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d",
"shasum": ""
},
"require": {
@@ -4522,7 +5070,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.4.4"
+ "source": "https://github.com/symfony/console/tree/v7.4.7"
},
"funding": [
{
@@ -4542,20 +5090,20 @@
"type": "tidelift"
}
],
- "time": "2026-01-13T11:36:38+00:00"
+ "time": "2026-03-06T14:06:20+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v8.0.0",
+ "version": "v8.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "6225bd458c53ecdee056214cb4a2ffaf58bd592b"
+ "reference": "2a178bf80f05dbbe469a337730eba79d61315262"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/6225bd458c53ecdee056214cb4a2ffaf58bd592b",
- "reference": "6225bd458c53ecdee056214cb4a2ffaf58bd592b",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/2a178bf80f05dbbe469a337730eba79d61315262",
+ "reference": "2a178bf80f05dbbe469a337730eba79d61315262",
"shasum": ""
},
"require": {
@@ -4591,7 +5139,7 @@
"description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/css-selector/tree/v8.0.0"
+ "source": "https://github.com/symfony/css-selector/tree/v8.0.6"
},
"funding": [
{
@@ -4611,7 +5159,7 @@
"type": "tidelift"
}
],
- "time": "2025-10-30T14:17:19+00:00"
+ "time": "2026-02-17T13:07:04+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -4925,16 +5473,16 @@
},
{
"name": "symfony/finder",
- "version": "v7.4.5",
+ "version": "v7.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb"
+ "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/ad4daa7c38668dcb031e63bc99ea9bd42196a2cb",
- "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf",
+ "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf",
"shasum": ""
},
"require": {
@@ -4969,7 +5517,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v7.4.5"
+ "source": "https://github.com/symfony/finder/tree/v7.4.6"
},
"funding": [
{
@@ -4989,20 +5537,20 @@
"type": "tidelift"
}
],
- "time": "2026-01-26T15:07:59+00:00"
+ "time": "2026-01-29T09:40:50+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v7.4.5",
+ "version": "v7.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "446d0db2b1f21575f1284b74533e425096abdfb6"
+ "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/446d0db2b1f21575f1284b74533e425096abdfb6",
- "reference": "446d0db2b1f21575f1284b74533e425096abdfb6",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f94b3e7b7dafd40e666f0c9ff2084133bae41e81",
+ "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81",
"shasum": ""
},
"require": {
@@ -5051,7 +5599,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.4.5"
+ "source": "https://github.com/symfony/http-foundation/tree/v7.4.7"
},
"funding": [
{
@@ -5071,20 +5619,20 @@
"type": "tidelift"
}
],
- "time": "2026-01-27T16:16:02+00:00"
+ "time": "2026-03-06T13:15:18+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v7.4.5",
+ "version": "v7.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "229eda477017f92bd2ce7615d06222ec0c19e82a"
+ "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/229eda477017f92bd2ce7615d06222ec0c19e82a",
- "reference": "229eda477017f92bd2ce7615d06222ec0c19e82a",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3b3fcf386c809be990c922e10e4c620d6367cab1",
+ "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1",
"shasum": ""
},
"require": {
@@ -5126,7 +5674,7 @@
"symfony/config": "^6.4|^7.0|^8.0",
"symfony/console": "^6.4|^7.0|^8.0",
"symfony/css-selector": "^6.4|^7.0|^8.0",
- "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4.1|^7.0.1|^8.0",
"symfony/dom-crawler": "^6.4|^7.0|^8.0",
"symfony/expression-language": "^6.4|^7.0|^8.0",
"symfony/finder": "^6.4|^7.0|^8.0",
@@ -5170,7 +5718,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.4.5"
+ "source": "https://github.com/symfony/http-kernel/tree/v7.4.7"
},
"funding": [
{
@@ -5190,20 +5738,20 @@
"type": "tidelift"
}
],
- "time": "2026-01-28T10:33:42+00:00"
+ "time": "2026-03-06T16:33:18+00:00"
},
{
"name": "symfony/mailer",
- "version": "v7.4.4",
+ "version": "v7.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
- "reference": "7b750074c40c694ceb34cb926d6dffee231c5cd6"
+ "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mailer/zipball/7b750074c40c694ceb34cb926d6dffee231c5cd6",
- "reference": "7b750074c40c694ceb34cb926d6dffee231c5cd6",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/b02726f39a20bc65e30364f5c750c4ddbf1f58e9",
+ "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9",
"shasum": ""
},
"require": {
@@ -5254,7 +5802,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/mailer/tree/v7.4.4"
+ "source": "https://github.com/symfony/mailer/tree/v7.4.6"
},
"funding": [
{
@@ -5274,20 +5822,20 @@
"type": "tidelift"
}
],
- "time": "2026-01-08T08:25:11+00:00"
+ "time": "2026-02-25T16:50:00+00:00"
},
{
"name": "symfony/mime",
- "version": "v7.4.5",
+ "version": "v7.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
- "reference": "b18c7e6e9eee1e19958138df10412f3c4c316148"
+ "reference": "da5ab4fde3f6c88ab06e96185b9922f48b677cd1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/b18c7e6e9eee1e19958138df10412f3c4c316148",
- "reference": "b18c7e6e9eee1e19958138df10412f3c4c316148",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/da5ab4fde3f6c88ab06e96185b9922f48b677cd1",
+ "reference": "da5ab4fde3f6c88ab06e96185b9922f48b677cd1",
"shasum": ""
},
"require": {
@@ -5298,7 +5846,7 @@
},
"conflict": {
"egulias/email-validator": "~3.0.0",
- "phpdocumentor/reflection-docblock": "<5.2|>=6",
+ "phpdocumentor/reflection-docblock": "<5.2|>=7",
"phpdocumentor/type-resolver": "<1.5.1",
"symfony/mailer": "<6.4",
"symfony/serializer": "<6.4.3|>7.0,<7.0.3"
@@ -5306,7 +5854,7 @@
"require-dev": {
"egulias/email-validator": "^2.1.10|^3.1|^4",
"league/html-to-markdown": "^5.0",
- "phpdocumentor/reflection-docblock": "^5.2",
+ "phpdocumentor/reflection-docblock": "^5.2|^6.0",
"symfony/dependency-injection": "^6.4|^7.0|^8.0",
"symfony/process": "^6.4|^7.0|^8.0",
"symfony/property-access": "^6.4|^7.0|^8.0",
@@ -5343,7 +5891,7 @@
"mime-type"
],
"support": {
- "source": "https://github.com/symfony/mime/tree/v7.4.5"
+ "source": "https://github.com/symfony/mime/tree/v7.4.7"
},
"funding": [
{
@@ -5363,7 +5911,7 @@
"type": "tidelift"
}
],
- "time": "2026-01-27T08:59:58+00:00"
+ "time": "2026-03-05T15:24:09+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -6341,16 +6889,16 @@
},
{
"name": "symfony/routing",
- "version": "v7.4.4",
+ "version": "v7.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "0798827fe2c79caeed41d70b680c2c3507d10147"
+ "reference": "238d749c56b804b31a9bf3e26519d93b65a60938"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/0798827fe2c79caeed41d70b680c2c3507d10147",
- "reference": "0798827fe2c79caeed41d70b680c2c3507d10147",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/238d749c56b804b31a9bf3e26519d93b65a60938",
+ "reference": "238d749c56b804b31a9bf3e26519d93b65a60938",
"shasum": ""
},
"require": {
@@ -6402,7 +6950,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v7.4.4"
+ "source": "https://github.com/symfony/routing/tree/v7.4.6"
},
"funding": [
{
@@ -6422,7 +6970,7 @@
"type": "tidelift"
}
],
- "time": "2026-01-12T12:19:02+00:00"
+ "time": "2026-02-25T16:50:00+00:00"
},
{
"name": "symfony/service-contracts",
@@ -6513,16 +7061,16 @@
},
{
"name": "symfony/string",
- "version": "v8.0.4",
+ "version": "v8.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "758b372d6882506821ed666032e43020c4f57194"
+ "reference": "6c9e1108041b5dce21a9a4984b531c4923aa9ec4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/758b372d6882506821ed666032e43020c4f57194",
- "reference": "758b372d6882506821ed666032e43020c4f57194",
+ "url": "https://api.github.com/repos/symfony/string/zipball/6c9e1108041b5dce21a9a4984b531c4923aa9ec4",
+ "reference": "6c9e1108041b5dce21a9a4984b531c4923aa9ec4",
"shasum": ""
},
"require": {
@@ -6579,7 +7127,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v8.0.4"
+ "source": "https://github.com/symfony/string/tree/v8.0.6"
},
"funding": [
{
@@ -6599,20 +7147,20 @@
"type": "tidelift"
}
],
- "time": "2026-01-12T12:37:40+00:00"
+ "time": "2026-02-09T10:14:57+00:00"
},
{
"name": "symfony/translation",
- "version": "v8.0.4",
+ "version": "v8.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "db70c8ce7db74fd2da7b1d268db46b2a8ce32c10"
+ "reference": "13ff19bcf2bea492d3c2fbeaa194dd6f4599ce1b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/db70c8ce7db74fd2da7b1d268db46b2a8ce32c10",
- "reference": "db70c8ce7db74fd2da7b1d268db46b2a8ce32c10",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/13ff19bcf2bea492d3c2fbeaa194dd6f4599ce1b",
+ "reference": "13ff19bcf2bea492d3c2fbeaa194dd6f4599ce1b",
"shasum": ""
},
"require": {
@@ -6672,7 +7220,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/translation/tree/v8.0.4"
+ "source": "https://github.com/symfony/translation/tree/v8.0.6"
},
"funding": [
{
@@ -6692,7 +7240,7 @@
"type": "tidelift"
}
],
- "time": "2026-01-13T13:06:50+00:00"
+ "time": "2026-02-17T13:07:04+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -6856,16 +7404,16 @@
},
{
"name": "symfony/var-dumper",
- "version": "v7.4.4",
+ "version": "v7.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "0e4769b46a0c3c62390d124635ce59f66874b282"
+ "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0e4769b46a0c3c62390d124635ce59f66874b282",
- "reference": "0e4769b46a0c3c62390d124635ce59f66874b282",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/045321c440ac18347b136c63d2e9bf28a2dc0291",
+ "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291",
"shasum": ""
},
"require": {
@@ -6919,7 +7467,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v7.4.4"
+ "source": "https://github.com/symfony/var-dumper/tree/v7.4.6"
},
"funding": [
{
@@ -6939,7 +7487,7 @@
"type": "tidelift"
}
],
- "time": "2026-01-01T22:13:48+00:00"
+ "time": "2026-02-15T10:53:20+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@@ -7153,21 +7701,110 @@
}
],
"time": "2024-11-21T01:49:47+00:00"
+ },
+ {
+ "name": "yajra/laravel-datatables-oracle",
+ "version": "v12.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/yajra/laravel-datatables.git",
+ "reference": "1e4251feeb21f17a817ae06ed29ec91338641868"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/yajra/laravel-datatables/zipball/1e4251feeb21f17a817ae06ed29ec91338641868",
+ "reference": "1e4251feeb21f17a817ae06ed29ec91338641868",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/database": "^12",
+ "illuminate/filesystem": "^12",
+ "illuminate/http": "^12",
+ "illuminate/support": "^12",
+ "illuminate/view": "^12",
+ "php": "^8.2"
+ },
+ "require-dev": {
+ "algolia/algoliasearch-client-php": "^3.4.1",
+ "larastan/larastan": "^3.1.0",
+ "laravel/pint": "^1.14",
+ "laravel/scout": "^10.8.3",
+ "meilisearch/meilisearch-php": "^1.6.1",
+ "orchestra/testbench": "^10",
+ "rector/rector": "^2.0"
+ },
+ "suggest": {
+ "yajra/laravel-datatables-buttons": "Plugin for server-side exporting of dataTables.",
+ "yajra/laravel-datatables-editor": "Plugin to use DataTables Editor (requires a license).",
+ "yajra/laravel-datatables-export": "Plugin for server-side exporting using livewire and queue worker.",
+ "yajra/laravel-datatables-fractal": "Plugin for server-side response using Fractal.",
+ "yajra/laravel-datatables-html": "Plugin for server-side HTML builder of dataTables."
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "DataTables": "Yajra\\DataTables\\Facades\\DataTables"
+ },
+ "providers": [
+ "Yajra\\DataTables\\DataTablesServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helper.php"
+ ],
+ "psr-4": {
+ "Yajra\\DataTables\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Arjay Angeles",
+ "email": "aqangeles@gmail.com"
+ }
+ ],
+ "description": "jQuery DataTables API for Laravel",
+ "keywords": [
+ "datatables",
+ "jquery",
+ "laravel",
+ "yajra"
+ ],
+ "support": {
+ "issues": "https://github.com/yajra/laravel-datatables/issues",
+ "source": "https://github.com/yajra/laravel-datatables/tree/v12.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/yajra",
+ "type": "github"
+ }
+ ],
+ "time": "2026-02-20T15:00:37+00:00"
}
],
"packages-dev": [
{
"name": "brianium/paratest",
- "version": "v7.17.0",
+ "version": "v7.19.0",
"source": {
"type": "git",
"url": "https://github.com/paratestphp/paratest.git",
- "reference": "53cb90a6aa3ef3840458781600628ade058a18b9"
+ "reference": "7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paratestphp/paratest/zipball/53cb90a6aa3ef3840458781600628ade058a18b9",
- "reference": "53cb90a6aa3ef3840458781600628ade058a18b9",
+ "url": "https://api.github.com/repos/paratestphp/paratest/zipball/7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6",
+ "reference": "7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6",
"shasum": ""
},
"require": {
@@ -7178,13 +7815,13 @@
"fidry/cpu-core-counter": "^1.3.0",
"jean85/pretty-package-versions": "^2.1.1",
"php": "~8.3.0 || ~8.4.0 || ~8.5.0",
- "phpunit/php-code-coverage": "^12.5.2",
- "phpunit/php-file-iterator": "^6",
- "phpunit/php-timer": "^8",
- "phpunit/phpunit": "^12.5.8",
- "sebastian/environment": "^8.0.3",
- "symfony/console": "^7.3.4 || ^8.0.0",
- "symfony/process": "^7.3.4 || ^8.0.0"
+ "phpunit/php-code-coverage": "^12.5.3 || ^13.0.1",
+ "phpunit/php-file-iterator": "^6.0.1 || ^7",
+ "phpunit/php-timer": "^8 || ^9",
+ "phpunit/phpunit": "^12.5.9 || ^13",
+ "sebastian/environment": "^8.0.3 || ^9",
+ "symfony/console": "^7.4.4 || ^8.0.4",
+ "symfony/process": "^7.4.5 || ^8.0.5"
},
"require-dev": {
"doctrine/coding-standard": "^14.0.0",
@@ -7195,7 +7832,7 @@
"phpstan/phpstan-deprecation-rules": "^2.0.3",
"phpstan/phpstan-phpunit": "^2.0.12",
"phpstan/phpstan-strict-rules": "^2.0.8",
- "symfony/filesystem": "^7.3.2 || ^8.0.0"
+ "symfony/filesystem": "^7.4.0 || ^8.0.1"
},
"bin": [
"bin/paratest",
@@ -7235,7 +7872,7 @@
],
"support": {
"issues": "https://github.com/paratestphp/paratest/issues",
- "source": "https://github.com/paratestphp/paratest/tree/v7.17.0"
+ "source": "https://github.com/paratestphp/paratest/tree/v7.19.0"
},
"funding": [
{
@@ -7247,7 +7884,7 @@
"type": "paypal"
}
],
- "time": "2026-02-05T09:14:44+00:00"
+ "time": "2026-02-06T10:53:26+00:00"
},
{
"name": "doctrine/deprecations",
@@ -7494,24 +8131,24 @@
},
{
"name": "fruitcake/laravel-debugbar",
- "version": "v4.0.7",
+ "version": "v4.0.10",
"source": {
"type": "git",
"url": "https://github.com/fruitcake/laravel-debugbar.git",
- "reference": "a9cc62c81cd0bda4ca7410229487638d7df786be"
+ "reference": "96afd5efc93c2cb3140df356893381296259695b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruitcake/laravel-debugbar/zipball/a9cc62c81cd0bda4ca7410229487638d7df786be",
- "reference": "a9cc62c81cd0bda4ca7410229487638d7df786be",
+ "url": "https://api.github.com/repos/fruitcake/laravel-debugbar/zipball/96afd5efc93c2cb3140df356893381296259695b",
+ "reference": "96afd5efc93c2cb3140df356893381296259695b",
"shasum": ""
},
"require": {
- "illuminate/routing": "^11|^12",
- "illuminate/session": "^11|^12",
- "illuminate/support": "^11|^12",
+ "illuminate/routing": "^11|^12|^13.0",
+ "illuminate/session": "^11|^12|^13.0",
+ "illuminate/support": "^11|^12|^13.0",
"php": "^8.2",
- "php-debugbar/php-debugbar": "^3.1",
+ "php-debugbar/php-debugbar": "^3.3.1",
"php-debugbar/symfony-bridge": "^1.1"
},
"replace": {
@@ -7580,7 +8217,7 @@
],
"support": {
"issues": "https://github.com/fruitcake/laravel-debugbar/issues",
- "source": "https://github.com/fruitcake/laravel-debugbar/tree/v4.0.7"
+ "source": "https://github.com/fruitcake/laravel-debugbar/tree/v4.0.10"
},
"funding": [
{
@@ -7592,7 +8229,7 @@
"type": "github"
}
],
- "time": "2026-02-06T20:53:50+00:00"
+ "time": "2026-02-26T11:45:48+00:00"
},
{
"name": "hamcrest/hamcrest-php",
@@ -7707,33 +8344,33 @@
},
{
"name": "laravel/boost",
- "version": "v2.1.2",
+ "version": "v2.2.3",
"source": {
"type": "git",
"url": "https://github.com/laravel/boost.git",
- "reference": "81ecf79e82c979efd92afaeac012605cc7b2f31f"
+ "reference": "44ab65a5455c2d6fceb71d6145f8d5d89c02d889"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/boost/zipball/81ecf79e82c979efd92afaeac012605cc7b2f31f",
- "reference": "81ecf79e82c979efd92afaeac012605cc7b2f31f",
+ "url": "https://api.github.com/repos/laravel/boost/zipball/44ab65a5455c2d6fceb71d6145f8d5d89c02d889",
+ "reference": "44ab65a5455c2d6fceb71d6145f8d5d89c02d889",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "^7.9",
- "illuminate/console": "^11.45.3|^12.41.1",
- "illuminate/contracts": "^11.45.3|^12.41.1",
- "illuminate/routing": "^11.45.3|^12.41.1",
- "illuminate/support": "^11.45.3|^12.41.1",
- "laravel/mcp": "^0.5.1",
+ "illuminate/console": "^11.45.3|^12.41.1|^13.0",
+ "illuminate/contracts": "^11.45.3|^12.41.1|^13.0",
+ "illuminate/routing": "^11.45.3|^12.41.1|^13.0",
+ "illuminate/support": "^11.45.3|^12.41.1|^13.0",
+ "laravel/mcp": "^0.5.1|^0.6.0",
"laravel/prompts": "^0.3.10",
- "laravel/roster": "^0.2.9",
+ "laravel/roster": "^0.5.0",
"php": "^8.2"
},
"require-dev": {
"laravel/pint": "^1.27.0",
"mockery/mockery": "^1.6.12",
- "orchestra/testbench": "^9.15.0|^10.6",
+ "orchestra/testbench": "^9.15.0|^10.6|^11.0",
"pestphp/pest": "^2.36.0|^3.8.4|^4.1.5",
"phpstan/phpstan": "^2.1.27",
"rector/rector": "^2.1"
@@ -7769,7 +8406,7 @@
"issues": "https://github.com/laravel/boost/issues",
"source": "https://github.com/laravel/boost"
},
- "time": "2026-02-10T17:40:45+00:00"
+ "time": "2026-03-06T20:20:28+00:00"
},
{
"name": "laravel/breeze",
@@ -7834,16 +8471,16 @@
},
{
"name": "laravel/mcp",
- "version": "v0.5.6",
+ "version": "v0.6.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/mcp.git",
- "reference": "87905978bf2a230d6c01f8d03e172249e37917f7"
+ "reference": "28860a10ca0cc5433e25d897ba7af844e6c7b6a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/mcp/zipball/87905978bf2a230d6c01f8d03e172249e37917f7",
- "reference": "87905978bf2a230d6c01f8d03e172249e37917f7",
+ "url": "https://api.github.com/repos/laravel/mcp/zipball/28860a10ca0cc5433e25d897ba7af844e6c7b6a2",
+ "reference": "28860a10ca0cc5433e25d897ba7af844e6c7b6a2",
"shasum": ""
},
"require": {
@@ -7903,7 +8540,7 @@
"issues": "https://github.com/laravel/mcp/issues",
"source": "https://github.com/laravel/mcp"
},
- "time": "2026-02-09T22:08:43+00:00"
+ "time": "2026-02-24T08:43:06+00:00"
},
{
"name": "laravel/pail",
@@ -8054,31 +8691,31 @@
},
{
"name": "laravel/roster",
- "version": "v0.2.9",
+ "version": "v0.5.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/roster.git",
- "reference": "82bbd0e2de614906811aebdf16b4305956816fa6"
+ "reference": "5089de7615f72f78e831590ff9d0435fed0102bb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/roster/zipball/82bbd0e2de614906811aebdf16b4305956816fa6",
- "reference": "82bbd0e2de614906811aebdf16b4305956816fa6",
+ "url": "https://api.github.com/repos/laravel/roster/zipball/5089de7615f72f78e831590ff9d0435fed0102bb",
+ "reference": "5089de7615f72f78e831590ff9d0435fed0102bb",
"shasum": ""
},
"require": {
- "illuminate/console": "^10.0|^11.0|^12.0",
- "illuminate/contracts": "^10.0|^11.0|^12.0",
- "illuminate/routing": "^10.0|^11.0|^12.0",
- "illuminate/support": "^10.0|^11.0|^12.0",
- "php": "^8.1|^8.2",
- "symfony/yaml": "^6.4|^7.2"
+ "illuminate/console": "^11.0|^12.0|^13.0",
+ "illuminate/contracts": "^11.0|^12.0|^13.0",
+ "illuminate/routing": "^11.0|^12.0|^13.0",
+ "illuminate/support": "^11.0|^12.0|^13.0",
+ "php": "^8.2",
+ "symfony/yaml": "^7.2|^8.0"
},
"require-dev": {
"laravel/pint": "^1.14",
"mockery/mockery": "^1.6",
- "orchestra/testbench": "^8.22.0|^9.0|^10.0",
- "pestphp/pest": "^2.0|^3.0",
+ "orchestra/testbench": "^9.0|^10.0|^11.0",
+ "pestphp/pest": "^3.0|^4.1",
"phpstan/phpstan": "^2.0"
},
"type": "library",
@@ -8111,7 +8748,7 @@
"issues": "https://github.com/laravel/roster/issues",
"source": "https://github.com/laravel/roster"
},
- "time": "2025-10-20T09:56:46+00:00"
+ "time": "2026-03-05T07:58:43+00:00"
},
{
"name": "laravel/sail",
@@ -8321,39 +8958,36 @@
},
{
"name": "nunomaduro/collision",
- "version": "v8.8.3",
+ "version": "v8.9.1",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/collision.git",
- "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4"
+ "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1dc9e88d105699d0fee8bb18890f41b274f6b4c4",
- "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/a1ed3fa530fd60bc515f9303e8520fcb7d4bd935",
+ "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935",
"shasum": ""
},
"require": {
- "filp/whoops": "^2.18.1",
- "nunomaduro/termwind": "^2.3.1",
+ "filp/whoops": "^2.18.4",
+ "nunomaduro/termwind": "^2.4.0",
"php": "^8.2.0",
- "symfony/console": "^7.3.0"
+ "symfony/console": "^7.4.4 || ^8.0.4"
},
"conflict": {
- "laravel/framework": "<11.44.2 || >=13.0.0",
- "phpunit/phpunit": "<11.5.15 || >=13.0.0"
+ "laravel/framework": "<11.48.0 || >=14.0.0",
+ "phpunit/phpunit": "<11.5.50 || >=14.0.0"
},
"require-dev": {
- "brianium/paratest": "^7.8.3",
- "larastan/larastan": "^3.4.2",
- "laravel/framework": "^11.44.2 || ^12.18",
- "laravel/pint": "^1.22.1",
- "laravel/sail": "^1.43.1",
- "laravel/sanctum": "^4.1.1",
- "laravel/tinker": "^2.10.1",
- "orchestra/testbench-core": "^9.12.0 || ^10.4",
- "pestphp/pest": "^3.8.2 || ^4.0.0",
- "sebastian/environment": "^7.2.1 || ^8.0"
+ "brianium/paratest": "^7.8.5",
+ "larastan/larastan": "^3.9.2",
+ "laravel/framework": "^11.48.0 || ^12.52.0",
+ "laravel/pint": "^1.27.1",
+ "orchestra/testbench-core": "^9.12.0 || ^10.9.0",
+ "pestphp/pest": "^3.8.5 || ^4.4.1 || ^5.0.0",
+ "sebastian/environment": "^7.2.1 || ^8.0.3 || ^9.0.0"
},
"type": "library",
"extra": {
@@ -8416,45 +9050,45 @@
"type": "patreon"
}
],
- "time": "2025-11-20T02:55:25+00:00"
+ "time": "2026-02-17T17:33:08+00:00"
},
{
"name": "pestphp/pest",
- "version": "v4.3.2",
+ "version": "v4.4.1",
"source": {
"type": "git",
"url": "https://github.com/pestphp/pest.git",
- "reference": "3a4329ddc7a2b67c19fca8342a668b39be3ae398"
+ "reference": "f96a1b27864b585b0b29b0ee7331176726f7e54a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pestphp/pest/zipball/3a4329ddc7a2b67c19fca8342a668b39be3ae398",
- "reference": "3a4329ddc7a2b67c19fca8342a668b39be3ae398",
+ "url": "https://api.github.com/repos/pestphp/pest/zipball/f96a1b27864b585b0b29b0ee7331176726f7e54a",
+ "reference": "f96a1b27864b585b0b29b0ee7331176726f7e54a",
"shasum": ""
},
"require": {
- "brianium/paratest": "^7.16.1",
- "nunomaduro/collision": "^8.8.3",
- "nunomaduro/termwind": "^2.3.3",
+ "brianium/paratest": "^7.19.0",
+ "nunomaduro/collision": "^8.9.0",
+ "nunomaduro/termwind": "^2.4.0",
"pestphp/pest-plugin": "^4.0.0",
"pestphp/pest-plugin-arch": "^4.0.0",
"pestphp/pest-plugin-mutate": "^4.0.1",
"pestphp/pest-plugin-profanity": "^4.2.1",
"php": "^8.3.0",
- "phpunit/phpunit": "^12.5.8",
- "symfony/process": "^7.4.4|^8.0.0"
+ "phpunit/phpunit": "^12.5.12",
+ "symfony/process": "^7.4.5|^8.0.5"
},
"conflict": {
"filp/whoops": "<2.18.3",
- "phpunit/phpunit": ">12.5.8",
+ "phpunit/phpunit": ">12.5.12",
"sebastian/exporter": "<7.0.0",
"webmozart/assert": "<1.11.0"
},
"require-dev": {
- "pestphp/pest-dev-tools": "^4.0.0",
- "pestphp/pest-plugin-browser": "^4.2.1",
+ "pestphp/pest-dev-tools": "^4.1.0",
+ "pestphp/pest-plugin-browser": "^4.3.0",
"pestphp/pest-plugin-type-coverage": "^4.0.3",
- "psy/psysh": "^0.12.18"
+ "psy/psysh": "^0.12.20"
},
"bin": [
"bin/pest"
@@ -8520,7 +9154,7 @@
],
"support": {
"issues": "https://github.com/pestphp/pest/issues",
- "source": "https://github.com/pestphp/pest/tree/v4.3.2"
+ "source": "https://github.com/pestphp/pest/tree/v4.4.1"
},
"funding": [
{
@@ -8532,7 +9166,7 @@
"type": "github"
}
],
- "time": "2026-01-28T01:01:19+00:00"
+ "time": "2026-02-17T15:27:18+00:00"
},
{
"name": "pestphp/pest-plugin",
@@ -8676,27 +9310,27 @@
},
{
"name": "pestphp/pest-plugin-laravel",
- "version": "v4.0.0",
+ "version": "v4.1.0",
"source": {
"type": "git",
"url": "https://github.com/pestphp/pest-plugin-laravel.git",
- "reference": "e12a07046b826a40b1c8632fd7b80d6b8d7b628e"
+ "reference": "3057a36669ff11416cc0dc2b521b3aec58c488d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/e12a07046b826a40b1c8632fd7b80d6b8d7b628e",
- "reference": "e12a07046b826a40b1c8632fd7b80d6b8d7b628e",
+ "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/3057a36669ff11416cc0dc2b521b3aec58c488d0",
+ "reference": "3057a36669ff11416cc0dc2b521b3aec58c488d0",
"shasum": ""
},
"require": {
- "laravel/framework": "^11.45.2|^12.25.0",
- "pestphp/pest": "^4.0.0",
+ "laravel/framework": "^11.45.2|^12.52.0|^13.0",
+ "pestphp/pest": "^4.4.1",
"php": "^8.3.0"
},
"require-dev": {
- "laravel/dusk": "^8.3.3",
- "orchestra/testbench": "^9.13.0|^10.5.0",
- "pestphp/pest-dev-tools": "^4.0.0"
+ "laravel/dusk": "^8.3.6",
+ "orchestra/testbench": "^9.13.0|^10.9.0|^11.0",
+ "pestphp/pest-dev-tools": "^4.1.0"
},
"type": "library",
"extra": {
@@ -8734,7 +9368,7 @@
"unit"
],
"support": {
- "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v4.0.0"
+ "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v4.1.0"
},
"funding": [
{
@@ -8746,7 +9380,7 @@
"type": "github"
}
],
- "time": "2025-08-20T12:46:37+00:00"
+ "time": "2026-02-21T00:29:45+00:00"
},
{
"name": "pestphp/pest-plugin-mutate",
@@ -9000,16 +9634,16 @@
},
{
"name": "php-debugbar/php-debugbar",
- "version": "v3.3.1",
+ "version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/php-debugbar/php-debugbar.git",
- "reference": "afdaa2e56aca9d56b5bb2bad041bd2f6002017cf"
+ "reference": "486b32fd98efe9a3c10f0b24c0caabc187f78f04"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/afdaa2e56aca9d56b5bb2bad041bd2f6002017cf",
- "reference": "afdaa2e56aca9d56b5bb2bad041bd2f6002017cf",
+ "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/486b32fd98efe9a3c10f0b24c0caabc187f78f04",
+ "reference": "486b32fd98efe9a3c10f0b24c0caabc187f78f04",
"shasum": ""
},
"require": {
@@ -9086,7 +9720,7 @@
],
"support": {
"issues": "https://github.com/php-debugbar/php-debugbar/issues",
- "source": "https://github.com/php-debugbar/php-debugbar/tree/v3.3.1"
+ "source": "https://github.com/php-debugbar/php-debugbar/tree/v3.5.1"
},
"funding": [
{
@@ -9098,7 +9732,7 @@
"type": "github"
}
],
- "time": "2026-02-06T21:09:38+00:00"
+ "time": "2026-03-05T20:37:33+00:00"
},
{
"name": "php-debugbar/symfony-bridge",
@@ -9221,16 +9855,16 @@
},
{
"name": "phpdocumentor/reflection-docblock",
- "version": "5.6.6",
+ "version": "6.0.2",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8"
+ "reference": "897b5986ece6b4f9d8413fea345c7d49c757d6bf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/5cee1d3dfc2d2aa6599834520911d246f656bcb8",
- "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/897b5986ece6b4f9d8413fea345c7d49c757d6bf",
+ "reference": "897b5986ece6b4f9d8413fea345c7d49c757d6bf",
"shasum": ""
},
"require": {
@@ -9238,8 +9872,8 @@
"ext-filter": "*",
"php": "^7.4 || ^8.0",
"phpdocumentor/reflection-common": "^2.2",
- "phpdocumentor/type-resolver": "^1.7",
- "phpstan/phpdoc-parser": "^1.7|^2.0",
+ "phpdocumentor/type-resolver": "^2.0",
+ "phpstan/phpdoc-parser": "^2.0",
"webmozart/assert": "^1.9.1 || ^2"
},
"require-dev": {
@@ -9249,7 +9883,8 @@
"phpstan/phpstan-mockery": "^1.1",
"phpstan/phpstan-webmozart-assert": "^1.2",
"phpunit/phpunit": "^9.5",
- "psalm/phar": "^5.26"
+ "psalm/phar": "^5.26",
+ "shipmonk/dead-code-detector": "^0.5.1"
},
"type": "library",
"extra": {
@@ -9279,44 +9914,44 @@
"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"
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.2"
},
- "time": "2025-12-22T21:13:58+00:00"
+ "time": "2026-03-01T18:43:49+00:00"
},
{
"name": "phpdocumentor/type-resolver",
- "version": "1.12.0",
+ "version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195"
+ "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195",
- "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/327a05bbee54120d4786a0dc67aad30226ad4cf9",
+ "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9",
"shasum": ""
},
"require": {
"doctrine/deprecations": "^1.0",
- "php": "^7.3 || ^8.0",
+ "php": "^7.4 || ^8.0",
"phpdocumentor/reflection-common": "^2.0",
- "phpstan/phpdoc-parser": "^1.18|^2.0"
+ "phpstan/phpdoc-parser": "^2.0"
},
"require-dev": {
"ext-tokenizer": "*",
"phpbench/phpbench": "^1.2",
- "phpstan/extension-installer": "^1.1",
- "phpstan/phpstan": "^1.8",
- "phpstan/phpstan-phpunit": "^1.1",
+ "phpstan/extension-installer": "^1.4",
+ "phpstan/phpstan": "^2.1",
+ "phpstan/phpstan-phpunit": "^2.0",
"phpunit/phpunit": "^9.5",
- "rector/rector": "^0.13.9",
- "vimeo/psalm": "^4.25"
+ "psalm/phar": "^4"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-1.x": "1.x-dev"
+ "dev-1.x": "1.x-dev",
+ "dev-2.x": "2.x-dev"
}
},
"autoload": {
@@ -9337,9 +9972,9 @@
"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"
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/2.0.0"
},
- "time": "2025-11-21T15:09:14+00:00"
+ "time": "2026-01-06T21:53:42+00:00"
},
{
"name": "phpstan/phpdoc-parser",
@@ -9736,16 +10371,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "12.5.8",
+ "version": "12.5.12",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889"
+ "reference": "418e06b3b46b0d54bad749ff4907fc7dfb530199"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/37ddb96c14bfee10304825edbb7e66d341ec6889",
- "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/418e06b3b46b0d54bad749ff4907fc7dfb530199",
+ "reference": "418e06b3b46b0d54bad749ff4907fc7dfb530199",
"shasum": ""
},
"require": {
@@ -9759,8 +10394,8 @@
"phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1",
"php": ">=8.3",
- "phpunit/php-code-coverage": "^12.5.2",
- "phpunit/php-file-iterator": "^6.0.0",
+ "phpunit/php-code-coverage": "^12.5.3",
+ "phpunit/php-file-iterator": "^6.0.1",
"phpunit/php-invoker": "^6.0.0",
"phpunit/php-text-template": "^5.0.0",
"phpunit/php-timer": "^8.0.0",
@@ -9771,6 +10406,7 @@
"sebastian/exporter": "^7.0.2",
"sebastian/global-state": "^8.0.2",
"sebastian/object-enumerator": "^7.0.0",
+ "sebastian/recursion-context": "^7.0.1",
"sebastian/type": "^6.0.3",
"sebastian/version": "^6.0.0",
"staabm/side-effects-detector": "^1.0.5"
@@ -9813,7 +10449,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.8"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.12"
},
"funding": [
{
@@ -9837,7 +10473,7 @@
"type": "tidelift"
}
],
- "time": "2026-01-27T06:12:29+00:00"
+ "time": "2026-02-16T08:34:36+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -10790,28 +11426,27 @@
},
{
"name": "symfony/yaml",
- "version": "v7.4.1",
+ "version": "v8.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "24dd4de28d2e3988b311751ac49e684d783e2345"
+ "reference": "5f006c50a981e1630bbb70ad409c5d85f9a716e0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345",
- "reference": "24dd4de28d2e3988b311751ac49e684d783e2345",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/5f006c50a981e1630bbb70ad409c5d85f9a716e0",
+ "reference": "5f006c50a981e1630bbb70ad409c5d85f9a716e0",
"shasum": ""
},
"require": {
- "php": ">=8.2",
- "symfony/deprecation-contracts": "^2.5|^3",
+ "php": ">=8.4",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
- "symfony/console": "<6.4"
+ "symfony/console": "<7.4"
},
"require-dev": {
- "symfony/console": "^6.4|^7.0|^8.0"
+ "symfony/console": "^7.4|^8.0"
},
"bin": [
"Resources/bin/yaml-lint"
@@ -10842,7 +11477,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/yaml/tree/v7.4.1"
+ "source": "https://github.com/symfony/yaml/tree/v8.0.6"
},
"funding": [
{
@@ -10862,27 +11497,27 @@
"type": "tidelift"
}
],
- "time": "2025-12-04T18:11:45+00:00"
+ "time": "2026-02-09T10:14:57+00:00"
},
{
"name": "ta-tikoma/phpunit-architecture-test",
- "version": "0.8.6",
+ "version": "0.8.7",
"source": {
"type": "git",
"url": "https://github.com/ta-tikoma/phpunit-architecture-test.git",
- "reference": "ad48430b92901fd7d003fdaf2d7b139f96c0906e"
+ "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/ad48430b92901fd7d003fdaf2d7b139f96c0906e",
- "reference": "ad48430b92901fd7d003fdaf2d7b139f96c0906e",
+ "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/1248f3f506ca9641d4f68cebcd538fa489754db8",
+ "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.18.0 || ^5.0.0",
"php": "^8.1.0",
"phpdocumentor/reflection-docblock": "^5.3.0 || ^6.0.0",
- "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0",
+ "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0 || ^13.0.0",
"symfony/finder": "^6.4.0 || ^7.0.0 || ^8.0.0"
},
"require-dev": {
@@ -10919,9 +11554,9 @@
],
"support": {
"issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues",
- "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.6"
+ "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.7"
},
- "time": "2026-01-30T07:16:00+00:00"
+ "time": "2026-02-17T17:25:14+00:00"
},
{
"name": "theseer/tokenizer",
@@ -10975,16 +11610,16 @@
},
{
"name": "webmozart/assert",
- "version": "2.1.2",
+ "version": "2.1.6",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
- "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649"
+ "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozarts/assert/zipball/ce6a2f100c404b2d32a1dd1270f9b59ad4f57649",
- "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/ff31ad6efc62e66e518fbab1cde3453d389bcdc8",
+ "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8",
"shasum": ""
},
"require": {
@@ -11031,9 +11666,9 @@
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
- "source": "https://github.com/webmozarts/assert/tree/2.1.2"
+ "source": "https://github.com/webmozarts/assert/tree/2.1.6"
},
- "time": "2026-01-13T14:02:24+00:00"
+ "time": "2026-02-27T10:28:38+00:00"
}
],
"aliases": [],
diff --git a/config/auth.php b/config/auth.php
index 7d1eb0de..70346198 100644
--- a/config/auth.php
+++ b/config/auth.php
@@ -40,6 +40,11 @@ return [
'driver' => 'session',
'provider' => 'users',
],
+ // ControlPanel guard used by the ControlPanel package
+ 'controlpanel' => [
+ 'driver' => 'session',
+ 'provider' => 'controlpanel_users',
+ ],
],
/*
@@ -65,6 +70,12 @@ return [
'model' => env('AUTH_MODEL', App\Models\User::class),
],
+ // Provider for ControlPanel users
+ 'controlpanel_users' => [
+ 'driver' => 'eloquent',
+ 'model' => Klevze\ControlPanel\Models\Auth\User::class,
+ ],
+
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
diff --git a/config/controlpanel.php b/config/controlpanel.php
new file mode 100644
index 00000000..645491e1
--- /dev/null
+++ b/config/controlpanel.php
@@ -0,0 +1,27 @@
+ env('CPAD_ENABLED', true),
+
+ 'debug' => env('CPAD_DEBUG', false),
+
+ 'route_prefix' => env('CPAD_ROUTE_PREFIX', 'admin'),
+
+ 'middleware' => ['web', 'auth'],
+
+ 'permissions' => [
+ 'enabled' => true,
+ 'super_admin_role' => 'super-admin',
+ ],
+];
\ No newline at end of file
diff --git a/config/cors.php b/config/cors.php
new file mode 100644
index 00000000..3407497b
--- /dev/null
+++ b/config/cors.php
@@ -0,0 +1,34 @@
+ env('CP_ENABLE_CORS', true)
+ ? [
+ 'api/*',
+ 'sanctum/csrf-cookie',
+ ]
+ : [],
+
+ 'allowed_methods' => ['*'],
+
+ 'allowed_origins' => ['*'],
+
+ 'allowed_origins_patterns' => [],
+
+ 'allowed_headers' => ['*'],
+
+ 'exposed_headers' => [],
+
+ 'max_age' => 0,
+
+ 'supports_credentials' => false,
+];
diff --git a/config/cp.php b/config/cp.php
new file mode 100644
index 00000000..d2ff62df
--- /dev/null
+++ b/config/cp.php
@@ -0,0 +1,23 @@
+ '/admin/images/cp/logo.png',
+ 'footer' => '2020 © info@klevze.net',
+ 'flag_folder' => '/admin/images/flags/languages/16/',
+ 'flag_folder_24' => '/admin/images/flags/languages/24/',
+ 'flag_folder_32' => '/admin/images/flags/languages/32/',
+ 'flag_folder_64' => '/admin/images/flags/languages/64/',
+ 'admin_path' => '/admin',
+ 'webroot' => '/cp',
+ 'theme' => 'adminlte',
+ //'theme' => 'porto',
+
+ 'login' => [
+ 'footer' => '2020 © klevze.net',
+ 'logo' => '/admin/images/cp/logo.png',
+ ],
+
+ 'tinymce' => [
+ 'apikey' => 'xbqp7qz3idlwqmbessgwzlptb87ffxwphdgadio4dyp72sbw',
+ ],
+];
diff --git a/config/cpad.php b/config/cpad.php
new file mode 100644
index 00000000..82d6b638
--- /dev/null
+++ b/config/cpad.php
@@ -0,0 +1,14 @@
+ false,
+ 'cache_enabled' => true,
+ 'log_level' => 'warning',
+ 'features' =>
+ array (
+ 0 => 'core',
+ 1 => 'security',
+ ),
+ 'security_level' => 'maximum',
+ 'backup_enabled' => true,
+);
diff --git a/config/file-manager.php b/config/file-manager.php
new file mode 100644
index 00000000..63fd749d
--- /dev/null
+++ b/config/file-manager.php
@@ -0,0 +1,166 @@
+ DefaultConfigRepository::class,
+
+ /**
+ * ACL rules repository
+ *
+ * Default - ConfigACLRepository (see rules in - aclRules)
+ */
+ 'aclRepository' => ConfigACLRepository::class,
+
+ //********* Default configuration for DefaultConfigRepository **************
+
+ /**
+ * LFM Route prefix
+ * !!! WARNING - if you change it, you should compile frontend with new prefix(baseUrl) !!!
+ */
+ 'routePrefix' => 'file-manager',
+
+ /**
+ * List of disk names that you want to use
+ * (from config/filesystems)
+ */
+ 'diskList' => ['public'],
+
+ /**
+ * Default disk for left manager
+ *
+ * null - auto select the first disk in the disk list
+ */
+ 'leftDisk' => null,
+
+ /**
+ * Default disk for right manager
+ *
+ * null - auto select the first disk in the disk list
+ */
+ 'rightDisk' => null,
+
+ /**
+ * Default path for left manager
+ *
+ * null - root directory
+ */
+ 'leftPath' => null,
+
+ /**
+ * Default path for right manager
+ *
+ * null - root directory
+ */
+ 'rightPath' => null,
+
+ /**
+ * File manager modules configuration
+ *
+ * 1 - only one file manager window
+ * 2 - one file manager window with directories tree module
+ * 3 - two file manager windows
+ */
+ 'windowsConfig' => 2,
+
+ /**
+ * File upload - Max file size in KB
+ *
+ * null - no restrictions
+ */
+ 'maxUploadFileSize' => null,
+
+ /**
+ * File upload - Allow these file types
+ *
+ * [] - no restrictions
+ */
+ 'allowFileTypes' => [],
+
+ /**
+ * Show / Hide system files and folders
+ */
+ 'hiddenFiles' => true,
+
+ /***************************************************************************
+ * Middleware
+ *
+ * Add your middleware name to array -> ['web', 'auth', 'admin']
+ * !!!! RESTRICT ACCESS FOR NON ADMIN USERS !!!!
+ */
+ 'middleware' => ['web'],
+
+ /***************************************************************************
+ * ACL mechanism ON/OFF
+ *
+ * default - false(OFF)
+ */
+ 'acl' => false,
+
+ /**
+ * Hide files and folders from file-manager if user doesn't have access
+ *
+ * ACL access level = 0
+ */
+ 'aclHideFromFM' => true,
+
+ /**
+ * ACL strategy
+ *
+ * blacklist - Allow everything(access - 2 - r/w) that is not forbidden by the ACL rules list
+ *
+ * whitelist - Deny anything(access - 0 - deny), that not allowed by the ACL rules list
+ */
+ 'aclStrategy' => 'blacklist',
+
+ /**
+ * ACL Rules cache
+ *
+ * null or value in minutes
+ */
+ 'aclRulesCache' => null,
+
+ //********* Default configuration for DefaultConfigRepository END **********
+
+
+ /***************************************************************************
+ * ACL rules list - used for default ACL repository (ConfigACLRepository)
+ *
+ * 1 it's user ID
+ * null - for not authenticated user
+ *
+ * 'disk' => 'disk-name'
+ *
+ * 'path' => 'folder-name'
+ * 'path' => 'folder1*' - select folder1, folder12, folder1/sub-folder, ...
+ * 'path' => 'folder2/*' - select folder2/sub-folder,... but not select folder2 !!!
+ * 'path' => 'folder-name/file-name.jpg'
+ * 'path' => 'folder-name/*.jpg'
+ *
+ * * - wildcard
+ *
+ * access: 0 - deny, 1 - read, 2 - read/write
+ */
+ 'aclRules' => [
+ null => [
+ //['disk' => 'public', 'path' => '/', 'access' => 2],
+ ],
+ 1 => [
+ //['disk' => 'public', 'path' => 'images/arch*.jpg', 'access' => 2],
+ //['disk' => 'public', 'path' => 'files/*', 'access' => 1],
+ ],
+ ],
+
+ /**
+ * Enable slugification of filenames of uploaded files.
+ *
+ */
+ 'slugifyNames' => false,
+];
diff --git a/config/services.php b/config/services.php
index ce48ec58..edd4a86f 100644
--- a/config/services.php
+++ b/config/services.php
@@ -67,7 +67,7 @@ return [
'client_secret' => env('DISCORD_CLIENT_SECRET'),
'redirect' => env('DISCORD_REDIRECT_URI', '/auth/discord/callback'),
],
-
+
/*
* Google AdSense
diff --git a/config/skinbase.php b/config/skinbase.php
new file mode 100644
index 00000000..5eb2f74e
--- /dev/null
+++ b/config/skinbase.php
@@ -0,0 +1,22 @@
+ [
+ 'admin',
+ 'administrator',
+ 'support',
+ 'staff',
+ 'system',
+ 'root',
+ 'api',
+ 'cdn',
+ 'upload',
+ 'settings',
+ 'login',
+ 'logout',
+ 'register',
+ 'skinbase',
+ ],
+];
diff --git a/config/usernames.php b/config/usernames.php
index 0dc5e79a..80ac5451 100644
--- a/config/usernames.php
+++ b/config/usernames.php
@@ -5,8 +5,8 @@ declare(strict_types=1);
return [
'min' => 3,
'max' => 20,
- 'regex' => '/^[a-zA-Z0-9_-]+$/',
- 'rename_cooldown_days' => 90,
+ 'regex' => '/^[a-zA-Z0-9_]{3,20}$/',
+ 'rename_cooldown_days' => 30,
'similarity_threshold' => 2,
'reserved' => [
'admin',
diff --git a/database/migrations/2026_02_01_000005_create_artwork_downloads_table.php b/database/migrations/2026_02_01_000005_create_artwork_downloads_table.php
index 8999eaa3..4c776d8f 100644
--- a/database/migrations/2026_02_01_000005_create_artwork_downloads_table.php
+++ b/database/migrations/2026_02_01_000005_create_artwork_downloads_table.php
@@ -12,11 +12,15 @@ return new class extends Migration {
$table->foreignId('artwork_id')->constrained()->cascadeOnDelete();
$table->foreignId('user_id')->nullable()->index();
- $table->binary('ip', 16);
- $table->string('user_agent')->nullable();
+ // Legacy binary IP is kept for existing analytics/tests compatibility.
+ $table->binary('ip', 16)->nullable();
+ $table->string('ip_address', 45)->nullable();
+ $table->text('user_agent')->nullable();
+ $table->text('referer')->nullable();
$table->timestamp('created_at')->useCurrent();
+ $table->index('created_at');
$table->index(['artwork_id', 'created_at'], 'idx_downloads_artwork');
});
}
diff --git a/database/migrations/2026_03_06_180151_add_grid_data_to_contents_table.php b/database/migrations/2026_03_06_180151_add_grid_data_to_contents_table.php
new file mode 100644
index 00000000..0481f5e2
--- /dev/null
+++ b/database/migrations/2026_03_06_180151_add_grid_data_to_contents_table.php
@@ -0,0 +1,29 @@
+text('grid_data')->nullable()->after('views');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('contents', function (Blueprint $table) {
+ $table->dropColumn('grid_data');
+ });
+ }
+};
diff --git a/database/migrations/2026_03_07_000001_add_analytics_fields_to_artwork_downloads_table.php b/database/migrations/2026_03_07_000001_add_analytics_fields_to_artwork_downloads_table.php
new file mode 100644
index 00000000..17baab23
--- /dev/null
+++ b/database/migrations/2026_03_07_000001_add_analytics_fields_to_artwork_downloads_table.php
@@ -0,0 +1,54 @@
+string('ip_address', 45)->nullable()->after('ip');
+ }
+
+ if (! Schema::hasColumn('artwork_downloads', 'referer')) {
+ $table->text('referer')->nullable()->after('user_agent');
+ }
+
+ if (! Schema::hasColumn('artwork_downloads', 'created_at')) {
+ $table->timestamp('created_at')->useCurrent();
+ }
+ });
+
+ try {
+ Schema::table('artwork_downloads', function (Blueprint $table) {
+ $table->index('created_at', 'artwork_downloads_created_at_idx');
+ });
+ } catch (\Throwable) {
+ // Index may already exist depending on historical migration state.
+ }
+ }
+
+ public function down(): void
+ {
+ try {
+ Schema::table('artwork_downloads', function (Blueprint $table) {
+ $table->dropIndex('artwork_downloads_created_at_idx');
+ });
+ } catch (\Throwable) {
+ // Ignore when index is absent.
+ }
+
+ Schema::table('artwork_downloads', function (Blueprint $table) {
+ if (Schema::hasColumn('artwork_downloads', 'ip_address')) {
+ $table->dropColumn('ip_address');
+ }
+
+ if (Schema::hasColumn('artwork_downloads', 'referer')) {
+ $table->dropColumn('referer');
+ }
+
+ });
+ }
+};
diff --git a/database/migrations/2026_03_07_120000_add_cover_fields_to_users_table.php b/database/migrations/2026_03_07_120000_add_cover_fields_to_users_table.php
new file mode 100644
index 00000000..43dd43bd
--- /dev/null
+++ b/database/migrations/2026_03_07_120000_add_cover_fields_to_users_table.php
@@ -0,0 +1,41 @@
+string('cover_hash', 64)->nullable()->after('last_visit_at');
+ }
+
+ if (! Schema::hasColumn('users', 'cover_ext')) {
+ $table->string('cover_ext', 10)->nullable()->after('cover_hash');
+ }
+
+ if (! Schema::hasColumn('users', 'cover_position')) {
+ $table->unsignedTinyInteger('cover_position')->default(50)->after('cover_ext');
+ }
+ });
+ }
+
+ public function down(): void
+ {
+ Schema::table('users', function (Blueprint $table): void {
+ if (Schema::hasColumn('users', 'cover_position')) {
+ $table->dropColumn('cover_position');
+ }
+
+ if (Schema::hasColumn('users', 'cover_ext')) {
+ $table->dropColumn('cover_ext');
+ }
+
+ if (Schema::hasColumn('users', 'cover_hash')) {
+ $table->dropColumn('cover_hash');
+ }
+ });
+ }
+};
diff --git a/database/migrations/2026_03_07_130000_add_settings_notification_columns_to_user_profiles_table.php b/database/migrations/2026_03_07_130000_add_settings_notification_columns_to_user_profiles_table.php
new file mode 100644
index 00000000..92bd5927
--- /dev/null
+++ b/database/migrations/2026_03_07_130000_add_settings_notification_columns_to_user_profiles_table.php
@@ -0,0 +1,53 @@
+boolean('email_notifications')->default(true)->after('auto_post_upload');
+ }
+
+ if (!Schema::hasColumn('user_profiles', 'upload_notifications')) {
+ $table->boolean('upload_notifications')->default(true)->after('email_notifications');
+ }
+
+ if (!Schema::hasColumn('user_profiles', 'follower_notifications')) {
+ $table->boolean('follower_notifications')->default(true)->after('upload_notifications');
+ }
+
+ if (!Schema::hasColumn('user_profiles', 'comment_notifications')) {
+ $table->boolean('comment_notifications')->default(true)->after('follower_notifications');
+ }
+
+ if (!Schema::hasColumn('user_profiles', 'newsletter')) {
+ $table->boolean('newsletter')->default(false)->after('comment_notifications');
+ }
+ });
+ }
+
+ public function down(): void
+ {
+ if (!Schema::hasTable('user_profiles')) {
+ return;
+ }
+
+ Schema::table('user_profiles', function (Blueprint $table) {
+ foreach (['newsletter', 'comment_notifications', 'follower_notifications', 'upload_notifications', 'email_notifications'] as $column) {
+ if (Schema::hasColumn('user_profiles', $column)) {
+ $table->dropColumn($column);
+ }
+ }
+ });
+ }
+};
diff --git a/database/migrations/2026_03_07_140000_add_last_username_change_at_to_users_table.php b/database/migrations/2026_03_07_140000_add_last_username_change_at_to_users_table.php
new file mode 100644
index 00000000..24b4cb0a
--- /dev/null
+++ b/database/migrations/2026_03_07_140000_add_last_username_change_at_to_users_table.php
@@ -0,0 +1,25 @@
+timestamp('last_username_change_at')->nullable()->after('username_changed_at');
+ }
+ });
+ }
+
+ public function down(): void
+ {
+ Schema::table('users', function (Blueprint $table) {
+ if (Schema::hasColumn('users', 'last_username_change_at')) {
+ $table->dropColumn('last_username_change_at');
+ }
+ });
+ }
+};
diff --git a/database/migrations/2026_03_07_140100_create_email_changes_table.php b/database/migrations/2026_03_07_140100_create_email_changes_table.php
new file mode 100644
index 00000000..7292e2ef
--- /dev/null
+++ b/database/migrations/2026_03_07_140100_create_email_changes_table.php
@@ -0,0 +1,33 @@
+id();
+ $table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
+ $table->string('new_email', 255);
+ $table->string('verification_code', 128);
+ $table->timestamp('expires_at');
+ $table->timestamp('used_at')->nullable();
+ $table->timestamps();
+
+ $table->index(['user_id', 'expires_at']);
+ $table->index(['user_id', 'created_at']);
+ $table->index('new_email');
+ });
+ }
+
+ public function down(): void
+ {
+ Schema::dropIfExists('email_changes');
+ }
+};
diff --git a/database/migrations/2026_03_09_000005_upgrade_stories_for_creator_module.php b/database/migrations/2026_03_09_000005_upgrade_stories_for_creator_module.php
new file mode 100644
index 00000000..cc4048c8
--- /dev/null
+++ b/database/migrations/2026_03_09_000005_upgrade_stories_for_creator_module.php
@@ -0,0 +1,98 @@
+foreignId('creator_id')->nullable()->after('id')->constrained('users')->nullOnDelete();
+ }
+
+ if (! Schema::hasColumn('stories', 'story_type')) {
+ $table->enum('story_type', [
+ 'creator_story',
+ 'tutorial',
+ 'interview',
+ 'project_breakdown',
+ 'announcement',
+ 'resource',
+ ])->default('creator_story')->after('content');
+ }
+
+ if (! Schema::hasColumn('stories', 'reading_time')) {
+ $table->unsignedInteger('reading_time')->default(1)->after('story_type');
+ }
+
+ if (! Schema::hasColumn('stories', 'likes_count')) {
+ $table->unsignedInteger('likes_count')->default(0)->after('views');
+ }
+
+ if (! Schema::hasColumn('stories', 'comments_count')) {
+ $table->unsignedInteger('comments_count')->default(0)->after('likes_count');
+ }
+ });
+
+ if (Schema::hasColumn('stories', 'author_id') && Schema::hasTable('stories_authors')) {
+ DB::statement(<<<'SQL'
+ UPDATE stories s
+ INNER JOIN stories_authors sa ON sa.id = s.author_id
+ SET s.creator_id = sa.user_id
+ WHERE s.creator_id IS NULL
+ AND sa.user_id IS NOT NULL
+ SQL);
+ }
+ }
+
+ if (! Schema::hasTable('story_views')) {
+ Schema::create('story_views', function (Blueprint $table): void {
+ $table->id();
+ $table->foreignId('story_id')->constrained('stories')->cascadeOnDelete();
+ $table->foreignId('user_id')->nullable()->constrained('users')->nullOnDelete();
+ $table->string('ip_address', 45)->nullable();
+ $table->timestamp('created_at')->useCurrent();
+
+ $table->index(['story_id', 'created_at']);
+ $table->index(['user_id', 'created_at']);
+ });
+ }
+
+ if (! Schema::hasTable('story_likes')) {
+ Schema::create('story_likes', function (Blueprint $table): void {
+ $table->id();
+ $table->foreignId('story_id')->constrained('stories')->cascadeOnDelete();
+ $table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
+ $table->timestamp('created_at')->useCurrent();
+
+ $table->unique(['story_id', 'user_id']);
+ $table->index(['story_id', 'created_at']);
+ });
+ }
+ }
+
+ public function down(): void
+ {
+ Schema::dropIfExists('story_likes');
+ Schema::dropIfExists('story_views');
+
+ if (Schema::hasTable('stories')) {
+ Schema::table('stories', function (Blueprint $table): void {
+ if (Schema::hasColumn('stories', 'creator_id')) {
+ $table->dropConstrainedForeignId('creator_id');
+ }
+
+ foreach (['story_type', 'reading_time', 'likes_count', 'comments_count'] as $column) {
+ if (Schema::hasColumn('stories', $column)) {
+ $table->dropColumn($column);
+ }
+ }
+ });
+ }
+ }
+};
diff --git a/database/migrations/2026_03_09_000006_create_creator_story_tag_tables.php b/database/migrations/2026_03_09_000006_create_creator_story_tag_tables.php
new file mode 100644
index 00000000..848f7ffa
--- /dev/null
+++ b/database/migrations/2026_03_09_000006_create_creator_story_tag_tables.php
@@ -0,0 +1,62 @@
+id();
+ $table->string('name', 120)->unique();
+ $table->string('slug', 140)->unique();
+ $table->timestamps();
+ });
+ }
+
+ if (! Schema::hasTable('relation_story_tags')) {
+ Schema::create('relation_story_tags', function (Blueprint $table): void {
+ $table->foreignId('story_id')->constrained('stories')->cascadeOnDelete();
+ $table->foreignId('tag_id')->constrained('story_tags')->cascadeOnDelete();
+ $table->primary(['story_id', 'tag_id']);
+ });
+ }
+
+ if (Schema::hasTable('stories_tags')) {
+ $legacyTags = DB::table('stories_tags')->get();
+
+ foreach ($legacyTags as $legacyTag) {
+ DB::table('story_tags')->insertOrIgnore([
+ 'name' => (string) $legacyTag->name,
+ 'slug' => (string) $legacyTag->slug,
+ 'created_at' => $legacyTag->created_at ?? now(),
+ 'updated_at' => $legacyTag->updated_at ?? now(),
+ ]);
+ }
+ }
+
+ if (Schema::hasTable('stories_tag_relation')) {
+ $legacyRelation = DB::table('stories_tag_relation as relation')
+ ->join('stories_tags as legacy_tag', 'legacy_tag.id', '=', 'relation.tag_id')
+ ->join('story_tags as new_tag', 'new_tag.slug', '=', 'legacy_tag.slug')
+ ->get(['relation.story_id', 'new_tag.id as tag_id']);
+
+ foreach ($legacyRelation as $pair) {
+ DB::table('relation_story_tags')->insertOrIgnore([
+ 'story_id' => (int) $pair->story_id,
+ 'tag_id' => (int) $pair->tag_id,
+ ]);
+ }
+ }
+ }
+
+ public function down(): void
+ {
+ Schema::dropIfExists('relation_story_tags');
+ Schema::dropIfExists('story_tags');
+ }
+};
diff --git a/database/migrations/2026_03_09_000007_expand_story_status_enum.php b/database/migrations/2026_03_09_000007_expand_story_status_enum.php
new file mode 100644
index 00000000..5c107479
--- /dev/null
+++ b/database/migrations/2026_03_09_000007_expand_story_status_enum.php
@@ -0,0 +1,30 @@
+timestamp('scheduled_for')->nullable()->after('published_at');
+ }
+
+ if (! Schema::hasColumn('stories', 'meta_title')) {
+ $table->string('meta_title', 255)->nullable()->after('reading_time');
+ }
+
+ if (! Schema::hasColumn('stories', 'meta_description')) {
+ $table->string('meta_description', 300)->nullable()->after('meta_title');
+ }
+
+ if (! Schema::hasColumn('stories', 'canonical_url')) {
+ $table->string('canonical_url', 500)->nullable()->after('meta_description');
+ }
+
+ if (! Schema::hasColumn('stories', 'og_image')) {
+ $table->string('og_image', 500)->nullable()->after('canonical_url');
+ }
+
+ if (! Schema::hasColumn('stories', 'submitted_for_review_at')) {
+ $table->timestamp('submitted_for_review_at')->nullable()->after('scheduled_for');
+ }
+
+ if (! Schema::hasColumn('stories', 'reviewed_at')) {
+ $table->timestamp('reviewed_at')->nullable()->after('submitted_for_review_at');
+ }
+
+ if (! Schema::hasColumn('stories', 'reviewed_by_id')) {
+ $table->foreignId('reviewed_by_id')->nullable()->after('reviewed_at')->constrained('users')->nullOnDelete();
+ }
+
+ if (! Schema::hasColumn('stories', 'rejected_reason')) {
+ $table->text('rejected_reason')->nullable()->after('reviewed_by_id');
+ }
+
+ $table->index(['status', 'submitted_for_review_at'], 'idx_stories_review_queue');
+ $table->index(['creator_id', 'status', 'updated_at'], 'idx_stories_creator_status_updated');
+ });
+ }
+
+ public function down(): void
+ {
+ if (! Schema::hasTable('stories')) {
+ return;
+ }
+
+ Schema::table('stories', function (Blueprint $table): void {
+ if (Schema::hasColumn('stories', 'reviewed_by_id')) {
+ $table->dropConstrainedForeignId('reviewed_by_id');
+ }
+
+ foreach ([
+ 'scheduled_for',
+ 'meta_title',
+ 'meta_description',
+ 'canonical_url',
+ 'og_image',
+ 'submitted_for_review_at',
+ 'reviewed_at',
+ 'rejected_reason',
+ ] as $column) {
+ if (Schema::hasColumn('stories', $column)) {
+ $table->dropColumn($column);
+ }
+ }
+
+ $table->dropIndex('idx_stories_review_queue');
+ $table->dropIndex('idx_stories_creator_status_updated');
+ });
+
+ if (DB::getDriverName() === 'mysql' && Schema::hasColumn('stories', 'status')) {
+ DB::statement("ALTER TABLE stories MODIFY status ENUM('draft','published','scheduled','archived') NOT NULL DEFAULT 'draft'");
+ }
+ }
+};
diff --git a/playwright-report/data/0c27cf4124c0fe22ede8edf14fc424fd2ff4db1a.png b/playwright-report/data/0c27cf4124c0fe22ede8edf14fc424fd2ff4db1a.png
deleted file mode 100644
index e2fc7ace..00000000
Binary files a/playwright-report/data/0c27cf4124c0fe22ede8edf14fc424fd2ff4db1a.png and /dev/null differ
diff --git a/playwright-report/data/21ad70a1fd7e1c6d404a9c5f1224d0fe4f446194.md b/playwright-report/data/21ad70a1fd7e1c6d404a9c5f1224d0fe4f446194.md
deleted file mode 100644
index 9e86d178..00000000
--- a/playwright-report/data/21ad70a1fd7e1c6d404a9c5f1224d0fe4f446194.md
+++ /dev/null
@@ -1,150 +0,0 @@
-# Page snapshot
-
-```yaml
-- generic [active] [ref=e1]:
- - banner [ref=e2]:
- - generic [ref=e3]:
- - link "Skinbase.org Skinbase.org" [ref=e4] [cursor=pointer]:
- - /url: /
- - img "Skinbase.org" [ref=e5]
- - generic [ref=e6]: Skinbase.org
- - navigation "Main navigation" [ref=e7]:
- - button "Discover" [ref=e9] [cursor=pointer]:
- - text: Discover
- - img [ref=e10]
- - button "Browse" [ref=e13] [cursor=pointer]:
- - text: Browse
- - img [ref=e14]
- - button "Creators" [ref=e17] [cursor=pointer]:
- - text: Creators
- - img [ref=e18]
- - button "Community" [ref=e21] [cursor=pointer]:
- - text: Community
- - img [ref=e22]
- - generic [ref=e26]:
- - button "Open search" [ref=e27] [cursor=pointer]:
- - img [ref=e28]
- - generic [ref=e30]: Search
- - generic [ref=e31]: CtrlK
- - search:
- - generic:
- - img
- - searchbox "Search"
- - generic:
- - generic: Esc
- - button "Close search":
- - img
- - generic [ref=e32]:
- - link "Join" [ref=e33] [cursor=pointer]:
- - /url: /register
- - link "Sign in" [ref=e34] [cursor=pointer]:
- - /url: /login
- - text:
- - main [ref=e35]:
- - generic [ref=e36]:
- - generic [ref=e37]:
- - generic [ref=e38]: "500"
- - generic [ref=e39]: Server Error
- - heading "Something Went Wrong in the Nova" [level=1] [ref=e40]
- - paragraph [ref=e41]: An unexpected error occurred. Our team has been notified and is on it.
- - button "Try Again" [ref=e42] [cursor=pointer]:
- - generic [ref=e43]:
- - text: Try Again
- - generic [ref=e44]:
- - link "Return Home" [ref=e45] [cursor=pointer]:
- - /url: /
- - link "Report Issue" [ref=e46] [cursor=pointer]:
- - /url: /contact
- - generic [ref=e49]:
- - generic [ref=e50]:
- - text: "Reference ID:"
- - generic [ref=e51]: GDWS0QTD
- - contentinfo [ref=e52]:
- - generic [ref=e53]:
- - generic [ref=e54]:
- - img "Skinbase" [ref=e55]
- - generic [ref=e56]: Skinbase
- - generic [ref=e57]:
- - link "Contact / Apply" [ref=e58] [cursor=pointer]:
- - /url: /contact
- - link "RSS Feeds" [ref=e59] [cursor=pointer]:
- - /url: /rss-feeds
- - link "FAQ" [ref=e60] [cursor=pointer]:
- - /url: /faq
- - link "Rules and Guidelines" [ref=e61] [cursor=pointer]:
- - /url: /rules-and-guidelines
- - link "Staff" [ref=e62] [cursor=pointer]:
- - /url: /staff
- - link "Privacy Policy" [ref=e63] [cursor=pointer]:
- - /url: /privacy-policy
- - link "Terms of Service" [ref=e64] [cursor=pointer]:
- - /url: /terms-of-service
- - button "Cookie Preferences" [ref=e65] [cursor=pointer]
- - generic [ref=e66]: © 2026 Skinbase.org
- - dialog "Cookie consent" [ref=e67]:
- - generic [ref=e68]:
- - generic [ref=e69]:
- - generic [ref=e70]: 🍪
- - paragraph [ref=e71]:
- - text: We use
- - strong [ref=e72]: essential cookies
- - text: to keep you logged in and protect your session. With your permission we also load
- - strong [ref=e73]: advertising cookies
- - text: from third-party networks.
- - link "Learn more ↗" [ref=e74] [cursor=pointer]:
- - /url: /privacy-policy#cookies
- - generic [ref=e75]:
- - button "Essential only" [ref=e76] [cursor=pointer]
- - button "Accept all" [ref=e77] [cursor=pointer]
- - generic [ref=e78]:
- - generic [ref=e80]:
- - generic [ref=e82]:
- - generic [ref=e83] [cursor=pointer]:
- - generic: Request
- - generic [ref=e84]: "500"
- - generic [ref=e85] [cursor=pointer]:
- - generic: Exceptions
- - generic [ref=e86]: "1"
- - generic [ref=e87] [cursor=pointer]:
- - generic: Messages
- - generic [ref=e88]: "1"
- - generic [ref=e89] [cursor=pointer]:
- - generic: Timeline
- - generic [ref=e90] [cursor=pointer]:
- - generic: Views
- - generic [ref=e91]: "5"
- - generic [ref=e92] [cursor=pointer]:
- - generic: Queries
- - generic [ref=e93]: "3"
- - generic [ref=e94]:
- - generic [ref=e102] [cursor=pointer]: GET /dashboard/artworks
- - generic [ref=e103] [cursor=pointer]:
- - generic: 960ms
- - generic [ref=e105] [cursor=pointer]:
- - generic: 28MB
- - generic [ref=e107] [cursor=pointer]:
- - generic: 12.x
- - generic [ref=e109]:
- - generic [ref=e111]:
- - generic:
- - list
- - generic [ref=e113]:
- - list [ref=e114]
- - textbox "Search" [ref=e117]
- - generic [ref=e118]:
- - list
- - generic [ref=e120]:
- - list
- - list [ref=e125]
- - generic [ref=e127]:
- - generic:
- - list
- - generic [ref=e129]:
- - list [ref=e130]
- - textbox "Search" [ref=e133]
- - generic [ref=e134]:
- - list
- - generic [ref=e136]:
- - generic:
- - list
-```
\ No newline at end of file
diff --git a/playwright-report/data/2629870f4c7115ca6ecf3fbdab6635f488755d81.md b/playwright-report/data/2629870f4c7115ca6ecf3fbdab6635f488755d81.md
deleted file mode 100644
index 7e9c08ea..00000000
--- a/playwright-report/data/2629870f4c7115ca6ecf3fbdab6635f488755d81.md
+++ /dev/null
@@ -1,150 +0,0 @@
-# Page snapshot
-
-```yaml
-- generic [active] [ref=e1]:
- - banner [ref=e2]:
- - generic [ref=e3]:
- - link "Skinbase.org Skinbase.org" [ref=e4] [cursor=pointer]:
- - /url: /
- - img "Skinbase.org" [ref=e5]
- - generic [ref=e6]: Skinbase.org
- - navigation "Main navigation" [ref=e7]:
- - button "Discover" [ref=e9] [cursor=pointer]:
- - text: Discover
- - img [ref=e10]
- - button "Browse" [ref=e13] [cursor=pointer]:
- - text: Browse
- - img [ref=e14]
- - button "Creators" [ref=e17] [cursor=pointer]:
- - text: Creators
- - img [ref=e18]
- - button "Community" [ref=e21] [cursor=pointer]:
- - text: Community
- - img [ref=e22]
- - generic [ref=e26]:
- - button "Open search" [ref=e27] [cursor=pointer]:
- - img [ref=e28]
- - generic [ref=e30]: Search
- - generic [ref=e31]: CtrlK
- - search:
- - generic:
- - img
- - searchbox "Search"
- - generic:
- - generic: Esc
- - button "Close search":
- - img
- - generic [ref=e32]:
- - link "Join" [ref=e33] [cursor=pointer]:
- - /url: /register
- - link "Sign in" [ref=e34] [cursor=pointer]:
- - /url: /login
- - text:
- - main [ref=e35]:
- - generic [ref=e36]:
- - generic [ref=e37]:
- - generic [ref=e38]: "500"
- - generic [ref=e39]: Server Error
- - heading "Something Went Wrong in the Nova" [level=1] [ref=e40]
- - paragraph [ref=e41]: An unexpected error occurred. Our team has been notified and is on it.
- - button "Try Again" [ref=e42] [cursor=pointer]:
- - generic [ref=e43]:
- - text: Try Again
- - generic [ref=e44]:
- - link "Return Home" [ref=e45] [cursor=pointer]:
- - /url: /
- - link "Report Issue" [ref=e46] [cursor=pointer]:
- - /url: /contact
- - generic [ref=e49]:
- - generic [ref=e50]:
- - text: "Reference ID:"
- - generic [ref=e51]: KNHHJPDS
- - contentinfo [ref=e52]:
- - generic [ref=e53]:
- - generic [ref=e54]:
- - img "Skinbase" [ref=e55]
- - generic [ref=e56]: Skinbase
- - generic [ref=e57]:
- - link "Contact / Apply" [ref=e58] [cursor=pointer]:
- - /url: /contact
- - link "RSS Feeds" [ref=e59] [cursor=pointer]:
- - /url: /rss-feeds
- - link "FAQ" [ref=e60] [cursor=pointer]:
- - /url: /faq
- - link "Rules and Guidelines" [ref=e61] [cursor=pointer]:
- - /url: /rules-and-guidelines
- - link "Staff" [ref=e62] [cursor=pointer]:
- - /url: /staff
- - link "Privacy Policy" [ref=e63] [cursor=pointer]:
- - /url: /privacy-policy
- - link "Terms of Service" [ref=e64] [cursor=pointer]:
- - /url: /terms-of-service
- - button "Cookie Preferences" [ref=e65] [cursor=pointer]
- - generic [ref=e66]: © 2026 Skinbase.org
- - dialog "Cookie consent" [ref=e67]:
- - generic [ref=e68]:
- - generic [ref=e69]:
- - generic [ref=e70]: 🍪
- - paragraph [ref=e71]:
- - text: We use
- - strong [ref=e72]: essential cookies
- - text: to keep you logged in and protect your session. With your permission we also load
- - strong [ref=e73]: advertising cookies
- - text: from third-party networks.
- - link "Learn more ↗" [ref=e74] [cursor=pointer]:
- - /url: /privacy-policy#cookies
- - generic [ref=e75]:
- - button "Essential only" [ref=e76] [cursor=pointer]
- - button "Accept all" [ref=e77] [cursor=pointer]
- - generic [ref=e78]:
- - generic [ref=e80]:
- - generic [ref=e82]:
- - generic [ref=e83] [cursor=pointer]:
- - generic: Request
- - generic [ref=e84]: "500"
- - generic [ref=e85] [cursor=pointer]:
- - generic: Exceptions
- - generic [ref=e86]: "1"
- - generic [ref=e87] [cursor=pointer]:
- - generic: Messages
- - generic [ref=e88]: "1"
- - generic [ref=e89] [cursor=pointer]:
- - generic: Timeline
- - generic [ref=e90] [cursor=pointer]:
- - generic: Views
- - generic [ref=e91]: "5"
- - generic [ref=e92] [cursor=pointer]:
- - generic: Queries
- - generic [ref=e93]: "3"
- - generic [ref=e94]:
- - generic [ref=e102] [cursor=pointer]: GET /statistics
- - generic [ref=e103] [cursor=pointer]:
- - generic: 956ms
- - generic [ref=e105] [cursor=pointer]:
- - generic: 28MB
- - generic [ref=e107] [cursor=pointer]:
- - generic: 12.x
- - generic [ref=e109]:
- - generic [ref=e111]:
- - generic:
- - list
- - generic [ref=e113]:
- - list [ref=e114]
- - textbox "Search" [ref=e117]
- - generic [ref=e118]:
- - list
- - generic [ref=e120]:
- - list
- - list [ref=e125]
- - generic [ref=e127]:
- - generic:
- - list
- - generic [ref=e129]:
- - list [ref=e130]
- - textbox "Search" [ref=e133]
- - generic [ref=e134]:
- - list
- - generic [ref=e136]:
- - generic:
- - list
-```
\ No newline at end of file
diff --git a/playwright-report/data/281296d252ac646ab4653df099b79dc471ca47a5.md b/playwright-report/data/281296d252ac646ab4653df099b79dc471ca47a5.md
deleted file mode 100644
index 61d5c1da..00000000
--- a/playwright-report/data/281296d252ac646ab4653df099b79dc471ca47a5.md
+++ /dev/null
@@ -1,150 +0,0 @@
-# Page snapshot
-
-```yaml
-- generic [active] [ref=e1]:
- - banner [ref=e2]:
- - generic [ref=e3]:
- - link "Skinbase.org Skinbase.org" [ref=e4] [cursor=pointer]:
- - /url: /
- - img "Skinbase.org" [ref=e5]
- - generic [ref=e6]: Skinbase.org
- - navigation "Main navigation" [ref=e7]:
- - button "Discover" [ref=e9] [cursor=pointer]:
- - text: Discover
- - img [ref=e10]
- - button "Browse" [ref=e13] [cursor=pointer]:
- - text: Browse
- - img [ref=e14]
- - button "Creators" [ref=e17] [cursor=pointer]:
- - text: Creators
- - img [ref=e18]
- - button "Community" [ref=e21] [cursor=pointer]:
- - text: Community
- - img [ref=e22]
- - generic [ref=e26]:
- - button "Open search" [ref=e27] [cursor=pointer]:
- - img [ref=e28]
- - generic [ref=e30]: Search
- - generic [ref=e31]: CtrlK
- - search:
- - generic:
- - img
- - searchbox "Search"
- - generic:
- - generic: Esc
- - button "Close search":
- - img
- - generic [ref=e32]:
- - link "Join" [ref=e33] [cursor=pointer]:
- - /url: /register
- - link "Sign in" [ref=e34] [cursor=pointer]:
- - /url: /login
- - text:
- - main [ref=e35]:
- - generic [ref=e36]:
- - generic [ref=e37]:
- - generic [ref=e38]: "500"
- - generic [ref=e39]: Server Error
- - heading "Something Went Wrong in the Nova" [level=1] [ref=e40]
- - paragraph [ref=e41]: An unexpected error occurred. Our team has been notified and is on it.
- - button "Try Again" [ref=e42] [cursor=pointer]:
- - generic [ref=e43]:
- - text: Try Again
- - generic [ref=e44]:
- - link "Return Home" [ref=e45] [cursor=pointer]:
- - /url: /
- - link "Report Issue" [ref=e46] [cursor=pointer]:
- - /url: /contact
- - generic [ref=e49]:
- - generic [ref=e50]:
- - text: "Reference ID:"
- - generic [ref=e51]: HPLARFKK
- - contentinfo [ref=e52]:
- - generic [ref=e53]:
- - generic [ref=e54]:
- - img "Skinbase" [ref=e55]
- - generic [ref=e56]: Skinbase
- - generic [ref=e57]:
- - link "Contact / Apply" [ref=e58] [cursor=pointer]:
- - /url: /contact
- - link "RSS Feeds" [ref=e59] [cursor=pointer]:
- - /url: /rss-feeds
- - link "FAQ" [ref=e60] [cursor=pointer]:
- - /url: /faq
- - link "Rules and Guidelines" [ref=e61] [cursor=pointer]:
- - /url: /rules-and-guidelines
- - link "Staff" [ref=e62] [cursor=pointer]:
- - /url: /staff
- - link "Privacy Policy" [ref=e63] [cursor=pointer]:
- - /url: /privacy-policy
- - link "Terms of Service" [ref=e64] [cursor=pointer]:
- - /url: /terms-of-service
- - button "Cookie Preferences" [ref=e65] [cursor=pointer]
- - generic [ref=e66]: © 2026 Skinbase.org
- - dialog "Cookie consent" [ref=e67]:
- - generic [ref=e68]:
- - generic [ref=e69]:
- - generic [ref=e70]: 🍪
- - paragraph [ref=e71]:
- - text: We use
- - strong [ref=e72]: essential cookies
- - text: to keep you logged in and protect your session. With your permission we also load
- - strong [ref=e73]: advertising cookies
- - text: from third-party networks.
- - link "Learn more ↗" [ref=e74] [cursor=pointer]:
- - /url: /privacy-policy#cookies
- - generic [ref=e75]:
- - button "Essential only" [ref=e76] [cursor=pointer]
- - button "Accept all" [ref=e77] [cursor=pointer]
- - generic [ref=e78]:
- - generic [ref=e80]:
- - generic [ref=e82]:
- - generic [ref=e83] [cursor=pointer]:
- - generic: Request
- - generic [ref=e84]: "500"
- - generic [ref=e85] [cursor=pointer]:
- - generic: Exceptions
- - generic [ref=e86]: "1"
- - generic [ref=e87] [cursor=pointer]:
- - generic: Messages
- - generic [ref=e88]: "1"
- - generic [ref=e89] [cursor=pointer]:
- - generic: Timeline
- - generic [ref=e90] [cursor=pointer]:
- - generic: Views
- - generic [ref=e91]: "5"
- - generic [ref=e92] [cursor=pointer]:
- - generic: Queries
- - generic [ref=e93]: "3"
- - generic [ref=e94]:
- - generic [ref=e102] [cursor=pointer]: GET /mybuddies
- - generic [ref=e103] [cursor=pointer]:
- - generic: 683ms
- - generic [ref=e105] [cursor=pointer]:
- - generic: 28MB
- - generic [ref=e107] [cursor=pointer]:
- - generic: 12.x
- - generic [ref=e109]:
- - generic [ref=e111]:
- - generic:
- - list
- - generic [ref=e113]:
- - list [ref=e114]
- - textbox "Search" [ref=e117]
- - generic [ref=e118]:
- - list
- - generic [ref=e120]:
- - list
- - list [ref=e125]
- - generic [ref=e127]:
- - generic:
- - list
- - generic [ref=e129]:
- - list [ref=e130]
- - textbox "Search" [ref=e133]
- - generic [ref=e134]:
- - list
- - generic [ref=e136]:
- - generic:
- - list
-```
\ No newline at end of file
diff --git a/playwright-report/data/2e87ab3164a8eeb27594dbca081219fa8ca0d55a.png b/playwright-report/data/2e87ab3164a8eeb27594dbca081219fa8ca0d55a.png
deleted file mode 100644
index f138f4b3..00000000
Binary files a/playwright-report/data/2e87ab3164a8eeb27594dbca081219fa8ca0d55a.png and /dev/null differ
diff --git a/playwright-report/data/488f4702ced4ef8e94d2c536ad22d9a05dc44f15.png b/playwright-report/data/488f4702ced4ef8e94d2c536ad22d9a05dc44f15.png
deleted file mode 100644
index 56dedfc2..00000000
Binary files a/playwright-report/data/488f4702ced4ef8e94d2c536ad22d9a05dc44f15.png and /dev/null differ
diff --git a/playwright-report/data/4c2cff1a8fb9da7d418ac790ca616f06b4712db8.md b/playwright-report/data/4c2cff1a8fb9da7d418ac790ca616f06b4712db8.md
deleted file mode 100644
index 16a60ef6..00000000
--- a/playwright-report/data/4c2cff1a8fb9da7d418ac790ca616f06b4712db8.md
+++ /dev/null
@@ -1,150 +0,0 @@
-# Page snapshot
-
-```yaml
-- generic [active] [ref=e1]:
- - banner [ref=e2]:
- - generic [ref=e3]:
- - link "Skinbase.org Skinbase.org" [ref=e4] [cursor=pointer]:
- - /url: /
- - img "Skinbase.org" [ref=e5]
- - generic [ref=e6]: Skinbase.org
- - navigation "Main navigation" [ref=e7]:
- - button "Discover" [ref=e9] [cursor=pointer]:
- - text: Discover
- - img [ref=e10]
- - button "Browse" [ref=e13] [cursor=pointer]:
- - text: Browse
- - img [ref=e14]
- - button "Creators" [ref=e17] [cursor=pointer]:
- - text: Creators
- - img [ref=e18]
- - button "Community" [ref=e21] [cursor=pointer]:
- - text: Community
- - img [ref=e22]
- - generic [ref=e26]:
- - button "Open search" [ref=e27] [cursor=pointer]:
- - img [ref=e28]
- - generic [ref=e30]: Search
- - generic [ref=e31]: CtrlK
- - search:
- - generic:
- - img
- - searchbox "Search"
- - generic:
- - generic: Esc
- - button "Close search":
- - img
- - generic [ref=e32]:
- - link "Join" [ref=e33] [cursor=pointer]:
- - /url: /register
- - link "Sign in" [ref=e34] [cursor=pointer]:
- - /url: /login
- - text:
- - main [ref=e35]:
- - generic [ref=e36]:
- - generic [ref=e37]:
- - generic [ref=e38]: "500"
- - generic [ref=e39]: Server Error
- - heading "Something Went Wrong in the Nova" [level=1] [ref=e40]
- - paragraph [ref=e41]: An unexpected error occurred. Our team has been notified and is on it.
- - button "Try Again" [ref=e42] [cursor=pointer]:
- - generic [ref=e43]:
- - text: Try Again
- - generic [ref=e44]:
- - link "Return Home" [ref=e45] [cursor=pointer]:
- - /url: /
- - link "Report Issue" [ref=e46] [cursor=pointer]:
- - /url: /contact
- - generic [ref=e49]:
- - generic [ref=e50]:
- - text: "Reference ID:"
- - generic [ref=e51]: 4IBKNGTZ
- - contentinfo [ref=e52]:
- - generic [ref=e53]:
- - generic [ref=e54]:
- - img "Skinbase" [ref=e55]
- - generic [ref=e56]: Skinbase
- - generic [ref=e57]:
- - link "Contact / Apply" [ref=e58] [cursor=pointer]:
- - /url: /contact
- - link "RSS Feeds" [ref=e59] [cursor=pointer]:
- - /url: /rss-feeds
- - link "FAQ" [ref=e60] [cursor=pointer]:
- - /url: /faq
- - link "Rules and Guidelines" [ref=e61] [cursor=pointer]:
- - /url: /rules-and-guidelines
- - link "Staff" [ref=e62] [cursor=pointer]:
- - /url: /staff
- - link "Privacy Policy" [ref=e63] [cursor=pointer]:
- - /url: /privacy-policy
- - link "Terms of Service" [ref=e64] [cursor=pointer]:
- - /url: /terms-of-service
- - button "Cookie Preferences" [ref=e65] [cursor=pointer]
- - generic [ref=e66]: © 2026 Skinbase.org
- - dialog "Cookie consent" [ref=e67]:
- - generic [ref=e68]:
- - generic [ref=e69]:
- - generic [ref=e70]: 🍪
- - paragraph [ref=e71]:
- - text: We use
- - strong [ref=e72]: essential cookies
- - text: to keep you logged in and protect your session. With your permission we also load
- - strong [ref=e73]: advertising cookies
- - text: from third-party networks.
- - link "Learn more ↗" [ref=e74] [cursor=pointer]:
- - /url: /privacy-policy#cookies
- - generic [ref=e75]:
- - button "Essential only" [ref=e76] [cursor=pointer]
- - button "Accept all" [ref=e77] [cursor=pointer]
- - generic [ref=e78]:
- - generic [ref=e80]:
- - generic [ref=e82]:
- - generic [ref=e83] [cursor=pointer]:
- - generic: Request
- - generic [ref=e84]: "500"
- - generic [ref=e85] [cursor=pointer]:
- - generic: Exceptions
- - generic [ref=e86]: "1"
- - generic [ref=e87] [cursor=pointer]:
- - generic: Messages
- - generic [ref=e88]: "1"
- - generic [ref=e89] [cursor=pointer]:
- - generic: Timeline
- - generic [ref=e90] [cursor=pointer]:
- - generic: Views
- - generic [ref=e91]: "5"
- - generic [ref=e92] [cursor=pointer]:
- - generic: Queries
- - generic [ref=e93]: "3"
- - generic [ref=e94]:
- - generic [ref=e102] [cursor=pointer]: GET /dashboard/awards
- - generic [ref=e103] [cursor=pointer]:
- - generic: 695ms
- - generic [ref=e105] [cursor=pointer]:
- - generic: 28MB
- - generic [ref=e107] [cursor=pointer]:
- - generic: 12.x
- - generic [ref=e109]:
- - generic [ref=e111]:
- - generic:
- - list
- - generic [ref=e113]:
- - list [ref=e114]
- - textbox "Search" [ref=e117]
- - generic [ref=e118]:
- - list
- - generic [ref=e120]:
- - list
- - list [ref=e125]
- - generic [ref=e127]:
- - generic:
- - list
- - generic [ref=e129]:
- - list [ref=e130]
- - textbox "Search" [ref=e133]
- - generic [ref=e134]:
- - list
- - generic [ref=e136]:
- - generic:
- - list
-```
\ No newline at end of file
diff --git a/playwright-report/data/4d23f2ffb7f3fefb71682e22cecb80e7bf7e0b49.md b/playwright-report/data/4d23f2ffb7f3fefb71682e22cecb80e7bf7e0b49.md
deleted file mode 100644
index 67e8d922..00000000
--- a/playwright-report/data/4d23f2ffb7f3fefb71682e22cecb80e7bf7e0b49.md
+++ /dev/null
@@ -1,150 +0,0 @@
-# Page snapshot
-
-```yaml
-- generic [active] [ref=e1]:
- - banner [ref=e2]:
- - generic [ref=e3]:
- - link "Skinbase.org Skinbase.org" [ref=e4] [cursor=pointer]:
- - /url: /
- - img "Skinbase.org" [ref=e5]
- - generic [ref=e6]: Skinbase.org
- - navigation "Main navigation" [ref=e7]:
- - button "Discover" [ref=e9] [cursor=pointer]:
- - text: Discover
- - img [ref=e10]
- - button "Browse" [ref=e13] [cursor=pointer]:
- - text: Browse
- - img [ref=e14]
- - button "Creators" [ref=e17] [cursor=pointer]:
- - text: Creators
- - img [ref=e18]
- - button "Community" [ref=e21] [cursor=pointer]:
- - text: Community
- - img [ref=e22]
- - generic [ref=e26]:
- - button "Open search" [ref=e27] [cursor=pointer]:
- - img [ref=e28]
- - generic [ref=e30]: Search
- - generic [ref=e31]: CtrlK
- - search:
- - generic:
- - img
- - searchbox "Search"
- - generic:
- - generic: Esc
- - button "Close search":
- - img
- - generic [ref=e32]:
- - link "Join" [ref=e33] [cursor=pointer]:
- - /url: /register
- - link "Sign in" [ref=e34] [cursor=pointer]:
- - /url: /login
- - text:
- - main [ref=e35]:
- - generic [ref=e36]:
- - generic [ref=e37]:
- - generic [ref=e38]: "500"
- - generic [ref=e39]: Server Error
- - heading "Something Went Wrong in the Nova" [level=1] [ref=e40]
- - paragraph [ref=e41]: An unexpected error occurred. Our team has been notified and is on it.
- - button "Try Again" [ref=e42] [cursor=pointer]:
- - generic [ref=e43]:
- - text: Try Again
- - generic [ref=e44]:
- - link "Return Home" [ref=e45] [cursor=pointer]:
- - /url: /
- - link "Report Issue" [ref=e46] [cursor=pointer]:
- - /url: /contact
- - generic [ref=e49]:
- - generic [ref=e50]:
- - text: "Reference ID:"
- - generic [ref=e51]: RMSI5LGF
- - contentinfo [ref=e52]:
- - generic [ref=e53]:
- - generic [ref=e54]:
- - img "Skinbase" [ref=e55]
- - generic [ref=e56]: Skinbase
- - generic [ref=e57]:
- - link "Contact / Apply" [ref=e58] [cursor=pointer]:
- - /url: /contact
- - link "RSS Feeds" [ref=e59] [cursor=pointer]:
- - /url: /rss-feeds
- - link "FAQ" [ref=e60] [cursor=pointer]:
- - /url: /faq
- - link "Rules and Guidelines" [ref=e61] [cursor=pointer]:
- - /url: /rules-and-guidelines
- - link "Staff" [ref=e62] [cursor=pointer]:
- - /url: /staff
- - link "Privacy Policy" [ref=e63] [cursor=pointer]:
- - /url: /privacy-policy
- - link "Terms of Service" [ref=e64] [cursor=pointer]:
- - /url: /terms-of-service
- - button "Cookie Preferences" [ref=e65] [cursor=pointer]
- - generic [ref=e66]: © 2026 Skinbase.org
- - dialog "Cookie consent" [ref=e67]:
- - generic [ref=e68]:
- - generic [ref=e69]:
- - generic [ref=e70]: 🍪
- - paragraph [ref=e71]:
- - text: We use
- - strong [ref=e72]: essential cookies
- - text: to keep you logged in and protect your session. With your permission we also load
- - strong [ref=e73]: advertising cookies
- - text: from third-party networks.
- - link "Learn more ↗" [ref=e74] [cursor=pointer]:
- - /url: /privacy-policy#cookies
- - generic [ref=e75]:
- - button "Essential only" [ref=e76] [cursor=pointer]
- - button "Accept all" [ref=e77] [cursor=pointer]
- - generic [ref=e78]:
- - generic [ref=e80]:
- - generic [ref=e82]:
- - generic [ref=e83] [cursor=pointer]:
- - generic: Request
- - generic [ref=e84]: "500"
- - generic [ref=e85] [cursor=pointer]:
- - generic: Exceptions
- - generic [ref=e86]: "1"
- - generic [ref=e87] [cursor=pointer]:
- - generic: Messages
- - generic [ref=e88]: "1"
- - generic [ref=e89] [cursor=pointer]:
- - generic: Timeline
- - generic [ref=e90] [cursor=pointer]:
- - generic: Views
- - generic [ref=e91]: "5"
- - generic [ref=e92] [cursor=pointer]:
- - generic: Queries
- - generic [ref=e93]: "3"
- - generic [ref=e94]:
- - generic [ref=e102] [cursor=pointer]: GET /recieved-comments
- - generic [ref=e103] [cursor=pointer]:
- - generic: 949ms
- - generic [ref=e105] [cursor=pointer]:
- - generic: 28MB
- - generic [ref=e107] [cursor=pointer]:
- - generic: 12.x
- - generic [ref=e109]:
- - generic [ref=e111]:
- - generic:
- - list
- - generic [ref=e113]:
- - list [ref=e114]
- - textbox "Search" [ref=e117]
- - generic [ref=e118]:
- - list
- - generic [ref=e120]:
- - list
- - list [ref=e125]
- - generic [ref=e127]:
- - generic:
- - list
- - generic [ref=e129]:
- - list [ref=e130]
- - textbox "Search" [ref=e133]
- - generic [ref=e134]:
- - list
- - generic [ref=e136]:
- - generic:
- - list
-```
\ No newline at end of file
diff --git a/playwright-report/data/5b9ff97d3ae72495c56d81d699e7a67b0a347e7c.png b/playwright-report/data/5b9ff97d3ae72495c56d81d699e7a67b0a347e7c.png
deleted file mode 100644
index ad855e6c..00000000
Binary files a/playwright-report/data/5b9ff97d3ae72495c56d81d699e7a67b0a347e7c.png and /dev/null differ
diff --git a/playwright-report/data/5ed031fa0cf668f49f668b64bab35a726f83b3f9.png b/playwright-report/data/5ed031fa0cf668f49f668b64bab35a726f83b3f9.png
deleted file mode 100644
index 22f22d14..00000000
Binary files a/playwright-report/data/5ed031fa0cf668f49f668b64bab35a726f83b3f9.png and /dev/null differ
diff --git a/playwright-report/data/7950e4b7b5a0f6db4890ef75bfee3280ae544e8e.md b/playwright-report/data/7950e4b7b5a0f6db4890ef75bfee3280ae544e8e.md
new file mode 100644
index 00000000..8335b713
--- /dev/null
+++ b/playwright-report/data/7950e4b7b5a0f6db4890ef75bfee3280ae544e8e.md
@@ -0,0 +1,289 @@
+# Page snapshot
+
+```yaml
+- generic [active] [ref=e1]:
+ - generic [ref=e2]:
+ - generic [ref=e4]:
+ - generic [ref=e5]:
+ - img [ref=e7]
+ - generic [ref=e10]: Internal Server Error
+ - button "Copy as Markdown" [ref=e11] [cursor=pointer]:
+ - img [ref=e12]
+ - generic [ref=e15]: Copy as Markdown
+ - generic [ref=e18]:
+ - generic [ref=e19]:
+ - heading "Symfony\\Component\\Routing\\Exception\\RouteNotFoundException" [level=1] [ref=e20]
+ - generic [ref=e22]: vendor\laravel\framework\src\Illuminate\Routing\UrlGenerator.php:528
+ - paragraph [ref=e23]: Route [artwork.show] not defined.
+ - generic [ref=e24]:
+ - generic [ref=e25]:
+ - generic [ref=e26]:
+ - generic [ref=e27]: LARAVEL
+ - generic [ref=e28]: 12.53.0
+ - generic [ref=e29]:
+ - generic [ref=e30]: PHP
+ - generic [ref=e31]: 8.4.12
+ - generic [ref=e32]:
+ - img [ref=e33]
+ - text: UNHANDLED
+ - generic [ref=e36]: CODE 0
+ - generic [ref=e38]:
+ - generic [ref=e39]:
+ - img [ref=e40]
+ - text: "500"
+ - generic [ref=e43]:
+ - img [ref=e44]
+ - text: GET
+ - generic [ref=e47]: http://skinbase26.test/explore
+ - button [ref=e48] [cursor=pointer]:
+ - img [ref=e49]
+ - generic [ref=e53]:
+ - generic [ref=e54]:
+ - generic [ref=e55]:
+ - img [ref=e57]
+ - heading "Exception trace" [level=3] [ref=e60]
+ - generic [ref=e61]:
+ - generic [ref=e63] [cursor=pointer]:
+ - img [ref=e64]
+ - generic [ref=e68]: 2 vendor frames
+ - button [ref=e69]:
+ - img [ref=e70]
+ - generic [ref=e74]:
+ - generic [ref=e75] [cursor=pointer]:
+ - generic [ref=e78]:
+ - code [ref=e82]:
+ - generic [ref=e83]: route(string, string)
+ - generic [ref=e85]: resources\views\web\explore\index.blade.php:18
+ - button [ref=e87]:
+ - img [ref=e88]
+ - code [ref=e96]:
+ - generic [ref=e97]: 13 ✦ Featured Today
+ - generic [ref=e98]: 14
+ - generic [ref=e99]: 15
+ - generic [ref=e100]: 16