From 882fd1dcdb89f8c67e4c7d0d2ad1cb15debf26f0 Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Thu, 10 Apr 2025 17:06:39 +0800 Subject: [PATCH 1/3] wip --- .../AddContentSecurityPolicyHeaders.php | 22 ++ .../Generator/LaravelViteNonceGenerator.php | 17 ++ app/Security/Presets/MyCspPreset.php | 45 ++++ app/Security/SecurityPolicyBasic.php | 27 --- bootstrap/app.php | 2 + composer.json | 5 +- composer.lock | 95 ++------ config/blade-icons.php | 183 ---------------- config/csp.php | 48 +++- config/default.php | 107 --------- config/responsecache.php | 2 +- package-lock.json | 206 +++++++++--------- package.json | 2 +- resources/css/app.css | 12 +- resources/fonts/poppins/poppins-regular.woff2 | Bin 0 -> 7884 bytes resources/js/app.js | 2 +- .../views/layouts/_partials/_fathom.blade.php | 4 +- resources/views/layouts/app.blade.php | 10 +- 18 files changed, 256 insertions(+), 533 deletions(-) create mode 100644 app/Http/Middleware/AddContentSecurityPolicyHeaders.php create mode 100644 app/Security/Generator/LaravelViteNonceGenerator.php create mode 100644 app/Security/Presets/MyCspPreset.php delete mode 100644 app/Security/SecurityPolicyBasic.php delete mode 100644 config/blade-icons.php create mode 100644 resources/fonts/poppins/poppins-regular.woff2 diff --git a/app/Http/Middleware/AddContentSecurityPolicyHeaders.php b/app/Http/Middleware/AddContentSecurityPolicyHeaders.php new file mode 100644 index 0000000..e625510 --- /dev/null +++ b/app/Http/Middleware/AddContentSecurityPolicyHeaders.php @@ -0,0 +1,22 @@ +withHeaders([ + 'Content-Security-Policy' => "script-src 'nonce-".Vite::cspNonce()."'", + ]); + } +} diff --git a/app/Security/Generator/LaravelViteNonceGenerator.php b/app/Security/Generator/LaravelViteNonceGenerator.php new file mode 100644 index 0000000..cea3f75 --- /dev/null +++ b/app/Security/Generator/LaravelViteNonceGenerator.php @@ -0,0 +1,17 @@ +add(Directive::BASE, Keyword::SELF); + + $policy->add(Directive::CONNECT, Keyword::SELF); + $policy->add(Directive::DEFAULT, Keyword::SELF); + $policy->add(Directive::FONT, Keyword::SELF); + $policy->add(Directive::FORM_ACTION, Keyword::SELF); + $policy->add(Directive::IMG, [ + Keyword::SELF, + 'data:', + ]); + $policy->add(Directive::MEDIA, Keyword::SELF); + $policy->add(Directive::OBJECT, Keyword::NONE); + + $policy->add(Directive::SCRIPT, [ + Keyword::SELF, + Keyword::UNSAFE_EVAL, + // Keyword::UNSAFE_INLINE, + ]); + + $policy->add(Directive::STYLE, [ + Keyword::SELF, + // Keyword::UNSAFE_EVAL, + Keyword::UNSAFE_INLINE, + ]); + + // Fathom Analytics + $policy->add(Directive::SCRIPT, 'cdn.usefathom.com'); + $policy->add(Directive::CONNECT, 'cdn.usefathom.com'); + $policy->add(Directive::SCRIPT, 'cdn-eu.usefathom.com'); + $policy->add(Directive::CONNECT, 'cdn-eu.usefathom.com'); + } +} diff --git a/app/Security/SecurityPolicyBasic.php b/app/Security/SecurityPolicyBasic.php deleted file mode 100644 index ad87b03..0000000 --- a/app/Security/SecurityPolicyBasic.php +++ /dev/null @@ -1,27 +0,0 @@ -addDirective(Directive::BASE, Keyword::SELF) - ->addDirective(Directive::CONNECT, Config::array('default.security_headers.connect')) - ->addDirective(Directive::DEFAULT, Config::array('default.security_headers.default')) - ->addDirective(Directive::FORM_ACTION, Config::array('default.security_headers.form_action')) - ->addDirective(Directive::IMG, Config::array('default.security_headers.img')) - ->addDirective(Directive::MEDIA, Config::array('default.security_headers.media')) - ->addDirective(Directive::OBJECT, Config::array('default.security_headers.object')) - ->addDirective(Directive::FONT, Config::array('default.security_headers.font')) - ->addDirective(Directive::SCRIPT, Config::array('default.security_headers.script')) - ->addDirective(Directive::STYLE_ELEM, Config::array('default.security_headers.style_elem')) - ->addDirective(Directive::STYLE, Config::array('default.security_headers.style')); - } -} diff --git a/bootstrap/app.php b/bootstrap/app.php index e25cb89..ebd98a3 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,5 +1,6 @@ withMiddleware(function (Middleware $middleware) { $middleware->web(append: [ AddCspHeaders::class, + // AddContentSecurityPolicyHeaders::class, AddFeaturePolicyHeaders::class, SetLanguage::class, CacheResponse::class, diff --git a/composer.json b/composer.json index 363e6df..8754fb3 100644 --- a/composer.json +++ b/composer.json @@ -9,8 +9,6 @@ "license": "MIT", "require": { "php": "^8.4", - "blade-ui-kit/blade-heroicons": "^2.3", - "blade-ui-kit/blade-icons": "^1.6", "codebar-ag/laravel-flysystem-cloudinary": "^v12.0.1", "filament/filament": "^3.3", "laravel/framework": "^v12.1.1", @@ -18,9 +16,8 @@ "league/flysystem-aws-s3-v3": "^3.28", "livewire/livewire": "^3.5", "mazedlx/laravel-feature-policy": "^2.2", - "owenvoke/blade-fontawesome": "^2.6", "sammyjo20/lasso": "3.4.0", - "spatie/laravel-csp": "^2.9", + "spatie/laravel-csp": "^3.8", "spatie/laravel-flash": "^1.10", "spatie/laravel-health": "^1.27", "spatie/laravel-honeypot": "^4.5", diff --git a/composer.lock b/composer.lock index a057e2c..02fa828 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2100039e11d59b6ee310f1a8c000256f", + "content-hash": "67b779edfcfcb2ca0a28f93bea867955", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -4476,66 +4476,6 @@ ], "time": "2025-03-11T14:40:46+00:00" }, - { - "name": "owenvoke/blade-fontawesome", - "version": "v2.9.1", - "source": { - "type": "git", - "url": "https://github.com/owenvoke/blade-fontawesome.git", - "reference": "94dcd0c78f43f8234b0d9c76c903ecd288b8b0d1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/owenvoke/blade-fontawesome/zipball/94dcd0c78f43f8234b0d9c76c903ecd288b8b0d1", - "reference": "94dcd0c78f43f8234b0d9c76c903ecd288b8b0d1", - "shasum": "" - }, - "require": { - "blade-ui-kit/blade-icons": "^1.5", - "illuminate/support": "^10.34|^11.0|^12.0", - "php": "^8.1" - }, - "require-dev": { - "laravel/pint": "^1.13", - "orchestra/testbench": "^8.12|^9.0|^10.0", - "pestphp/pest": "^2.26|^3.7", - "phpstan/phpstan": "^1.10|^2.1", - "symfony/var-dumper": "^6.3|^7.2" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "OwenVoke\\BladeFontAwesome\\BladeFontAwesomeServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "OwenVoke\\BladeFontAwesome\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A package to easily make use of Font Awesome in your Laravel Blade views", - "support": { - "issues": "https://github.com/owenvoke/blade-fontawesome/issues", - "source": "https://github.com/owenvoke/blade-fontawesome/tree/v2.9.1" - }, - "funding": [ - { - "url": "https://ecologi.com/owenvoke?gift-trees", - "type": "custom" - }, - { - "url": "https://github.com/owenvoke", - "type": "github" - } - ], - "time": "2025-03-28T16:03:42+00:00" - }, { "name": "phpoption/phpoption", "version": "1.9.3", @@ -6132,28 +6072,28 @@ }, { "name": "spatie/laravel-csp", - "version": "2.10.3", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-csp.git", - "reference": "15e40c28d46076b3d5a4268b63040b3900cc05d3" + "reference": "395ec40d2e7aa9713af1d45096b73a3a57c7b2c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-csp/zipball/15e40c28d46076b3d5a4268b63040b3900cc05d3", - "reference": "15e40c28d46076b3d5a4268b63040b3900cc05d3", + "url": "https://api.github.com/repos/spatie/laravel-csp/zipball/395ec40d2e7aa9713af1d45096b73a3a57c7b2c4", + "reference": "395ec40d2e7aa9713af1d45096b73a3a57c7b2c4", "shasum": "" }, "require": { - "illuminate/http": "^9.0|^10.0|^11.36.1|^12", - "illuminate/support": "^9.0|^10.0|^11.36.1|^12", - "php": "^8.1", + "illuminate/http": "^11.36.1|^12.0", + "illuminate/support": "^11.36.1|^12.0", + "php": "^8.3", "spatie/laravel-package-tools": "^1.17" }, "require-dev": { - "mockery/mockery": "^1.6.12", - "orchestra/testbench": "^7.0|^8.0|^9.9|^10", - "pestphp/pest": "^1.23.0|^2.36.0|^3", + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.9|^10.0", + "pestphp/pest": "^3.0", "roave/security-advisories": "dev-master" }, "type": "library", @@ -6165,9 +6105,6 @@ } }, "autoload": { - "files": [ - "src/helpers.php" - ], "psr-4": { "Spatie\\Csp\\": "src" } @@ -6188,6 +6125,12 @@ "email": "freek@spatie.be", "homepage": "https://spatie.be", "role": "Developer" + }, + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" } ], "description": "Add CSP headers to the responses of a Laravel app", @@ -6202,7 +6145,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/laravel-csp/tree/2.10.3" + "source": "https://github.com/spatie/laravel-csp/tree/3.8.0" }, "funding": [ { @@ -6210,7 +6153,7 @@ "type": "custom" } ], - "time": "2025-02-14T13:23:32+00:00" + "time": "2025-04-08T13:13:05+00:00" }, { "name": "spatie/laravel-flash", diff --git a/config/blade-icons.php b/config/blade-icons.php deleted file mode 100644 index c892ef5..0000000 --- a/config/blade-icons.php +++ /dev/null @@ -1,183 +0,0 @@ - [ - - // 'default' => [ - // - // /* - // |----------------------------------------------------------------- - // | Icons Path - // |----------------------------------------------------------------- - // | - // | Provide the relative path from your app root to your SVG icons - // | directory. Icons are loaded recursively so there's no need to - // | list every sub-directory. - // | - // | Relative to the disk root when the disk option is set. - // | - // */ - // - // 'path' => 'resources/svg', - // - // /* - // |----------------------------------------------------------------- - // | Filesystem Disk - // |----------------------------------------------------------------- - // | - // | Optionally, provide a specific filesystem disk to read - // | icons from. When defining a disk, the "path" option - // | starts relatively from the disk root. - // | - // */ - // - // 'disk' => '', - // - // /* - // |----------------------------------------------------------------- - // | Default Prefix - // |----------------------------------------------------------------- - // | - // | This config option allows you to define a default prefix for - // | your icons. The dash separator will be applied automatically - // | to every icon name. It's required and needs to be unique. - // | - // */ - // - // 'prefix' => 'icon', - // - // /* - // |----------------------------------------------------------------- - // | Fallback Icon - // |----------------------------------------------------------------- - // | - // | This config option allows you to define a fallback - // | icon when an icon in this set cannot be found. - // | - // */ - // - // 'fallback' => 'far-dot-circle', - // - // /* - // |----------------------------------------------------------------- - // | Default Set Classes - // |----------------------------------------------------------------- - // | - // | This config option allows you to define some classes which - // | will be applied by default to all icons within this set. - // | - // */ - // - // 'class' => '', - // - // /* - // |----------------------------------------------------------------- - // | Default Set Attributes - // |----------------------------------------------------------------- - // | - // | This config option allows you to define some attributes which - // | will be applied by default to all icons within this set. - // | - // */ - // - // 'attributes' => [ - // // 'width' => 50, - // // 'height' => 50, - // ], - // - // ], - - ], - - /* - |-------------------------------------------------------------------------- - | Global Default Classes - |-------------------------------------------------------------------------- - | - | This config option allows you to define some classes which - | will be applied by default to all icons. - | - */ - - 'class' => '', - - /* - |-------------------------------------------------------------------------- - | Global Default Attributes - |-------------------------------------------------------------------------- - | - | This config option allows you to define some attributes which - | will be applied by default to all icons. - | - */ - - 'attributes' => [ - // 'width' => 50, - // 'height' => 50, - ], - - /* - |-------------------------------------------------------------------------- - | Global Fallback Icon - |-------------------------------------------------------------------------- - | - | This config option allows you to define a global fallback - | icon when an icon in any set cannot be found. It can - | reference any icon from any configured set. - | - */ - - 'fallback' => 'far-dot-circle', - - /* - |-------------------------------------------------------------------------- - | Components - |-------------------------------------------------------------------------- - | - | These config options allow you to define some - | settings related to Blade Components. - | - */ - - 'components' => [ - - /* - |---------------------------------------------------------------------- - | Disable Components - |---------------------------------------------------------------------- - | - | This config option allows you to disable Blade components - | completely. It's useful to avoid performance problems - | when working with large icon libraries. - | - */ - - 'disabled' => false, - - /* - |---------------------------------------------------------------------- - | Default Icon Component Name - |---------------------------------------------------------------------- - | - | This config option allows you to define the name - | for the default Icon class component. - | - */ - - 'default' => 'icon', - - ], - -]; diff --git a/config/csp.php b/config/csp.php index 2cd44e8..392267b 100644 --- a/config/csp.php +++ b/config/csp.php @@ -1,36 +1,60 @@ SecurityPolicyBasic::class, + 'presets' => [ + MyCspPreset::class, + ], + + /** + * Register additional global CSP directives here. + */ + 'directives' => [ + ], /* - * This policy which will be put in report only mode. This is great for testing out - * a new policy or changes to existing csp policy without breaking anything. + * These presets which will be put in a report-only policy. This is great for testing out + * a new policy or changes to existing CSP policy without breaking anything. + */ + 'report_only_presets' => [ + // + ], + + /** + * Register additional global report-only CSP directives here. */ - 'report_only_policy' => '', + 'report_only_directives' => [ + // Directive::SCRIPT => [Keyword::UNSAFE_EVAL, Keyword::UNSAFE_INLINE], + ], /* - * All violations against the policy will be reported to this url. + * All violations against a policy will be reported to this url. * A great service you could use for this is https://report-uri.com/ - * - * You can override this setting by calling `reportTo` on your policy. */ 'report_uri' => env('CSP_REPORT_URI', ''), /* * Headers will only be added if this setting is set to true. */ - 'enabled' => env('CSP_ENABLED', true), + 'enabled' => env('CSP_ENABLED', false), /* * The class responsible for generating the nonces used in inline tags and headers. */ - 'nonce_generator' => Spatie\Csp\Nonce\RandomString::class, + 'nonce_generator' => LaravelViteNonceGenerator::class, + + /* + * Set false to disable automatic nonce generation and handling. + * This is useful when you want to use 'unsafe-inline' for scripts/styles + * and cannot add inline nonces. + * Note that this will make your CSP policy less secure. + */ + 'nonce_enabled' => env('CSP_NONCE_ENABLED', true), ]; diff --git a/config/default.php b/config/default.php index ad25605..a4679ea 100644 --- a/config/default.php +++ b/config/default.php @@ -2,16 +2,9 @@ use App\Enums\EnvironmentEnum; use Mazedlx\FeaturePolicy\Value; -use Spatie\Csp\Keyword; return [ - 'cache' => [ - 'production' => 604800, // 1 week - 'staging' => 86400, // 1 day - 'default' => 1, // 1 second - ], - 'services' => [ 'userback' => [ 'url' => env('USERBACK_URL', 'https://static.userback.io/widget/v1.js'), @@ -29,12 +22,6 @@ ], ], - 'auth' => [ - 'providers' => [ - - ], - ], - 'feature_policy' => [ 'camera' => [ Value::SELF, @@ -43,98 +30,4 @@ Value::SELF, ], ], - 'security_headers' => [ - 'connect' => [ - Keyword::SELF, - 'wss:', - 'api.userback.io/', - 'ka-p.fontawesome.com/', - 'res.cloudinary.com/codebar/', - 'prod-s3-public.s3-website-bc01.gos3.io/', - 'unpkg.com/', - env('APP_URL'), - 'srv-dev-space-fra-001.fra1.digitaloceanspaces.com/', - 'srv-dev-space-fra-001.fra1.cdn.digitaloceanspaces.com/', - 'srv-stage-space-fra-001.fra1.digitaloceanspaces.com/', - 'srv-stage-space-fra-001.fra1.cdn.digitaloceanspaces.com/', - 'srv-prod-space-fra-001.fra1.digitaloceanspaces.com/', - 'srv-prod-space-fra-001.fra1.cdn.digitaloceanspaces.com/', - ], - 'default' => [ - Keyword::SELF, - ], - 'form_action' => [ - Keyword::SELF, - ], - 'img' => [ - Keyword::SELF, 'data:', - 'blob:', 'localhost/', - 'prod-s3-public.s3-website-bc01.gos3.io/', - 'cdn.usefathom.com/', - 'cdn-eu.usefathom.com/', - 'www.gravatar.com/avatar/', - 'secure.gravatar.com/avatar/', - 'res.cloudinary.com/codebar/', - env('APP_URL'), - 'srv-dev-space-fra-001.fra1.digitaloceanspaces.com/', - 'srv-dev-space-fra-001.fra1.cdn.digitaloceanspaces.com/', - 'srv-stage-space-fra-001.fra1.digitaloceanspaces.com/', - 'srv-stage-space-fra-001.fra1.cdn.digitaloceanspaces.com/', - 'srv-prod-space-fra-001.fra1.digitaloceanspaces.com/', - 'srv-prod-space-fra-001.fra1.cdn.digitaloceanspaces.com/', - ], - 'media' => [ - Keyword::SELF, - env('APP_URL'), - 'srv-dev-space-fra-001.fra1.digitaloceanspaces.com/', - 'srv-dev-space-fra-001.fra1.cdn.digitaloceanspaces.com/', - 'srv-stage-space-fra-001.fra1.digitaloceanspaces.com/', - 'srv-stage-space-fra-001.fra1.cdn.digitaloceanspaces.com/', - 'srv-prod-space-fra-001.fra1.digitaloceanspaces.com/', - 'srv-prod-space-fra-001.fra1.cdn.digitaloceanspaces.com/', - ], - 'object' => [ - Keyword::NONE, - ], - 'font' => [ - Keyword::SELF, - 'data:', - 'use.typekit.net/', - 'fonts.gstatic.com/', - 'fonts.googleapis.com/'. - 'ka-p.fontawesome.com/', - 'static.userback.io/', - 'rsms.me/inter/font-files/', - 'prod-s3-public.s3-website-bc01.gos3.io/portal-vanta-ch/production', - ], - 'script' => [ - Keyword::SELF, - Keyword::UNSAFE_INLINE, - Keyword::UNSAFE_EVAL, - 'cdn.usefathom.com/', - 'cdn-eu.usefathom.com/', - 'static.userback.io/', - 'kit.fontawesome.com/', - 'cdnjs.cloudflare.com/ajax/libs/dragula/', - 'prod-s3-public.s3-website-bc01.gos3.io/', - 'unpkg.com/', - ], - 'style_elem' => [ - Keyword::SELF, - Keyword::UNSAFE_INLINE, - 'static.userback.io/', - 'fonts.googleapis.com/', - 'fonts.sandbox.google.com/', - 'rsms.me/inter/', - ], - 'style' => [ - Keyword::SELF, - Keyword::UNSAFE_INLINE, - 'static.userback.io/', - 'fonts.sandbox.google.com/', - 'fonts.googleapis.com/'. - 'rsms.me/inter/', - ], - - ], ]; diff --git a/config/responsecache.php b/config/responsecache.php index a3cd9e7..4078784 100644 --- a/config/responsecache.php +++ b/config/responsecache.php @@ -4,7 +4,7 @@ /* * Determine if the response cache middleware should be enabled. */ - 'enabled' => env('RESPONSE_CACHE_ENABLED', true), + 'enabled' => env('RESPONSE_CACHE_ENABLED', false), /* * The given class will determinate if a request should be cached. The diff --git a/package-lock.json b/package-lock.json index 2b962a7..f6504c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -594,6 +594,18 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", + "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.39.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", @@ -654,41 +666,41 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.2.tgz", - "integrity": "sha512-ZwFnxH+1z8Ehh8bNTMX3YFrYdzAv7JLY5X5X7XSFY+G9QGJVce/P9xb2mh+j5hKt8NceuHmdtllJvAHWKtsNrQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.3.tgz", + "integrity": "sha512-H/6r6IPFJkCfBJZ2dKZiPJ7Ueb2wbL592+9bQEl2r73qbX6yGnmQVIfiUvDRB2YI0a3PWDrzUwkvQx1XW1bNkA==", "dependencies": { "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.29.2", - "tailwindcss": "4.1.2" + "tailwindcss": "4.1.3" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.2.tgz", - "integrity": "sha512-Zwz//1QKo6+KqnCKMT7lA4bspGfwEgcPAHlSthmahtgrpKDfwRGk8PKQrW8Zg/ofCDIlg6EtjSTKSxxSufC+CQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.3.tgz", + "integrity": "sha512-t16lpHCU7LBxDe/8dCj9ntyNpXaSTAgxWm1u2XQP5NiIu4KGSyrDJJRlK9hJ4U9yJxx0UKCVI67MJWFNll5mOQ==", "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.2", - "@tailwindcss/oxide-darwin-arm64": "4.1.2", - "@tailwindcss/oxide-darwin-x64": "4.1.2", - "@tailwindcss/oxide-freebsd-x64": "4.1.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.2", - "@tailwindcss/oxide-linux-x64-musl": "4.1.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.2" + "@tailwindcss/oxide-android-arm64": "4.1.3", + "@tailwindcss/oxide-darwin-arm64": "4.1.3", + "@tailwindcss/oxide-darwin-x64": "4.1.3", + "@tailwindcss/oxide-freebsd-x64": "4.1.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.3", + "@tailwindcss/oxide-linux-x64-musl": "4.1.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.3" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.2.tgz", - "integrity": "sha512-IxkXbntHX8lwGmwURUj4xTr6nezHhLYqeiJeqa179eihGv99pRlKV1W69WByPJDQgSf4qfmwx904H6MkQqTA8w==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.3.tgz", + "integrity": "sha512-cxklKjtNLwFl3mDYw4XpEfBY+G8ssSg9ADL4Wm6//5woi3XGqlxFsnV5Zb6v07dxw1NvEX2uoqsxO/zWQsgR+g==", "cpu": [ "arm64" ], @@ -701,9 +713,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.2.tgz", - "integrity": "sha512-ZRtiHSnFYHb4jHKIdzxlFm6EDfijTCOT4qwUhJ3GWxfDoW2yT3z/y8xg0nE7e72unsmSj6dtfZ9Y5r75FIrlpA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.3.tgz", + "integrity": "sha512-mqkf2tLR5VCrjBvuRDwzKNShRu99gCAVMkVsaEOFvv6cCjlEKXRecPu9DEnxp6STk5z+Vlbh1M5zY3nQCXMXhw==", "cpu": [ "arm64" ], @@ -716,9 +728,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.2.tgz", - "integrity": "sha512-BiKUNZf1A0pBNzndBvnPnBxonCY49mgbOsPfILhcCE5RM7pQlRoOgN7QnwNhY284bDbfQSEOWnFR0zbPo6IDTw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.3.tgz", + "integrity": "sha512-7sGraGaWzXvCLyxrc7d+CCpUN3fYnkkcso3rCzwUmo/LteAl2ZGCDlGvDD8Y/1D3ngxT8KgDj1DSwOnNewKhmg==", "cpu": [ "x64" ], @@ -731,9 +743,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.2.tgz", - "integrity": "sha512-Z30VcpUfRGkiddj4l5NRCpzbSGjhmmklVoqkVQdkEC0MOelpY+fJrVhzSaXHmWrmSvnX8yiaEqAbdDScjVujYQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.3.tgz", + "integrity": "sha512-E2+PbcbzIReaAYZe997wb9rId246yDkCwAakllAWSGqe6VTg9hHle67hfH6ExjpV2LSK/siRzBUs5wVff3RW9w==", "cpu": [ "x64" ], @@ -746,9 +758,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.2.tgz", - "integrity": "sha512-w3wsK1ChOLeQ3gFOiwabtWU5e8fY3P1Ss8jR3IFIn/V0va3ir//hZ8AwURveS4oK1Pu6b8i+yxesT4qWnLVUow==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.3.tgz", + "integrity": "sha512-GvfbJ8wjSSjbLFFE3UYz4Eh8i4L6GiEYqCtA8j2Zd2oXriPuom/Ah/64pg/szWycQpzRnbDiJozoxFU2oJZyfg==", "cpu": [ "arm" ], @@ -761,9 +773,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.2.tgz", - "integrity": "sha512-oY/u+xJHpndTj7B5XwtmXGk8mQ1KALMfhjWMMpE8pdVAznjJsF5KkCceJ4Fmn5lS1nHMCwZum5M3/KzdmwDMdw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.3.tgz", + "integrity": "sha512-35UkuCWQTeG9BHcBQXndDOrpsnt3Pj9NVIB4CgNiKmpG8GnCNXeMczkUpOoqcOhO6Cc/mM2W7kaQ/MTEENDDXg==", "cpu": [ "arm64" ], @@ -776,9 +788,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.2.tgz", - "integrity": "sha512-k7G6vcRK/D+JOWqnKzKN/yQq1q4dCkI49fMoLcfs2pVcaUAXEqCP9NmA8Jv+XahBv5DtDjSAY3HJbjosEdKczg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.3.tgz", + "integrity": "sha512-dm18aQiML5QCj9DQo7wMbt1Z2tl3Giht54uVR87a84X8qRtuXxUqnKQkRDK5B4bCOmcZ580lF9YcoMkbDYTXHQ==", "cpu": [ "arm64" ], @@ -791,9 +803,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.2.tgz", - "integrity": "sha512-fLL+c678TkYKgkDLLNxSjPPK/SzTec7q/E5pTwvpTqrth867dftV4ezRyhPM5PaiCqX651Y8Yk0wRQMcWUGnmQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.3.tgz", + "integrity": "sha512-LMdTmGe/NPtGOaOfV2HuO7w07jI3cflPrVq5CXl+2O93DCewADK0uW1ORNAcfu2YxDUS035eY2W38TxrsqngxA==", "cpu": [ "x64" ], @@ -806,9 +818,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.2.tgz", - "integrity": "sha512-0tU1Vjd1WucZ2ooq6y4nI9xyTSaH2g338bhrqk+2yzkMHskBm+pMsOCfY7nEIvALkA1PKPOycR4YVdlV7Czo+A==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.3.tgz", + "integrity": "sha512-aalNWwIi54bbFEizwl1/XpmdDrOaCjRFQRgtbv9slWjmNPuJJTIKPHf5/XXDARc9CneW9FkSTqTbyvNecYAEGw==", "cpu": [ "x64" ], @@ -821,9 +833,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.2.tgz", - "integrity": "sha512-r8QaMo3QKiHqUcn+vXYCypCEha+R0sfYxmaZSgZshx9NfkY+CHz91aS2xwNV/E4dmUDkTPUag7sSdiCHPzFVTg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.3.tgz", + "integrity": "sha512-PEj7XR4OGTGoboTIAdXicKuWl4EQIjKHKuR+bFy9oYN7CFZo0eu74+70O4XuERX4yjqVZGAkCdglBODlgqcCXg==", "cpu": [ "arm64" ], @@ -836,9 +848,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.2.tgz", - "integrity": "sha512-lYCdkPxh9JRHXoBsPE8Pu/mppUsC2xihYArNAESub41PKhHTnvn6++5RpmFM+GLSt3ewyS8fwCVvht7ulWm6cw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.3.tgz", + "integrity": "sha512-T8gfxECWDBENotpw3HR9SmNiHC9AOJdxs+woasRZ8Q/J4VHN0OMs7F+4yVNZ9EVN26Wv6mZbK0jv7eHYuLJLwA==", "cpu": [ "x64" ], @@ -851,15 +863,15 @@ } }, "node_modules/@tailwindcss/postcss": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.2.tgz", - "integrity": "sha512-vgkMo6QRhG6uv97im6Y4ExDdq71y9v2IGZc+0wn7lauQFYJM/1KdUVhrOkexbUso8tUsMOWALxyHVkQEbsM7gw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.3.tgz", + "integrity": "sha512-6s5nJODm98F++QT49qn8xJKHQRamhYHfMi3X7/ltxiSQ9dyRsaFSfFkfaMsanWzf+TMYQtbk8mt5f6cCVXJwfg==", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.2", - "@tailwindcss/oxide": "4.1.2", + "@tailwindcss/node": "4.1.3", + "@tailwindcss/oxide": "4.1.3", "postcss": "^8.4.41", - "tailwindcss": "4.1.2" + "tailwindcss": "4.1.3" } }, "node_modules/@tailwindcss/typography": { @@ -877,13 +889,13 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.2.tgz", - "integrity": "sha512-3r/ZdMW0gxY8uOx1To0lpYa4coq4CzINcCX4laM1rS340Kcn0ac4A/MMFfHN8qba51aorZMYwMcOxYk4wJ9FYg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.3.tgz", + "integrity": "sha512-lUI/QaDxLtlV52Lho6pu07CG9pSnRYLOPmKGIQjyHdTBagemc6HmgZxyjGAQ/5HMPrNeWBfTVIpQl0/jLXvWHQ==", "dependencies": { - "@tailwindcss/node": "4.1.2", - "@tailwindcss/oxide": "4.1.2", - "tailwindcss": "4.1.2" + "@tailwindcss/node": "4.1.3", + "@tailwindcss/oxide": "4.1.3", + "tailwindcss": "4.1.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6" @@ -1032,9 +1044,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001710", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001710.tgz", - "integrity": "sha512-B5C0I0UmaGqHgo5FuqJ7hBd4L57A4dDD+Xi+XX1nXOoxGeDdY4Ko38qJYOyqznBVJEqON5p8P1x5zRR3+rsnxA==", + "version": "1.0.30001713", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", + "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", "funding": [ { "type": "opencollective", @@ -1181,9 +1193,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.132", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.132.tgz", - "integrity": "sha512-QgX9EBvWGmvSRa74zqfnG7+Eno0Ak0vftBll0Pt2/z5b3bEGYL6OUXLgKPtvx73dn3dvwrlyVkjPKRRlhLYTEg==" + "version": "1.5.135", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.135.tgz", + "integrity": "sha512-8gXUdEmvb+WCaYUhA0Svr08uSeRjM2w3x5uHOc1QbaEVzJXB8rgm5eptieXzyKoVEtinLvW6MtTcurA65PeS1Q==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -1642,10 +1654,10 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss-linux-x64-musl": { + "node_modules/lightningcss-linux-x64-gnu": { "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", - "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", "cpu": [ "x64" ], @@ -1661,16 +1673,16 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss-win32-arm64-msvc": { + "node_modules/lightningcss-linux-x64-musl": { "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", - "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", "cpu": [ - "arm64" + "x64" ], "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": ">= 12.0.0" @@ -1680,12 +1692,12 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss-win32-x64-msvc": { + "node_modules/lightningcss-win32-arm64-msvc": { "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", - "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", "cpu": [ - "x64" + "arm64" ], "optional": true, "os": [ @@ -1699,16 +1711,16 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss/node_modules/lightningcss-linux-x64-gnu": { + "node_modules/lightningcss-win32-x64-msvc": { "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", - "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", "cpu": [ "x64" ], "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">= 12.0.0" @@ -1914,18 +1926,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", - "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -1997,9 +1997,9 @@ "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==" }, "node_modules/tailwindcss": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.2.tgz", - "integrity": "sha512-VCsK+fitIbQF7JlxXaibFhxrPq4E2hDcG8apzHUdWFMCQWD8uLdlHg4iSkZ53cgLCCcZ+FZK7vG8VjvLcnBgKw==" + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.3.tgz", + "integrity": "sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g==" }, "node_modules/tapable": { "version": "2.2.1", @@ -2057,9 +2057,9 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/vite": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", - "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", + "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", diff --git a/package.json b/package.json index 73f5c16..8ab8b48 100644 --- a/package.json +++ b/package.json @@ -20,4 +20,4 @@ "vite": "^6.2.5" }, "optionalDependencies": {} -} +} \ No newline at end of file diff --git a/resources/css/app.css b/resources/css/app.css index b4f2e80..ee1f43c 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -14,18 +14,10 @@ font-style: normal; font-weight: 400; font-display: swap; - src: url('/fonts/poppins/poppins-regular.woff2') format('woff2'); -} - -@theme { - --font-sans: 'Poppins', ui-sans-serif, system-ui, sans-serif; -} - -@defaults fontFamily { - sans: var(--font-sans); + src: url('../fonts/poppins/poppins-regular.woff2') format('woff2'); } body { + font-family: 'Poppins', ui-sans-serif, system-ui, sans-serif; @apply text-gray-800; } - diff --git a/resources/fonts/poppins/poppins-regular.woff2 b/resources/fonts/poppins/poppins-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b69e0091c26c46151996a7feec95515567f95ac2 GIT binary patch literal 7884 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 literal 0 HcmV?d00001 diff --git a/resources/js/app.js b/resources/js/app.js index 93a90f0..4274b42 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -3,4 +3,4 @@ import '../css/app.css' import Alpine from 'alpinejs'; window.Alpine = Alpine; -Alpine.start(); +Alpine.start(); \ No newline at end of file diff --git a/resources/views/layouts/_partials/_fathom.blade.php b/resources/views/layouts/_partials/_fathom.blade.php index 5e44216..dd10c80 100644 --- a/resources/views/layouts/_partials/_fathom.blade.php +++ b/resources/views/layouts/_partials/_fathom.blade.php @@ -6,5 +6,5 @@ @endphp @if (in_array(app()->environment(), $environments) && $siteId) - -@endif + +@endif \ No newline at end of file diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index d14313b..b618af1 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -5,13 +5,10 @@ class="scroll-smooth" > - + + From 5a3216ec71fac02630cabcb0e4daee070fbb5b7a Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Thu, 10 Apr 2025 17:09:45 +0800 Subject: [PATCH 2/3] wip --- .../AddContentSecurityPolicyHeaders.php | 8 +------- .../Generator/LaravelViteNonceGenerator.php | 5 +---- tests/Unit/FeaturePolicy/PolicyFactoryTest.php | 18 ------------------ 3 files changed, 2 insertions(+), 29 deletions(-) delete mode 100644 tests/Unit/FeaturePolicy/PolicyFactoryTest.php diff --git a/app/Http/Middleware/AddContentSecurityPolicyHeaders.php b/app/Http/Middleware/AddContentSecurityPolicyHeaders.php index e625510..fb684bd 100644 --- a/app/Http/Middleware/AddContentSecurityPolicyHeaders.php +++ b/app/Http/Middleware/AddContentSecurityPolicyHeaders.php @@ -7,13 +7,7 @@ class AddContentSecurityPolicyHeaders { - /** - * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @return mixed - */ - public function handle($request, Closure $next) + public function handle($request, Closure $next): string { return $next($request)->withHeaders([ 'Content-Security-Policy' => "script-src 'nonce-".Vite::cspNonce()."'", diff --git a/app/Security/Generator/LaravelViteNonceGenerator.php b/app/Security/Generator/LaravelViteNonceGenerator.php index cea3f75..bbff412 100644 --- a/app/Security/Generator/LaravelViteNonceGenerator.php +++ b/app/Security/Generator/LaravelViteNonceGenerator.php @@ -9,9 +9,6 @@ class LaravelViteNonceGenerator implements NonceGenerator { public function generate(): string { - $vite = Vite::cspNonce(); - ray($vite); - - return $vite; + return Vite::cspNonce(); } } diff --git a/tests/Unit/FeaturePolicy/PolicyFactoryTest.php b/tests/Unit/FeaturePolicy/PolicyFactoryTest.php deleted file mode 100644 index 6343c9d..0000000 --- a/tests/Unit/FeaturePolicy/PolicyFactoryTest.php +++ /dev/null @@ -1,18 +0,0 @@ -toBeInstanceOf(FeaturePolicyBasic::class); -}) - ->group('unit', 'policies'); - -it('security header policy factory create', function () { - $policy = SecurityPolicyFactory::create(SecurityPolicyBasic::class); - expect($policy)->toBeInstanceOf(SecurityPolicyBasic::class); -}) - ->group('unit', 'policies'); From 7a5efb1bf54aece9d59389eb2c9c00e3564b91f2 Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Thu, 10 Apr 2025 17:36:57 +0800 Subject: [PATCH 3/3] wip --- app/Security/Presets/MyCspPreset.php | 7 +--- package-lock.json | 33 +++---------------- package.json | 12 +++---- resources/js/app.js | 18 ++++++++-- .../layouts/_partials/_navigation.blade.php | 7 ++-- .../_partials/_navigation_mobile.blade.php | 9 ++--- resources/views/layouts/app.blade.php | 2 -- 7 files changed, 31 insertions(+), 57 deletions(-) diff --git a/app/Security/Presets/MyCspPreset.php b/app/Security/Presets/MyCspPreset.php index 8e871cf..8374d2a 100644 --- a/app/Security/Presets/MyCspPreset.php +++ b/app/Security/Presets/MyCspPreset.php @@ -24,15 +24,10 @@ public function configure(Policy $policy): void $policy->add(Directive::MEDIA, Keyword::SELF); $policy->add(Directive::OBJECT, Keyword::NONE); - $policy->add(Directive::SCRIPT, [ - Keyword::SELF, - Keyword::UNSAFE_EVAL, - // Keyword::UNSAFE_INLINE, - ]); + $policy->add(Directive::SCRIPT, Keyword::SELF); $policy->add(Directive::STYLE, [ Keyword::SELF, - // Keyword::UNSAFE_EVAL, Keyword::UNSAFE_INLINE, ]); diff --git a/package-lock.json b/package-lock.json index f6504c4..c32b1ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,12 +5,11 @@ "packages": { "": { "dependencies": { - "@alpinejs/focus": "^3.14.9", + "@alpinejs/csp": "^3.14.9", "@tailwindcss/forms": "^0.5.10", "@tailwindcss/postcss": "^4.1.2", "@tailwindcss/typography": "^0.5.16", "@tailwindcss/vite": "^4.0.7", - "alpinejs": "^3.14.9", "autoprefixer": "^10.4.21", "axios": "^1.7.4", "concurrently": "^9.0.1", @@ -30,13 +29,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@alpinejs/focus": { + "node_modules/@alpinejs/csp": { "version": "3.14.9", - "resolved": "https://registry.npmjs.org/@alpinejs/focus/-/focus-3.14.9.tgz", - "integrity": "sha512-+OMOcdkyEUr3gYWD0ZVqojLotI9D67F5BxGesDfZcPaGtNifXMoq0vt0UVDivGnXQXosOfNpO++GF4NzGrWE9Q==", + "resolved": "https://registry.npmjs.org/@alpinejs/csp/-/csp-3.14.9.tgz", + "integrity": "sha512-Z/aeDo4Wn4bA4+u77kw9h+nGGW+QzbR2ULTQ1pwOFWk3j2SZtTTI1ZM6FrYOqkFUcwo44e12pY+Y/Va6GTIlFQ==", "dependencies": { - "focus-trap": "^6.9.4", - "tabbable": "^5.3.3" + "@vue/reactivity": "~3.1.1" } }, "node_modules/@esbuild/aix-ppc64": { @@ -919,14 +917,6 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==" }, - "node_modules/alpinejs": { - "version": "3.14.9", - "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.14.9.tgz", - "integrity": "sha512-gqSOhTEyryU9FhviNqiHBHzgjkvtukq9tevew29fTj+ofZtfsYriw4zPirHHOAy9bw8QoL3WGhyk7QqCh5AYlw==", - "dependencies": { - "@vue/reactivity": "~3.1.1" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1302,14 +1292,6 @@ "node": ">=6" } }, - "node_modules/focus-trap": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-6.9.4.tgz", - "integrity": "sha512-v2NTsZe2FF59Y+sDykKY+XjqZ0cPfhq/hikWVL88BqLivnNiEffAsac6rP6H45ff9wG9LL5ToiDqrLEP9GX9mw==", - "dependencies": { - "tabbable": "^5.3.3" - } - }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -1991,11 +1973,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/tabbable": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", - "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==" - }, "node_modules/tailwindcss": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.3.tgz", diff --git a/package.json b/package.json index 8ab8b48..5abfb37 100644 --- a/package.json +++ b/package.json @@ -6,18 +6,16 @@ "build": "vite build" }, "dependencies": { - "axios": "^1.7.4", - "concurrently": "^9.0.1", - "@alpinejs/focus": "^3.14.9", + "@alpinejs/csp": "^3.14.9", "@tailwindcss/forms": "^0.5.10", "@tailwindcss/postcss": "^4.1.2", "@tailwindcss/typography": "^0.5.16", "@tailwindcss/vite": "^4.0.7", - "alpinejs": "^3.14.9", "autoprefixer": "^10.4.21", + "axios": "^1.7.4", + "concurrently": "^9.0.1", "laravel-vite-plugin": "^1.2.0", "tailwindcss": "^4.1.2", "vite": "^6.2.5" - }, - "optionalDependencies": {} -} \ No newline at end of file + } +} diff --git a/resources/js/app.js b/resources/js/app.js index 4274b42..2b1e019 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,6 +1,18 @@ import '../css/app.css' -import Alpine from 'alpinejs'; +import Alpine from '@alpinejs/csp' -window.Alpine = Alpine; -Alpine.start(); \ No newline at end of file +window.Alpine = Alpine + +Alpine.data('navigation', () => ({ + open: false, + toggle() { + this.open = !this.open + }, + + get icon_rotate() { + return this.open ? 'rotate-180' : 'rotate-0' + }, +})) + +Alpine.start() \ No newline at end of file diff --git a/resources/views/layouts/_partials/_navigation.blade.php b/resources/views/layouts/_partials/_navigation.blade.php index 979c6c1..4aa0cb3 100644 --- a/resources/views/layouts/_partials/_navigation.blade.php +++ b/resources/views/layouts/_partials/_navigation.blade.php @@ -1,4 +1,4 @@ -