diff --git a/app/Http/Middleware/AddContentSecurityPolicyHeaders.php b/app/Http/Middleware/AddContentSecurityPolicyHeaders.php new file mode 100644 index 0000000..fb684bd --- /dev/null +++ b/app/Http/Middleware/AddContentSecurityPolicyHeaders.php @@ -0,0 +1,16 @@ +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..bbff412 --- /dev/null +++ b/app/Security/Generator/LaravelViteNonceGenerator.php @@ -0,0 +1,14 @@ +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); + + $policy->add(Directive::STYLE, [ + Keyword::SELF, + 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..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": { @@ -594,6 +592,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 +664,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 +711,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 +726,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 +741,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 +756,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 +771,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 +786,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 +801,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 +816,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 +831,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 +846,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 +861,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 +887,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" @@ -907,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", @@ -1032,9 +1034,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 +1183,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", @@ -1290,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", @@ -1642,10 +1636,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 +1655,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 +1674,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 +1693,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 +1908,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", @@ -1991,15 +1973,10 @@ "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.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 +2034,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..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": {} + } } 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 0000000..b69e009 Binary files /dev/null and b/resources/fonts/poppins/poppins-regular.woff2 differ diff --git a/resources/js/app.js b/resources/js/app.js index 93a90f0..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(); +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/_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/_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 @@ -