From 4faaebdc5956c46f75eebdd2499326d7310666f2 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 23 Dec 2025 14:27:57 +0700 Subject: [PATCH] feat: Implement Inertia.js with React for a new frontend architecture, including home, posts, and profile pages, along with theme customizations. --- .../Controllers/Home/HomepageController.php | 14 + app/Http/Middleware/HandleInertiaRequests.php | 43 + bootstrap/app.php | 5 +- composer.json | 1 + composer.lock | 72 +- package-lock.json | 1582 ++++++++++++++++- package.json | 10 + public/assets/img/logo/icon-with-text.png | Bin 0 -> 53236 bytes resources/css/app.css | 3 +- resources/js/app.js | 1 - resources/js/app.jsx | 31 + resources/js/pages/DashboardPage.jsx | 9 + resources/js/pages/HomePage.jsx | 37 + resources/js/pages/home/components/FAQ.jsx | 153 ++ .../js/pages/home/components/Features.jsx | 262 +++ resources/js/pages/home/components/Footer.jsx | 219 +++ resources/js/pages/home/components/Hero.jsx | 151 ++ .../js/pages/home/components/Highlights.jsx | 120 ++ resources/js/pages/home/components/Logo.jsx | 9 + .../pages/home/components/LogoCollection.jsx | 69 + resources/js/pages/home/components/Navbar.jsx | 142 ++ .../js/pages/home/components/Pricing.jsx | 211 +++ .../js/pages/home/components/Testimonials.jsx | 173 ++ resources/js/pages/layouts/Layout.jsx | 14 + resources/js/pages/posts/CreatePostPage.jsx | 9 + resources/js/pages/posts/EditPostPage.jsx | 9 + resources/js/pages/posts/PostsIndexPage.jsx | 9 + .../pages/posts/components/PublishStatus.jsx | 5 + .../js/pages/posts/helpers/generateSlug.js | 3 + resources/js/pages/profile/ProfilePage.jsx | 9 + .../pages/profile/layouts/ProfileLayout.jsx | 10 + resources/js/pages/theme/AppTheme.jsx | 43 + .../js/pages/theme/ColorModeIconDropdown.jsx | 89 + resources/js/pages/theme/ColorModeSelect.jsx | 27 + .../theme/customizations/dataDisplay.jsx | 233 +++ .../pages/theme/customizations/feedback.jsx | 46 + .../js/pages/theme/customizations/inputs.jsx | 444 +++++ .../pages/theme/customizations/navigation.jsx | 279 +++ .../js/pages/theme/customizations/surfaces.ts | 114 ++ resources/js/pages/theme/themePrimitives.ts | 403 +++++ resources/views/app.blade.php | 15 + routes/web.php | 5 +- vite.config.js | 5 +- 43 files changed, 5051 insertions(+), 37 deletions(-) create mode 100644 app/Http/Controllers/Home/HomepageController.php create mode 100644 app/Http/Middleware/HandleInertiaRequests.php create mode 100644 public/assets/img/logo/icon-with-text.png delete mode 100644 resources/js/app.js create mode 100644 resources/js/app.jsx create mode 100644 resources/js/pages/DashboardPage.jsx create mode 100644 resources/js/pages/HomePage.jsx create mode 100644 resources/js/pages/home/components/FAQ.jsx create mode 100644 resources/js/pages/home/components/Features.jsx create mode 100644 resources/js/pages/home/components/Footer.jsx create mode 100644 resources/js/pages/home/components/Hero.jsx create mode 100644 resources/js/pages/home/components/Highlights.jsx create mode 100644 resources/js/pages/home/components/Logo.jsx create mode 100644 resources/js/pages/home/components/LogoCollection.jsx create mode 100644 resources/js/pages/home/components/Navbar.jsx create mode 100644 resources/js/pages/home/components/Pricing.jsx create mode 100644 resources/js/pages/home/components/Testimonials.jsx create mode 100644 resources/js/pages/layouts/Layout.jsx create mode 100644 resources/js/pages/posts/CreatePostPage.jsx create mode 100644 resources/js/pages/posts/EditPostPage.jsx create mode 100644 resources/js/pages/posts/PostsIndexPage.jsx create mode 100644 resources/js/pages/posts/components/PublishStatus.jsx create mode 100644 resources/js/pages/posts/helpers/generateSlug.js create mode 100644 resources/js/pages/profile/ProfilePage.jsx create mode 100644 resources/js/pages/profile/layouts/ProfileLayout.jsx create mode 100644 resources/js/pages/theme/AppTheme.jsx create mode 100644 resources/js/pages/theme/ColorModeIconDropdown.jsx create mode 100644 resources/js/pages/theme/ColorModeSelect.jsx create mode 100644 resources/js/pages/theme/customizations/dataDisplay.jsx create mode 100644 resources/js/pages/theme/customizations/feedback.jsx create mode 100644 resources/js/pages/theme/customizations/inputs.jsx create mode 100644 resources/js/pages/theme/customizations/navigation.jsx create mode 100644 resources/js/pages/theme/customizations/surfaces.ts create mode 100644 resources/js/pages/theme/themePrimitives.ts create mode 100644 resources/views/app.blade.php diff --git a/app/Http/Controllers/Home/HomepageController.php b/app/Http/Controllers/Home/HomepageController.php new file mode 100644 index 0000000..d15a123 --- /dev/null +++ b/app/Http/Controllers/Home/HomepageController.php @@ -0,0 +1,14 @@ + + */ + public function share(Request $request): array + { + return [ + ...parent::share($request), + // + ]; + } +} diff --git a/bootstrap/app.php b/bootstrap/app.php index c183276..6e19349 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,5 +1,6 @@ withMiddleware(function (Middleware $middleware): void { - // + $middleware->web(append: [ + HandleInertiaRequests::class, + ]); }) ->withExceptions(function (Exceptions $exceptions): void { // diff --git a/composer.json b/composer.json index 1a04483..313bf35 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "bezhansalleh/filament-shield": "^4.0", "filament/filament": "^4.0", "filament/spatie-laravel-media-library-plugin": "^4.0", + "inertiajs/inertia-laravel": "^2.0", "joaopaulolndev/filament-pdf-viewer": "^2.0", "laravel/framework": "^12.0", "laravel/tinker": "^2.10.1", diff --git a/composer.lock b/composer.lock index e359db4..61eac27 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": "c2c5addb8f0b597b5135fc66bf225efd", + "content-hash": "a1f1369a3464148f2f165f2d8a1aeadc", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -2305,6 +2305,76 @@ ], "time": "2025-08-22T14:27:06+00:00" }, + { + "name": "inertiajs/inertia-laravel", + "version": "v2.0.16", + "source": { + "type": "git", + "url": "https://github.com/inertiajs/inertia-laravel.git", + "reference": "c060177e1b5120e70d1c26fe7c1007a8c8238f0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/c060177e1b5120e70d1c26fe7c1007a8c8238f0d", + "reference": "c060177e1b5120e70d1c26fe7c1007a8c8238f0d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel/framework": "^10.0|^11.0|^12.0", + "php": "^8.1.0", + "symfony/console": "^6.2|^7.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.2", + "larastan/larastan": "^3.0", + "laravel/pint": "^1.16", + "mockery/mockery": "^1.3.3", + "orchestra/testbench": "^8.0|^9.2|^10.0", + "phpunit/phpunit": "^10.4|^11.5", + "roave/security-advisories": "dev-master" + }, + "suggest": { + "ext-pcntl": "Recommended when running the Inertia SSR server via the `inertia:start-ssr` artisan command." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Inertia\\ServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./helpers.php" + ], + "psr-4": { + "Inertia\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "homepage": "https://reinink.ca" + } + ], + "description": "The Laravel adapter for Inertia.js.", + "keywords": [ + "inertia", + "laravel" + ], + "support": { + "issues": "https://github.com/inertiajs/inertia-laravel/issues", + "source": "https://github.com/inertiajs/inertia-laravel/tree/v2.0.16" + }, + "time": "2025-12-17T21:57:59+00:00" + }, { "name": "joaopaulolndev/filament-pdf-viewer", "version": "v2.0.0", diff --git a/package-lock.json b/package-lock.json index f9d30fd..3ec7e57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,8 +4,18 @@ "requires": true, "packages": { "": { + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@inertiajs/react": "^2.3.4", + "@mui/icons-material": "^7.3.6", + "@mui/material": "^7.3.6", + "react": "^19.2.3", + "react-dom": "^19.2.3" + }, "devDependencies": { "@tailwindcss/vite": "^4.1.18", + "@vitejs/plugin-react": "^5.1.2", "axios": "^1.11.0", "concurrently": "^9.0.1", "laravel-vite-plugin": "^2.0.0", @@ -13,6 +23,439 @@ "vite": "^7.0.7" } }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", @@ -455,11 +898,39 @@ "node": ">=18" } }, + "node_modules/@inertiajs/core": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-2.3.4.tgz", + "integrity": "sha512-wSkSLL/8+oZigUZIxyd0mizHKxu/C0V7hUyNz+siFeaVSeLkOUU51OxihqLr9Y9gtN9gFGSmhihNjdXkOedDTw==", + "license": "MIT", + "dependencies": { + "@types/lodash-es": "^4.17.12", + "axios": "^1.13.2", + "laravel-precognition": "^1.0.0", + "lodash-es": "^4.17.21", + "qs": "^6.14.0" + } + }, + "node_modules/@inertiajs/react": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@inertiajs/react/-/react-2.3.4.tgz", + "integrity": "sha512-nQPYuUodqRjCdWmKYkthzUFFcDJM32WzG5vzvmELO/6ovwv2VO4x2m5eDvFBJ8KGsUEv7eHD8jdo1tnGAQx1Ng==", + "license": "MIT", + "dependencies": { + "@inertiajs/core": "2.3.4", + "@types/lodash-es": "^4.17.12", + "laravel-precognition": "^1.0.0", + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -481,7 +952,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -491,20 +961,268 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mui/core-downloads-tracker": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.6.tgz", + "integrity": "sha512-QaYtTHlr8kDFN5mE1wbvVARRKH7Fdw1ZuOjBJcFdVpfNfRYKF3QLT4rt+WaB6CKJvpqxRsmEo0kpYinhH5GeHg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.3.6.tgz", + "integrity": "sha512-0FfkXEj22ysIq5pa41A2NbcAhJSvmcZQ/vcTIbjDsd6hlslG82k5BEBqqS0ZJprxwIL3B45qpJ+bPHwJPlF7uQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^7.3.6", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.6.tgz", + "integrity": "sha512-R4DaYF3dgCQCUAkr4wW1w26GHXcf5rCmBRHVBuuvJvaGLmZdD8EjatP80Nz5JCw0KxORAzwftnHzXVnjR8HnFw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/core-downloads-tracker": "^7.3.6", + "@mui/system": "^7.3.6", + "@mui/types": "^7.4.9", + "@mui/utils": "^7.3.6", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^7.3.6", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.6.tgz", + "integrity": "sha512-Ws9wZpqM+FlnbZXaY/7yvyvWQo1+02Tbx50mVdNmzWEi51C51y56KAbaDCYyulOOBL6BJxuaqG8rNNuj7ivVyw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/utils": "^7.3.6", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.6.tgz", + "integrity": "sha512-+wiYbtvj+zyUkmDB+ysH6zRjuQIJ+CM56w0fEXV+VDNdvOuSywG+/8kpjddvvlfMLsaWdQe5oTuYGBcodmqGzQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.6.tgz", + "integrity": "sha512-8fehAazkHNP1imMrdD2m2hbA9sl7Ur6jfuNweh5o4l9YPty4iaZzRXqYvBCWQNwFaSHmMEj2KPbyXGp7Bt73Rg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/private-theming": "^7.3.6", + "@mui/styled-engine": "^7.3.6", + "@mui/types": "^7.4.9", + "@mui/utils": "^7.3.6", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.4.9", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.9.tgz", + "integrity": "sha512-dNO8Z9T2cujkSIaCnWwprfeKmTWh97cnjkgmpFJ2sbfXLx8SMZijCYHOtP/y5nnUb/Rm2omxbDMmtUoSaUtKaw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.6.tgz", + "integrity": "sha512-jn+Ba02O6PiFs7nKva8R2aJJ9kJC+3kQ2R0BbKNY3KQQ36Qng98GnPRFTlbwYTdMD6hLEBKaMLUktyg/rTfd2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/types": "^7.4.9", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.54.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz", @@ -1085,6 +1803,51 @@ "vite": "^5.2.0 || ^6 || ^7" } }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1092,6 +1855,73 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", + "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", + "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.5", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.53", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1122,14 +1952,12 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, "license": "MIT" }, "node_modules/axios": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "dev": true, "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -1137,11 +1965,69 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -1151,6 +2037,52 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001761", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", + "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1196,6 +2128,15 @@ "node": ">=12" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1220,7 +2161,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -1254,11 +2194,65 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -1274,11 +2268,20 @@ "node": ">=8" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -1289,6 +2292,13 @@ "node": ">= 0.4" } }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1310,11 +2320,19 @@ "node": ">=10.13.0" } }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1324,7 +2342,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1334,7 +2351,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -1347,7 +2363,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -1411,6 +2426,18 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -1429,11 +2456,16 @@ } } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, "node_modules/follow-redirects": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "dev": true, "funding": [ { "type": "individual", @@ -1454,7 +2486,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -1486,12 +2517,21 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1506,7 +2546,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -1531,7 +2570,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -1545,7 +2583,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1575,7 +2612,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1588,7 +2624,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -1604,7 +2639,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -1613,6 +2647,58 @@ "node": ">= 0.4" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -1633,6 +2719,53 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/laravel-precognition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/laravel-precognition/-/laravel-precognition-1.0.0.tgz", + "integrity": "sha512-hvXPT7dayCQAidxnsY0hab9Q+Y2rsh7xRpH9uiFtXN8Dekc3tIZt+NrxrOZ9N5SwHBmRBze/Bv+ElfXac0kD6g==", + "license": "MIT", + "dependencies": { + "axios": "^1.4.0", + "lodash-es": "^4.17.21" + } + }, "node_modules/laravel-vite-plugin": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-2.0.1.tgz", @@ -1914,6 +3047,40 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", + "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -1928,7 +3095,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1938,7 +3104,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -1948,7 +3113,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -1957,6 +3121,12 @@ "node": ">= 0.6" } }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -1976,11 +3146,83 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -2025,13 +3267,97 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true, "license": "MIT" }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/react": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.3" + } + }, + "node_modules/react-is": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.3.tgz", + "integrity": "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2042,6 +3368,35 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/rollup": { "version": "4.54.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", @@ -2094,6 +3449,22 @@ "tslib": "^2.1.0" } }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/shell-quote": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", @@ -2107,6 +3478,87 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2145,6 +3597,12 @@ "node": ">=8" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -2161,6 +3619,18 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tailwindcss": { "version": "4.1.18", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", @@ -2216,6 +3686,37 @@ "dev": true, "license": "0BSD" }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/vite": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", @@ -2343,6 +3844,31 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index 15fa318..c2e78c5 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,20 @@ }, "devDependencies": { "@tailwindcss/vite": "^4.1.18", + "@vitejs/plugin-react": "^5.1.2", "axios": "^1.11.0", "concurrently": "^9.0.1", "laravel-vite-plugin": "^2.0.0", "tailwindcss": "^4.1.18", "vite": "^7.0.7" + }, + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@inertiajs/react": "^2.3.4", + "@mui/icons-material": "^7.3.6", + "@mui/material": "^7.3.6", + "react": "^19.2.3", + "react-dom": "^19.2.3" } } diff --git a/public/assets/img/logo/icon-with-text.png b/public/assets/img/logo/icon-with-text.png new file mode 100644 index 0000000000000000000000000000000000000000..43252df1db6d9dbabe610e917ba7d999b0e2881d GIT binary patch literal 53236 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 literal 0 HcmV?d00001 diff --git a/resources/css/app.css b/resources/css/app.css index 3e6abea..73fedbc 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -4,8 +4,9 @@ @source '../../storage/framework/views/*.php'; @source '../**/*.blade.php'; @source '../**/*.js'; +@source '../**/*.jsx'; @theme { --font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; -} +} \ No newline at end of file diff --git a/resources/js/app.js b/resources/js/app.js deleted file mode 100644 index e59d6a0..0000000 --- a/resources/js/app.js +++ /dev/null @@ -1 +0,0 @@ -import './bootstrap'; diff --git a/resources/js/app.jsx b/resources/js/app.jsx new file mode 100644 index 0000000..d116564 --- /dev/null +++ b/resources/js/app.jsx @@ -0,0 +1,31 @@ +import '../css/app.css' +import React from 'react' +import { createInertiaApp } from '@inertiajs/react' +import { createRoot } from 'react-dom/client' + +createInertiaApp({ + resolve: name => { + const pages = import.meta.glob('./pages/**/*.jsx', { eager: true }) + return pages[`./pages/${name}.jsx`] + }, + setup({ el, App, props }) { + createRoot(el).render() + }, + defaults: { + form: { + recentlySuccessfulDuration: 5000, + }, + prefetch: { + cacheFor: "1m", + hoverDelay: 150, + }, + visitOptions: (href, options) => { + return { + headers: { + ...options.headers, + "X-Custom-Header": "value", + }, + }; + }, + }, +}) diff --git a/resources/js/pages/DashboardPage.jsx b/resources/js/pages/DashboardPage.jsx new file mode 100644 index 0000000..8fad587 --- /dev/null +++ b/resources/js/pages/DashboardPage.jsx @@ -0,0 +1,9 @@ +import React from 'react'; + +export default function DashboardPage() { + return ( +
+

Dashboard

+
+ ); +} diff --git a/resources/js/pages/HomePage.jsx b/resources/js/pages/HomePage.jsx new file mode 100644 index 0000000..50913dc --- /dev/null +++ b/resources/js/pages/HomePage.jsx @@ -0,0 +1,37 @@ +import CssBaseline from '@mui/material/CssBaseline'; +import Divider from '@mui/material/Divider'; +import AppTheme from './theme/AppTheme'; +import Hero from './home/components/Hero'; +import LogoCollection from './home/components/LogoCollection'; +import Highlights from './home/components/Highlights'; +import Pricing from './home/components/Pricing'; +import Features from './home/components/Features'; +import Testimonials from './home/components/Testimonials'; +import FAQ from './home/components/FAQ'; +import Footer from './home/components/Footer'; +import Navbar from './home/components/Navbar'; + +export default function HomePage() { + return ( + + + + + +
+ + + + + + + + + + + +
+
+
+ ); +} diff --git a/resources/js/pages/home/components/FAQ.jsx b/resources/js/pages/home/components/FAQ.jsx new file mode 100644 index 0000000..8239d65 --- /dev/null +++ b/resources/js/pages/home/components/FAQ.jsx @@ -0,0 +1,153 @@ +import * as React from 'react'; +import Accordion from '@mui/material/Accordion'; +import AccordionDetails from '@mui/material/AccordionDetails'; +import AccordionSummary from '@mui/material/AccordionSummary'; +import Box from '@mui/material/Box'; +import Container from '@mui/material/Container'; +import Link from '@mui/material/Link'; +import Typography from '@mui/material/Typography'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; + +export default function FAQ() { + const [expanded, setExpanded] = React.useState([]); + + const handleChange = + (panel) => (event, isExpanded) => { + setExpanded( + isExpanded + ? [...expanded, panel] + : expanded.filter((item) => item !== panel), + ); + }; + + return ( + + + Frequently asked questions + + + + } + aria-controls="panel1d-content" + id="panel1d-header" + > + + How do I contact customer support if I have a question or issue? + + + + + You can reach our customer support team by emailing  + support@email.com +  or calling our toll-free number. We're here to assist you + promptly. + + + + + } + aria-controls="panel2d-content" + id="panel2d-header" + > + + Can I return the product if it doesn't meet my expectations? + + + + + Absolutely! We offer a hassle-free return policy. If you're not + completely satisfied, you can return the product within [number of + days] days for a full refund or exchange. + + + + + } + aria-controls="panel3d-content" + id="panel3d-header" + > + + What makes your product stand out from others in the market? + + + + + Our product distinguishes itself through its adaptability, durability, + and innovative features. We prioritize user satisfaction and + continually strive to exceed expectations in every aspect. + + + + + } + aria-controls="panel4d-content" + id="panel4d-header" + > + + Is there a warranty on the product, and what does it cover? + + + + + Yes, our product comes with a [length of warranty] warranty. It covers + defects in materials and workmanship. If you encounter any issues + covered by the warranty, please contact our customer support for + assistance. + + + + + + ); +} diff --git a/resources/js/pages/home/components/Features.jsx b/resources/js/pages/home/components/Features.jsx new file mode 100644 index 0000000..61b9337 --- /dev/null +++ b/resources/js/pages/home/components/Features.jsx @@ -0,0 +1,262 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import MuiChip from '@mui/material/Chip'; +import Container from '@mui/material/Container'; +import Typography from '@mui/material/Typography'; +import { styled } from '@mui/material/styles'; + +import DevicesRoundedIcon from '@mui/icons-material/DevicesRounded'; +import EdgesensorHighRoundedIcon from '@mui/icons-material/EdgesensorHighRounded'; +import ViewQuiltRoundedIcon from '@mui/icons-material/ViewQuiltRounded'; + +const items = [ + { + icon: , + title: 'Dashboard', + description: + 'This item could provide a snapshot of the most important metrics or data points related to the product.', + imageLight: `url("${import.meta.env.TEMPLATE_IMAGE_URL || 'https://mui.com'}/static/images/templates/templates-images/dash-light.png")`, + imageDark: `url("${import.meta.env.TEMPLATE_IMAGE_URL || 'https://mui.com'}/static/images/templates/templates-images/dash-dark.png")`, + }, + { + icon: , + title: 'Mobile integration', + description: + 'This item could provide information about the mobile app version of the product.', + imageLight: `url("${import.meta.env.TEMPLATE_IMAGE_URL || 'https://mui.com'}/static/images/templates/templates-images/mobile-light.png")`, + imageDark: `url("${import.meta.env.TEMPLATE_IMAGE_URL || 'https://mui.com'}/static/images/templates/templates-images/mobile-dark.png")`, + }, + { + icon: , + title: 'Available on all platforms', + description: + 'This item could let users know the product is available on all platforms, such as web, mobile, and desktop.', + imageLight: `url("${import.meta.env.TEMPLATE_IMAGE_URL || 'https://mui.com'}/static/images/templates/templates-images/devices-light.png")`, + imageDark: `url("${import.meta.env.TEMPLATE_IMAGE_URL || 'https://mui.com'}/static/images/templates/templates-images/devices-dark.png")`, + }, +]; + +const Chip = styled(MuiChip)(({ theme }) => ({ + variants: [ + { + props: ({ selected }) => !!selected, + style: { + background: + 'linear-gradient(to bottom right, hsl(210, 98%, 48%), hsl(210, 98%, 35%))', + color: 'hsl(0, 0%, 100%)', + borderColor: (theme.vars || theme).palette.primary.light, + '& .MuiChip-label': { + color: 'hsl(0, 0%, 100%)', + }, + ...theme.applyStyles('dark', { + borderColor: (theme.vars || theme).palette.primary.dark, + }), + }, + }, + ], +})); + +export function MobileLayout({ + selectedItemIndex, + handleItemClick, + selectedFeature, +}) { + if (!items[selectedItemIndex]) { + return null; + } + + return ( + + + {items.map(({ title }, index) => ( + handleItemClick(index)} + selected={selectedItemIndex === index} + /> + ))} + + + ({ + mb: 2, + backgroundSize: 'cover', + backgroundPosition: 'center', + minHeight: 280, + backgroundImage: 'var(--items-imageLight)', + ...theme.applyStyles('dark', { + backgroundImage: 'var(--items-imageDark)', + }), + })} + style={ + items[selectedItemIndex] + ? ({ + '--items-imageLight': items[selectedItemIndex].imageLight, + '--items-imageDark': items[selectedItemIndex].imageDark, + }) + : {} + } + /> + + + {selectedFeature.title} + + + {selectedFeature.description} + + + + + ); +} + +export default function Features() { + const [selectedItemIndex, setSelectedItemIndex] = React.useState(0); + + const handleItemClick = (index) => { + setSelectedItemIndex(index); + }; + + const selectedFeature = items[selectedItemIndex]; + + return ( + + + + Product features + + + Provide a brief overview of the key features of the product. For example, + you could list the number of features, their types or benefits, and + add-ons. + + + +
+ + {items.map(({ icon, title, description }, index) => ( + handleItemClick(index)} + sx={[ + (theme) => ({ + p: 2, + height: '100%', + width: '100%', + '&:hover': { + backgroundColor: (theme.vars || theme).palette.action.hover, + }, + }), + selectedItemIndex === index && { + backgroundColor: 'action.selected', + }, + ]} + > + + {icon} + + {title} + {description} + + + ))} + + +
+ + + ({ + m: 'auto', + width: 420, + height: 500, + backgroundSize: 'contain', + backgroundImage: 'var(--items-imageLight)', + ...theme.applyStyles('dark', { + backgroundImage: 'var(--items-imageDark)', + }), + })} + style={ + items[selectedItemIndex] + ? ({ + '--items-imageLight': items[selectedItemIndex].imageLight, + '--items-imageDark': items[selectedItemIndex].imageDark, + }) + : {} + } + /> + + +
+
+ ); +} diff --git a/resources/js/pages/home/components/Footer.jsx b/resources/js/pages/home/components/Footer.jsx new file mode 100644 index 0000000..1296015 --- /dev/null +++ b/resources/js/pages/home/components/Footer.jsx @@ -0,0 +1,219 @@ +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Container from '@mui/material/Container'; +import IconButton from '@mui/material/IconButton'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import TextField from '@mui/material/TextField'; +import Typography from '@mui/material/Typography'; +import GitHubIcon from '@mui/icons-material/GitHub'; +import LinkedInIcon from '@mui/icons-material/LinkedIn'; +import TwitterIcon from '@mui/icons-material/X'; +import Logo from './Logo'; + +function Copyright() { + return ( + + {'Copyright © '} + + Logo + +   + {new Date().getFullYear()} + + ); +} + +export default function Footer() { + return ( + + + + + + + Join the newsletter + + + Subscribe for weekly updates. No spams ever! + + Email + + + + + + + + + Product + + + Features + + + Testimonials + + + Highlights + + + Pricing + + + FAQs + + + + + Company + + + About us + + + Careers + + + Press + + + + + Legal + + + Terms + + + Privacy + + + Contact + + + + +
+ + Privacy Policy + + +  â€¢  + + + Terms of Service + + +
+ + + + + + + + + + + +
+
+ ); +} diff --git a/resources/js/pages/home/components/Hero.jsx b/resources/js/pages/home/components/Hero.jsx new file mode 100644 index 0000000..7f7c9d2 --- /dev/null +++ b/resources/js/pages/home/components/Hero.jsx @@ -0,0 +1,151 @@ +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Container from '@mui/material/Container'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import TextField from '@mui/material/TextField'; +import Typography from '@mui/material/Typography'; +import visuallyHidden from '@mui/utils/visuallyHidden'; +import { styled } from '@mui/material/styles'; + +const StyledBox = styled('div')(({ theme }) => ({ + alignSelf: 'center', + width: '100%', + height: 400, + marginTop: theme.spacing(8), + borderRadius: (theme.vars || theme).shape.borderRadius, + outline: '6px solid', + outlineColor: 'hsla(220, 25%, 80%, 0.2)', + border: '1px solid', + borderColor: (theme.vars || theme).palette.grey[200], + boxShadow: '0 0 12px 8px hsla(220, 25%, 80%, 0.2)', + backgroundImage: `url(${import.meta.env.TEMPLATE_IMAGE_URL || 'https://mui.com'}/static/screenshots/material-ui/getting-started/templates/dashboard.jpg)`, + backgroundSize: 'cover', + [theme.breakpoints.up('sm')]: { + marginTop: theme.spacing(10), + height: 700, + }, + ...theme.applyStyles('dark', { + boxShadow: '0 0 24px 12px hsla(210, 100%, 25%, 0.2)', + backgroundImage: `url(${import.meta.env.TEMPLATE_IMAGE_URL || 'https://mui.com'}/static/screenshots/material-ui/getting-started/templates/dashboard-dark.jpg)`, + outlineColor: 'hsla(220, 20%, 42%, 0.1)', + borderColor: (theme.vars || theme).palette.grey[700], + }), +})); + +export default function Hero() { + return ( + ({ + width: '100%', + backgroundRepeat: 'no-repeat', + + backgroundImage: + 'radial-gradient(ellipse 80% 50% at 50% -20%, hsl(210, 100%, 90%), transparent)', + ...theme.applyStyles('dark', { + backgroundImage: + 'radial-gradient(ellipse 80% 50% at 50% -20%, hsl(210, 100%, 16%), transparent)', + }), + })} + > + + + + Our latest  + ({ + fontSize: 'inherit', + color: 'primary.main', + ...theme.applyStyles('dark', { + color: 'primary.light', + }), + })} + > + products + + + + Explore our cutting-edge dashboard, delivering high-quality solutions + tailored to your needs. Elevate your experience with top-tier features + and services. + + + + Email + + + + + + By clicking "Start now" you agree to our  + + Terms & Conditions + + . + + + + + + ); +} diff --git a/resources/js/pages/home/components/Highlights.jsx b/resources/js/pages/home/components/Highlights.jsx new file mode 100644 index 0000000..1ee0408 --- /dev/null +++ b/resources/js/pages/home/components/Highlights.jsx @@ -0,0 +1,120 @@ +import Box from '@mui/material/Box'; +import Card from '@mui/material/Card'; +import Container from '@mui/material/Container'; +import Grid from '@mui/material/Grid'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import AutoFixHighRoundedIcon from '@mui/icons-material/AutoFixHighRounded'; +import ConstructionRoundedIcon from '@mui/icons-material/ConstructionRounded'; +import QueryStatsRoundedIcon from '@mui/icons-material/QueryStatsRounded'; +import SettingsSuggestRoundedIcon from '@mui/icons-material/SettingsSuggestRounded'; +import SupportAgentRoundedIcon from '@mui/icons-material/SupportAgentRounded'; +import ThumbUpAltRoundedIcon from '@mui/icons-material/ThumbUpAltRounded'; + +const items = [ + { + icon: , + title: 'Adaptable performance', + description: + 'Our product effortlessly adjusts to your needs, boosting efficiency and simplifying your tasks.', + }, + { + icon: , + title: 'Built to last', + description: + 'Experience unmatched durability that goes above and beyond with lasting investment.', + }, + { + icon: , + title: 'Great user experience', + description: + 'Integrate our product into your routine with an intuitive and easy-to-use interface.', + }, + { + icon: , + title: 'Innovative functionality', + description: + 'Stay ahead with features that set new standards, addressing your evolving needs better than the rest.', + }, + { + icon: , + title: 'Reliable support', + description: + 'Count on our responsive customer support, offering assistance that goes beyond the purchase.', + }, + { + icon: , + title: 'Precision in every detail', + description: + 'Enjoy a meticulously crafted product where small touches make a significant impact on your overall experience.', + }, +]; + +export default function Highlights() { + return ( + + + + + Highlights + + + Explore why our product stands out: adaptability, durability, + user-friendly design, and innovation. Enjoy reliable customer support and + precision in every detail. + + + + {items.map((item, index) => ( + + + {item.icon} +
+ + {item.title} + + + {item.description} + +
+
+
+ ))} +
+
+
+ ); +} diff --git a/resources/js/pages/home/components/Logo.jsx b/resources/js/pages/home/components/Logo.jsx new file mode 100644 index 0000000..3615203 --- /dev/null +++ b/resources/js/pages/home/components/Logo.jsx @@ -0,0 +1,9 @@ +export default function Logo() { + return ( + Logo + ); +} diff --git a/resources/js/pages/home/components/LogoCollection.jsx b/resources/js/pages/home/components/LogoCollection.jsx new file mode 100644 index 0000000..2f95272 --- /dev/null +++ b/resources/js/pages/home/components/LogoCollection.jsx @@ -0,0 +1,69 @@ +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Grid'; +import { useColorScheme } from '@mui/material/styles'; + +const darkModeLogos = [ + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560628e8573c43893fe0ace_Sydney-white.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f4d520d0517ae8e8ddf13_Bern-white.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f46794c159024c1af6d44_Montreal-white.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/61f12e891fa22f89efd7477a_TerraLight.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560a09d1f6337b1dfed14ab_colorado-white.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f5caa77bf7d69fb78792e_Ankara-white.svg', +]; + +const lightModeLogos = [ + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560628889c3bdf1129952dc_Sydney-black.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f4d4d8b829a89976a419c_Bern-black.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f467502f091ccb929529d_Montreal-black.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/61f12e911fa22f2203d7514c_TerraDark.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560a0990f3717787fd49245_colorado-black.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f5ca4e548b0deb1041c33_Ankara-black.svg', +]; + +const logoStyle = { + width: '100px', + height: '80px', + margin: '0 32px', + opacity: 0.7, +}; + +export default function LogoCollection() { + const { mode, systemMode } = useColorScheme(); + let logos; + if (mode === 'system') { + if (systemMode === 'light') { + logos = lightModeLogos; + } else { + logos = darkModeLogos; + } + } else if (mode === 'light') { + logos = lightModeLogos; + } else { + logos = darkModeLogos; + } + + return ( + + + Trusted by the best companies + + + {logos.map((logo, index) => ( + + {`Fake + + ))} + + + ); +} diff --git a/resources/js/pages/home/components/Navbar.jsx b/resources/js/pages/home/components/Navbar.jsx new file mode 100644 index 0000000..9c52ce7 --- /dev/null +++ b/resources/js/pages/home/components/Navbar.jsx @@ -0,0 +1,142 @@ +import * as React from 'react'; +import { styled, alpha } from '@mui/material/styles'; +import Box from '@mui/material/Box'; +import AppBar from '@mui/material/AppBar'; +import Toolbar from '@mui/material/Toolbar'; +import Button from '@mui/material/Button'; +import IconButton from '@mui/material/IconButton'; +import Container from '@mui/material/Container'; +import Divider from '@mui/material/Divider'; +import MenuItem from '@mui/material/MenuItem'; +import Drawer from '@mui/material/Drawer'; +import MenuIcon from '@mui/icons-material/Menu'; +import CloseRoundedIcon from '@mui/icons-material/CloseRounded'; +import ColorModeIconDropdown from '../../theme/ColorModeIconDropdown'; +import Logo from './Logo'; + +const StyledToolbar = styled(Toolbar)(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + flexShrink: 0, + borderRadius: `calc(${theme.shape.borderRadius}px + 8px)`, + backdropFilter: 'blur(24px)', + border: '1px solid', + borderColor: (theme.vars || theme).palette.divider, + backgroundColor: theme.vars + ? `rgba(${theme.vars.palette.background.defaultChannel} / 0.4)` + : alpha(theme.palette.background.default, 0.4), + boxShadow: (theme.vars || theme).shadows[1], + padding: '8px 12px', +})); + +export default function Navbar() { + const [open, setOpen] = React.useState(false); + + const toggleDrawer = (newOpen) => () => { + setOpen(newOpen); + }; + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Features + Testimonials + Highlights + Pricing + FAQ + Blog + + + + + + + + + + + + + + ); +} diff --git a/resources/js/pages/home/components/Pricing.jsx b/resources/js/pages/home/components/Pricing.jsx new file mode 100644 index 0000000..c8dcda4 --- /dev/null +++ b/resources/js/pages/home/components/Pricing.jsx @@ -0,0 +1,211 @@ +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import Chip from '@mui/material/Chip'; +import CardActions from '@mui/material/CardActions'; +import CardContent from '@mui/material/CardContent'; +import Container from '@mui/material/Container'; +import Divider from '@mui/material/Divider'; +import Grid from '@mui/material/Grid'; +import Typography from '@mui/material/Typography'; +import AutoAwesomeIcon from '@mui/icons-material/AutoAwesome'; +import CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded'; + +const tiers = [ + { + title: 'Free', + price: '0', + description: [ + '10 users included', + '2 GB of storage', + 'Help center access', + 'Email support', + ], + buttonText: 'Sign up for free', + buttonVariant: 'outlined', + buttonColor: 'primary', + }, + { + title: 'Professional', + subheader: 'Recommended', + price: '15', + description: [ + '20 users included', + '10 GB of storage', + 'Help center access', + 'Priority email support', + 'Dedicated team', + 'Best deals', + ], + buttonText: 'Start now', + buttonVariant: 'contained', + buttonColor: 'secondary', + }, + { + title: 'Enterprise', + price: '30', + description: [ + '50 users included', + '30 GB of storage', + 'Help center access', + 'Phone & email support', + ], + buttonText: 'Contact us', + buttonVariant: 'outlined', + buttonColor: 'primary', + }, +]; + +export default function Pricing() { + return ( + + + + Pricing + + + Quickly build an effective pricing table for your potential customers with + this layout.
+ It's built with default Material UI components with little + customization. +
+
+ + {tiers.map((tier) => ( + + ({ + border: 'none', + background: + 'radial-gradient(circle at 50% 0%, hsl(220, 20%, 35%), hsl(220, 30%, 6%))', + boxShadow: `0 8px 12px hsla(220, 20%, 42%, 0.2)`, + ...theme.applyStyles('dark', { + background: + 'radial-gradient(circle at 50% 0%, hsl(220, 20%, 20%), hsl(220, 30%, 16%))', + boxShadow: `0 8px 12px hsla(0, 0%, 0%, 0.8)`, + }), + })), + ]} + > + + + + {tier.title} + + {tier.title === 'Professional' && ( + } label={tier.subheader} /> + )} + + + + ${tier.price} + + +   per month + + + + {tier.description.map((line) => ( + + + + {line} + + + ))} + + + + + + + ))} + +
+ ); +} diff --git a/resources/js/pages/home/components/Testimonials.jsx b/resources/js/pages/home/components/Testimonials.jsx new file mode 100644 index 0000000..60d527f --- /dev/null +++ b/resources/js/pages/home/components/Testimonials.jsx @@ -0,0 +1,173 @@ +import Card from '@mui/material/Card'; +import CardHeader from '@mui/material/CardHeader'; +import CardContent from '@mui/material/CardContent'; +import Avatar from '@mui/material/Avatar'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; +import Container from '@mui/material/Container'; +import Grid from '@mui/material/Grid'; +import { useColorScheme } from '@mui/material/styles'; + +const userTestimonials = [ + { + avatar: , + name: 'Remy Sharp', + occupation: 'Senior Engineer', + testimonial: + "I absolutely love how versatile this product is! Whether I'm tackling work projects or indulging in my favorite hobbies, it seamlessly adapts to my changing needs. Its intuitive design has truly enhanced my daily routine, making tasks more efficient and enjoyable.", + }, + { + avatar: , + name: 'Travis Howard', + occupation: 'Lead Product Designer', + testimonial: + "One of the standout features of this product is the exceptional customer support. In my experience, the team behind this product has been quick to respond and incredibly helpful. It's reassuring to know that they stand firmly behind their product.", + }, + { + avatar: , + name: 'Cindy Baker', + occupation: 'CTO', + testimonial: + 'The level of simplicity and user-friendliness in this product has significantly simplified my life. I appreciate the creators for delivering a solution that not only meets but exceeds user expectations.', + }, + { + avatar: , + name: 'Julia Stewart', + occupation: 'Senior Engineer', + testimonial: + "I appreciate the attention to detail in the design of this product. The small touches make a big difference, and it's evident that the creators focused on delivering a premium experience.", + }, + { + avatar: , + name: 'John Smith', + occupation: 'Product Designer', + testimonial: + "I've tried other similar products, but this one stands out for its innovative features. It's clear that the makers put a lot of thought into creating a solution that truly addresses user needs.", + }, + { + avatar: , + name: 'Daniel Wolf', + occupation: 'CDO', + testimonial: + "The quality of this product exceeded my expectations. It's durable, well-designed, and built to last. Definitely worth the investment!", + }, +]; + +const darkModeLogos = [ + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560628e8573c43893fe0ace_Sydney-white.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f4d520d0517ae8e8ddf13_Bern-white.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f46794c159024c1af6d44_Montreal-white.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/61f12e891fa22f89efd7477a_TerraLight.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560a09d1f6337b1dfed14ab_colorado-white.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f5caa77bf7d69fb78792e_Ankara-white.svg', +]; + +const lightModeLogos = [ + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560628889c3bdf1129952dc_Sydney-black.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f4d4d8b829a89976a419c_Bern-black.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f467502f091ccb929529d_Montreal-black.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/61f12e911fa22f2203d7514c_TerraDark.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560a0990f3717787fd49245_colorado-black.svg', + 'https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f5ca4e548b0deb1041c33_Ankara-black.svg', +]; + +const logoStyle = { + width: '64px', + opacity: 0.3, +}; + +export default function Testimonials() { + const { mode, systemMode } = useColorScheme(); + + let logos; + if (mode === 'system') { + if (systemMode === 'light') { + logos = lightModeLogos; + } else { + logos = darkModeLogos; + } + } else if (mode === 'light') { + logos = lightModeLogos; + } else { + logos = darkModeLogos; + } + + return ( + + + + Testimonials + + + See what our customers love about our products. Discover how we excel in + efficiency, durability, and satisfaction. Join us for quality, innovation, + and reliable support. + + + + {userTestimonials.map((testimonial, index) => ( + + + + + {testimonial.testimonial} + + + + + {`Logo + + + + ))} + + + ); +} diff --git a/resources/js/pages/layouts/Layout.jsx b/resources/js/pages/layouts/Layout.jsx new file mode 100644 index 0000000..87ebcd8 --- /dev/null +++ b/resources/js/pages/layouts/Layout.jsx @@ -0,0 +1,14 @@ +import { Link } from '@inertiajs/react' + +export default function Layout({ children }) { + return ( +
+
+ Home + About + Contact +
+
{children}
+
+ ) +} \ No newline at end of file diff --git a/resources/js/pages/posts/CreatePostPage.jsx b/resources/js/pages/posts/CreatePostPage.jsx new file mode 100644 index 0000000..05fadec --- /dev/null +++ b/resources/js/pages/posts/CreatePostPage.jsx @@ -0,0 +1,9 @@ +import React from 'react'; + +export default function CreatePostPage() { + return ( +
+

Create Post

+
+ ); +} diff --git a/resources/js/pages/posts/EditPostPage.jsx b/resources/js/pages/posts/EditPostPage.jsx new file mode 100644 index 0000000..03c44bf --- /dev/null +++ b/resources/js/pages/posts/EditPostPage.jsx @@ -0,0 +1,9 @@ +import React from 'react'; + +export default function EditPostPage() { + return ( +
+

Edit Post

+
+ ); +} diff --git a/resources/js/pages/posts/PostsIndexPage.jsx b/resources/js/pages/posts/PostsIndexPage.jsx new file mode 100644 index 0000000..bc5fa2e --- /dev/null +++ b/resources/js/pages/posts/PostsIndexPage.jsx @@ -0,0 +1,9 @@ +import React from 'react'; + +export default function PostsIndexPage() { + return ( +
+

Posts Index

+
+ ); +} diff --git a/resources/js/pages/posts/components/PublishStatus.jsx b/resources/js/pages/posts/components/PublishStatus.jsx new file mode 100644 index 0000000..92a1d20 --- /dev/null +++ b/resources/js/pages/posts/components/PublishStatus.jsx @@ -0,0 +1,5 @@ +import React from 'react'; + +export default function PublishStatus() { + return Published; +} diff --git a/resources/js/pages/posts/helpers/generateSlug.js b/resources/js/pages/posts/helpers/generateSlug.js new file mode 100644 index 0000000..4ee176c --- /dev/null +++ b/resources/js/pages/posts/helpers/generateSlug.js @@ -0,0 +1,3 @@ +export const generateSlug = (title: string) => { + return title.toLowerCase().replace(/ /g, '-').replace(/[^\w-]+/g, ''); +}; diff --git a/resources/js/pages/profile/ProfilePage.jsx b/resources/js/pages/profile/ProfilePage.jsx new file mode 100644 index 0000000..c025f97 --- /dev/null +++ b/resources/js/pages/profile/ProfilePage.jsx @@ -0,0 +1,9 @@ +import React from 'react'; + +export default function ProfilePage() { + return ( +
+

Profile

+
+ ); +} diff --git a/resources/js/pages/profile/layouts/ProfileLayout.jsx b/resources/js/pages/profile/layouts/ProfileLayout.jsx new file mode 100644 index 0000000..f7df00a --- /dev/null +++ b/resources/js/pages/profile/layouts/ProfileLayout.jsx @@ -0,0 +1,10 @@ +import React from 'react'; + +export default function ProfileLayout({ children }) { + return ( +
+ +
{children}
+
+ ); +} diff --git a/resources/js/pages/theme/AppTheme.jsx b/resources/js/pages/theme/AppTheme.jsx new file mode 100644 index 0000000..cfbd352 --- /dev/null +++ b/resources/js/pages/theme/AppTheme.jsx @@ -0,0 +1,43 @@ +import * as React from 'react'; +import { ThemeProvider, createTheme } from '@mui/material/styles'; +import { inputsCustomizations } from './customizations/inputs'; +import { dataDisplayCustomizations } from './customizations/dataDisplay'; +import { feedbackCustomizations } from './customizations/feedback'; +import { navigationCustomizations } from './customizations/navigation'; +import { surfacesCustomizations } from './customizations/surfaces'; +import { colorSchemes, typography, shadows, shape } from './themePrimitives'; + +export default function AppTheme(props) { + const { children, disableCustomTheme, themeComponents } = props; + const theme = React.useMemo(() => { + return disableCustomTheme + ? {} + : createTheme({ + // For more details about CSS variables configuration, see https://mui.com/material-ui/customization/css-theme-variables/configuration/ + cssVariables: { + colorSchemeSelector: 'data-mui-color-scheme', + cssVarPrefix: 'template', + }, + colorSchemes, // Recently added in v6 for building light & dark mode app, see https://mui.com/material-ui/customization/palette/#color-schemes + typography, + shadows, + shape, + components: { + ...inputsCustomizations, + ...dataDisplayCustomizations, + ...feedbackCustomizations, + ...navigationCustomizations, + ...surfacesCustomizations, + ...themeComponents, + }, + }); + }, [disableCustomTheme, themeComponents]); + if (disableCustomTheme) { + return {children}; + } + return ( + + {children} + + ); +} diff --git a/resources/js/pages/theme/ColorModeIconDropdown.jsx b/resources/js/pages/theme/ColorModeIconDropdown.jsx new file mode 100644 index 0000000..288816f --- /dev/null +++ b/resources/js/pages/theme/ColorModeIconDropdown.jsx @@ -0,0 +1,89 @@ +import * as React from 'react'; +import DarkModeIcon from '@mui/icons-material/DarkModeRounded'; +import LightModeIcon from '@mui/icons-material/LightModeRounded'; +import Box from '@mui/material/Box'; +import IconButton from '@mui/material/IconButton'; +import Menu from '@mui/material/Menu'; +import MenuItem from '@mui/material/MenuItem'; +import { useColorScheme } from '@mui/material/styles'; + +export default function ColorModeIconDropdown(props) { + const { mode, systemMode, setMode } = useColorScheme(); + const [anchorEl, setAnchorEl] = React.useState(null); + const open = Boolean(anchorEl); + const handleClick = (event) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + const handleMode = (targetMode) => () => { + setMode(targetMode); + handleClose(); + }; + if (!mode) { + return ( + ({ + verticalAlign: 'bottom', + display: 'inline-flex', + width: '2.25rem', + height: '2.25rem', + borderRadius: (theme.vars || theme).shape.borderRadius, + border: '1px solid', + borderColor: (theme.vars || theme).palette.divider, + })} + /> + ); + } + const resolvedMode = (systemMode || mode); + const icon = { + light: , + dark: , + }[resolvedMode]; + return ( + + + {icon} + + + + System + + + Light + + + Dark + + + + ); +} diff --git a/resources/js/pages/theme/ColorModeSelect.jsx b/resources/js/pages/theme/ColorModeSelect.jsx new file mode 100644 index 0000000..825cab8 --- /dev/null +++ b/resources/js/pages/theme/ColorModeSelect.jsx @@ -0,0 +1,27 @@ +import { useColorScheme } from '@mui/material/styles'; +import MenuItem from '@mui/material/MenuItem'; +import Select from '@mui/material/Select'; + +export default function ColorModeSelect(props) { + const { mode, setMode } = useColorScheme(); + if (!mode) { + return null; + } + return ( + + ); +} diff --git a/resources/js/pages/theme/customizations/dataDisplay.jsx b/resources/js/pages/theme/customizations/dataDisplay.jsx new file mode 100644 index 0000000..e7edca9 --- /dev/null +++ b/resources/js/pages/theme/customizations/dataDisplay.jsx @@ -0,0 +1,233 @@ +import { alpha } from '@mui/material/styles'; +import { svgIconClasses } from '@mui/material/SvgIcon'; +import { typographyClasses } from '@mui/material/Typography'; +import { buttonBaseClasses } from '@mui/material/ButtonBase'; +import { chipClasses } from '@mui/material/Chip'; +import { iconButtonClasses } from '@mui/material/IconButton'; +import { gray, red, green } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const dataDisplayCustomizations = { + MuiList: { + styleOverrides: { + root: { + padding: '8px', + display: 'flex', + flexDirection: 'column', + gap: 0, + }, + }, + }, + MuiListItem: { + styleOverrides: { + root: ({ theme }) => ({ + [`& .${svgIconClasses.root}`]: { + width: '1rem', + height: '1rem', + color: (theme.vars || theme).palette.text.secondary, + }, + [`& .${typographyClasses.root}`]: { + fontWeight: 500, + }, + [`& .${buttonBaseClasses.root}`]: { + display: 'flex', + gap: 8, + padding: '2px 8px', + borderRadius: (theme.vars || theme).shape.borderRadius, + opacity: 0.7, + '&.Mui-selected': { + opacity: 1, + backgroundColor: alpha(theme.palette.action.selected, 0.3), + [`& .${svgIconClasses.root}`]: { + color: (theme.vars || theme).palette.text.primary, + }, + '&:focus-visible': { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + '&:hover': { + backgroundColor: alpha(theme.palette.action.selected, 0.5), + }, + }, + '&:focus-visible': { + backgroundColor: 'transparent', + }, + }, + }), + }, + }, + MuiListItemText: { + styleOverrides: { + primary: ({ theme }) => ({ + fontSize: theme.typography.body2.fontSize, + fontWeight: 500, + lineHeight: theme.typography.body2.lineHeight, + }), + secondary: ({ theme }) => ({ + fontSize: theme.typography.caption.fontSize, + lineHeight: theme.typography.caption.lineHeight, + }), + }, + }, + MuiListSubheader: { + styleOverrides: { + root: ({ theme }) => ({ + backgroundColor: 'transparent', + padding: '4px 8px', + fontSize: theme.typography.caption.fontSize, + fontWeight: 500, + lineHeight: theme.typography.caption.lineHeight, + }), + }, + }, + MuiListItemIcon: { + styleOverrides: { + root: { + minWidth: 0, + }, + }, + }, + MuiChip: { + defaultProps: { + size: 'small', + }, + styleOverrides: { + root: ({ theme }) => ({ + border: '1px solid', + borderRadius: '999px', + [`& .${chipClasses.label}`]: { + fontWeight: 600, + }, + variants: [ + { + props: { + color: 'default', + }, + style: { + borderColor: gray[200], + backgroundColor: gray[100], + [`& .${chipClasses.label}`]: { + color: gray[500], + }, + [`& .${chipClasses.icon}`]: { + color: gray[500], + }, + ...theme.applyStyles('dark', { + borderColor: gray[700], + backgroundColor: gray[800], + [`& .${chipClasses.label}`]: { + color: gray[300], + }, + [`& .${chipClasses.icon}`]: { + color: gray[300], + }, + }), + }, + }, + { + props: { + color: 'success', + }, + style: { + borderColor: green[200], + backgroundColor: green[50], + [`& .${chipClasses.label}`]: { + color: green[500], + }, + [`& .${chipClasses.icon}`]: { + color: green[500], + }, + ...theme.applyStyles('dark', { + borderColor: green[800], + backgroundColor: green[900], + [`& .${chipClasses.label}`]: { + color: green[300], + }, + [`& .${chipClasses.icon}`]: { + color: green[300], + }, + }), + }, + }, + { + props: { + color: 'error', + }, + style: { + borderColor: red[100], + backgroundColor: red[50], + [`& .${chipClasses.label}`]: { + color: red[500], + }, + [`& .${chipClasses.icon}`]: { + color: red[500], + }, + ...theme.applyStyles('dark', { + borderColor: red[800], + backgroundColor: red[900], + [`& .${chipClasses.label}`]: { + color: red[200], + }, + [`& .${chipClasses.icon}`]: { + color: red[300], + }, + }), + }, + }, + { + props: { size: 'small' }, + style: { + maxHeight: 20, + [`& .${chipClasses.label}`]: { + fontSize: theme.typography.caption.fontSize, + }, + [`& .${svgIconClasses.root}`]: { + fontSize: theme.typography.caption.fontSize, + }, + }, + }, + { + props: { size: 'medium' }, + style: { + [`& .${chipClasses.label}`]: { + fontSize: theme.typography.caption.fontSize, + }, + }, + }, + ], + }), + }, + }, + MuiTablePagination: { + styleOverrides: { + actions: { + display: 'flex', + gap: 8, + marginRight: 6, + [`& .${iconButtonClasses.root}`]: { + minWidth: 0, + width: 36, + height: 36, + }, + }, + }, + }, + MuiIcon: { + defaultProps: { + fontSize: 'small', + }, + styleOverrides: { + root: { + variants: [ + { + props: { + fontSize: 'small', + }, + style: { + fontSize: '1rem', + }, + }, + ], + }, + }, + }, +}; diff --git a/resources/js/pages/theme/customizations/feedback.jsx b/resources/js/pages/theme/customizations/feedback.jsx new file mode 100644 index 0000000..c8f3094 --- /dev/null +++ b/resources/js/pages/theme/customizations/feedback.jsx @@ -0,0 +1,46 @@ +import { alpha } from '@mui/material/styles'; +import { gray, orange } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const feedbackCustomizations = { + MuiAlert: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: 10, + backgroundColor: orange[100], + color: (theme.vars || theme).palette.text.primary, + border: `1px solid ${alpha(orange[300], 0.5)}`, + '& .MuiAlert-icon': { + color: orange[500], + }, + ...theme.applyStyles('dark', { + backgroundColor: `${alpha(orange[900], 0.5)}`, + border: `1px solid ${alpha(orange[800], 0.5)}`, + }), + }), + }, + }, + MuiDialog: { + styleOverrides: { + root: ({ theme }) => ({ + '& .MuiDialog-paper': { + borderRadius: '10px', + border: '1px solid', + borderColor: (theme.vars || theme).palette.divider, + }, + }), + }, + }, + MuiLinearProgress: { + styleOverrides: { + root: ({ theme }) => ({ + height: 8, + borderRadius: 8, + backgroundColor: gray[200], + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + }), + }), + }, + }, +}; diff --git a/resources/js/pages/theme/customizations/inputs.jsx b/resources/js/pages/theme/customizations/inputs.jsx new file mode 100644 index 0000000..62aede6 --- /dev/null +++ b/resources/js/pages/theme/customizations/inputs.jsx @@ -0,0 +1,444 @@ +import { alpha } from '@mui/material/styles'; +import { outlinedInputClasses } from '@mui/material/OutlinedInput'; +import { svgIconClasses } from '@mui/material/SvgIcon'; +import { toggleButtonGroupClasses } from '@mui/material/ToggleButtonGroup'; +import { toggleButtonClasses } from '@mui/material/ToggleButton'; +import CheckBoxOutlineBlankRoundedIcon from '@mui/icons-material/CheckBoxOutlineBlankRounded'; +import CheckRoundedIcon from '@mui/icons-material/CheckRounded'; +import RemoveRoundedIcon from '@mui/icons-material/RemoveRounded'; +import { gray, brand } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const inputsCustomizations = { + MuiButtonBase: { + defaultProps: { + disableTouchRipple: true, + disableRipple: true, + }, + styleOverrides: { + root: ({ theme }) => ({ + boxSizing: 'border-box', + transition: 'all 100ms ease-in', + '&:focus-visible': { + outline: `3px solid ${alpha(theme.palette.primary.main, 0.5)}`, + outlineOffset: '2px', + }, + }), + }, + }, + MuiButton: { + styleOverrides: { + root: ({ theme }) => ({ + boxShadow: 'none', + borderRadius: (theme.vars || theme).shape.borderRadius, + textTransform: 'none', + variants: [ + { + props: { + size: 'small', + }, + style: { + height: '2.25rem', + padding: '8px 12px', + }, + }, + { + props: { + size: 'medium', + }, + style: { + height: '2.5rem', // 40px + }, + }, + { + props: { + color: 'primary', + variant: 'contained', + }, + style: { + color: 'white', + backgroundColor: gray[900], + backgroundImage: `linear-gradient(to bottom, ${gray[700]}, ${gray[800]})`, + boxShadow: `inset 0 1px 0 ${gray[600]}, inset 0 -1px 0 1px hsl(220, 0%, 0%)`, + border: `1px solid ${gray[700]}`, + '&:hover': { + backgroundImage: 'none', + backgroundColor: gray[700], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: gray[800], + }, + ...theme.applyStyles('dark', { + color: 'black', + backgroundColor: gray[50], + backgroundImage: `linear-gradient(to bottom, ${gray[100]}, ${gray[50]})`, + boxShadow: 'inset 0 -1px 0 hsl(220, 30%, 80%)', + border: `1px solid ${gray[50]}`, + '&:hover': { + backgroundImage: 'none', + backgroundColor: gray[300], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: gray[400], + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'contained', + }, + style: { + color: 'white', + backgroundColor: brand[300], + backgroundImage: `linear-gradient(to bottom, ${alpha(brand[400], 0.8)}, ${brand[500]})`, + boxShadow: `inset 0 2px 0 ${alpha(brand[200], 0.2)}, inset 0 -2px 0 ${alpha(brand[700], 0.4)}`, + border: `1px solid ${brand[500]}`, + '&:hover': { + backgroundColor: brand[700], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: brand[700], + backgroundImage: 'none', + }, + }, + }, + { + props: { + variant: 'outlined', + }, + style: { + color: (theme.vars || theme).palette.text.primary, + border: '1px solid', + borderColor: gray[200], + backgroundColor: alpha(gray[50], 0.3), + '&:hover': { + backgroundColor: gray[100], + borderColor: gray[300], + }, + '&:active': { + backgroundColor: gray[200], + }, + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + borderColor: gray[700], + + '&:hover': { + backgroundColor: gray[900], + borderColor: gray[600], + }, + '&:active': { + backgroundColor: gray[900], + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'outlined', + }, + style: { + color: brand[700], + border: '1px solid', + borderColor: brand[200], + backgroundColor: brand[50], + '&:hover': { + backgroundColor: brand[100], + borderColor: brand[400], + }, + '&:active': { + backgroundColor: alpha(brand[200], 0.7), + }, + ...theme.applyStyles('dark', { + color: brand[50], + border: '1px solid', + borderColor: brand[900], + backgroundColor: alpha(brand[900], 0.3), + '&:hover': { + borderColor: brand[700], + backgroundColor: alpha(brand[900], 0.6), + }, + '&:active': { + backgroundColor: alpha(brand[900], 0.5), + }, + }), + }, + }, + { + props: { + variant: 'text', + }, + style: { + color: gray[600], + '&:hover': { + backgroundColor: gray[100], + }, + '&:active': { + backgroundColor: gray[200], + }, + ...theme.applyStyles('dark', { + color: gray[50], + '&:hover': { + backgroundColor: gray[700], + }, + '&:active': { + backgroundColor: alpha(gray[700], 0.7), + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'text', + }, + style: { + color: brand[700], + '&:hover': { + backgroundColor: alpha(brand[100], 0.5), + }, + '&:active': { + backgroundColor: alpha(brand[200], 0.7), + }, + ...theme.applyStyles('dark', { + color: brand[100], + '&:hover': { + backgroundColor: alpha(brand[900], 0.5), + }, + '&:active': { + backgroundColor: alpha(brand[900], 0.3), + }, + }), + }, + }, + ], + }), + }, + }, + MuiIconButton: { + styleOverrides: { + root: ({ theme }) => ({ + boxShadow: 'none', + borderRadius: (theme.vars || theme).shape.borderRadius, + textTransform: 'none', + fontWeight: theme.typography.fontWeightMedium, + letterSpacing: 0, + color: (theme.vars || theme).palette.text.primary, + border: '1px solid ', + borderColor: gray[200], + backgroundColor: alpha(gray[50], 0.3), + '&:hover': { + backgroundColor: gray[100], + borderColor: gray[300], + }, + '&:active': { + backgroundColor: gray[200], + }, + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + borderColor: gray[700], + '&:hover': { + backgroundColor: gray[900], + borderColor: gray[600], + }, + '&:active': { + backgroundColor: gray[900], + }, + }), + variants: [ + { + props: { + size: 'small', + }, + style: { + width: '2.25rem', + height: '2.25rem', + padding: '0.25rem', + [`& .${svgIconClasses.root}`]: { fontSize: '1rem' }, + }, + }, + { + props: { + size: 'medium', + }, + style: { + width: '2.5rem', + height: '2.5rem', + }, + }, + ], + }), + }, + }, + MuiToggleButtonGroup: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: '10px', + boxShadow: `0 4px 16px ${alpha(gray[400], 0.2)}`, + [`& .${toggleButtonGroupClasses.selected}`]: { + color: brand[500], + }, + ...theme.applyStyles('dark', { + [`& .${toggleButtonGroupClasses.selected}`]: { + color: '#fff', + }, + boxShadow: `0 4px 16px ${alpha(brand[700], 0.5)}`, + }), + }), + }, + }, + MuiToggleButton: { + styleOverrides: { + root: ({ theme }) => ({ + padding: '12px 16px', + textTransform: 'none', + borderRadius: '10px', + fontWeight: 500, + ...theme.applyStyles('dark', { + color: gray[400], + boxShadow: '0 4px 16px rgba(0, 0, 0, 0.5)', + [`&.${toggleButtonClasses.selected}`]: { + color: brand[300], + }, + }), + }), + }, + }, + MuiCheckbox: { + defaultProps: { + disableRipple: true, + icon: ( + + ), + checkedIcon: , + indeterminateIcon: , + }, + styleOverrides: { + root: ({ theme }) => ({ + margin: 10, + height: 16, + width: 16, + borderRadius: 5, + border: '1px solid ', + borderColor: alpha(gray[300], 0.8), + boxShadow: '0 0 0 1.5px hsla(210, 0%, 0%, 0.04) inset', + backgroundColor: alpha(gray[100], 0.4), + transition: 'border-color, background-color, 120ms ease-in', + '&:hover': { + borderColor: brand[300], + }, + '&.Mui-focusVisible': { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '2px', + borderColor: brand[400], + }, + '&.Mui-checked': { + color: 'white', + backgroundColor: brand[500], + borderColor: brand[500], + boxShadow: `none`, + '&:hover': { + backgroundColor: brand[600], + }, + }, + ...theme.applyStyles('dark', { + borderColor: alpha(gray[700], 0.8), + boxShadow: '0 0 0 1.5px hsl(210, 0%, 0%) inset', + backgroundColor: alpha(gray[900], 0.8), + '&:hover': { + borderColor: brand[300], + }, + '&.Mui-focusVisible': { + borderColor: brand[400], + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '2px', + }, + }), + }), + }, + }, + MuiInputBase: { + styleOverrides: { + root: { + border: 'none', + }, + input: { + '&::placeholder': { + opacity: 0.7, + color: gray[500], + }, + }, + }, + }, + MuiOutlinedInput: { + styleOverrides: { + input: { + padding: 0, + }, + root: ({ theme }) => ({ + padding: '8px 12px', + color: (theme.vars || theme).palette.text.primary, + borderRadius: (theme.vars || theme).shape.borderRadius, + border: `1px solid ${(theme.vars || theme).palette.divider}`, + backgroundColor: (theme.vars || theme).palette.background.default, + transition: 'border 120ms ease-in', + '&:hover': { + borderColor: gray[400], + }, + [`&.${outlinedInputClasses.focused}`]: { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + borderColor: brand[400], + }, + ...theme.applyStyles('dark', { + '&:hover': { + borderColor: gray[500], + }, + }), + variants: [ + { + props: { + size: 'small', + }, + style: { + height: '2.25rem', + }, + }, + { + props: { + size: 'medium', + }, + style: { + height: '2.5rem', + }, + }, + ], + }), + notchedOutline: { + border: 'none', + }, + }, + }, + MuiInputAdornment: { + styleOverrides: { + root: ({ theme }) => ({ + color: (theme.vars || theme).palette.grey[500], + ...theme.applyStyles('dark', { + color: (theme.vars || theme).palette.grey[400], + }), + }), + }, + }, + MuiFormLabel: { + styleOverrides: { + root: ({ theme }) => ({ + typography: theme.typography.caption, + marginBottom: 8, + }), + }, + }, +}; diff --git a/resources/js/pages/theme/customizations/navigation.jsx b/resources/js/pages/theme/customizations/navigation.jsx new file mode 100644 index 0000000..e83f497 --- /dev/null +++ b/resources/js/pages/theme/customizations/navigation.jsx @@ -0,0 +1,279 @@ +import * as React from 'react'; +import { alpha } from '@mui/material/styles'; + +import { buttonBaseClasses } from '@mui/material/ButtonBase'; +import { dividerClasses } from '@mui/material/Divider'; +import { menuItemClasses } from '@mui/material/MenuItem'; +import { selectClasses } from '@mui/material/Select'; +import { tabClasses } from '@mui/material/Tab'; +import UnfoldMoreRoundedIcon from '@mui/icons-material/UnfoldMoreRounded'; +import { gray, brand } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const navigationCustomizations = { + MuiMenuItem: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: (theme.vars || theme).shape.borderRadius, + padding: '6px 8px', + [`&.${menuItemClasses.focusVisible}`]: { + backgroundColor: 'transparent', + }, + [`&.${menuItemClasses.selected}`]: { + [`&.${menuItemClasses.focusVisible}`]: { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + }, + }), + }, + }, + MuiMenu: { + styleOverrides: { + list: { + gap: '0px', + [`&.${dividerClasses.root}`]: { + margin: '0 -8px', + }, + }, + paper: ({ theme }) => ({ + marginTop: '4px', + borderRadius: (theme.vars || theme).shape.borderRadius, + border: `1px solid ${(theme.vars || theme).palette.divider}`, + backgroundImage: 'none', + background: 'hsl(0, 0%, 100%)', + boxShadow: + 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px', + [`& .${buttonBaseClasses.root}`]: { + '&.Mui-selected': { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + }, + ...theme.applyStyles('dark', { + background: gray[900], + boxShadow: + 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px', + }), + }), + }, + }, + MuiSelect: { + defaultProps: { + IconComponent: React.forwardRef((props, ref) => ( + + )), + }, + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: (theme.vars || theme).shape.borderRadius, + border: '1px solid', + borderColor: gray[200], + backgroundColor: (theme.vars || theme).palette.background.paper, + boxShadow: `inset 0 1px 0 1px hsla(220, 0%, 100%, 0.6), inset 0 -1px 0 1px hsla(220, 35%, 90%, 0.5)`, + '&:hover': { + borderColor: gray[300], + backgroundColor: (theme.vars || theme).palette.background.paper, + boxShadow: 'none', + }, + [`&.${selectClasses.focused}`]: { + outlineOffset: 0, + borderColor: gray[400], + }, + '&:before, &:after': { + display: 'none', + }, + + ...theme.applyStyles('dark', { + borderRadius: (theme.vars || theme).shape.borderRadius, + borderColor: gray[700], + backgroundColor: (theme.vars || theme).palette.background.paper, + boxShadow: `inset 0 1px 0 1px ${alpha(gray[700], 0.15)}, inset 0 -1px 0 1px hsla(220, 0%, 0%, 0.7)`, + '&:hover': { + borderColor: alpha(gray[700], 0.7), + backgroundColor: (theme.vars || theme).palette.background.paper, + boxShadow: 'none', + }, + [`&.${selectClasses.focused}`]: { + outlineOffset: 0, + borderColor: gray[900], + }, + '&:before, &:after': { + display: 'none', + }, + }), + }), + select: ({ theme }) => ({ + display: 'flex', + alignItems: 'center', + ...theme.applyStyles('dark', { + display: 'flex', + alignItems: 'center', + '&:focus-visible': { + backgroundColor: gray[900], + }, + }), + }), + }, + }, + MuiLink: { + defaultProps: { + underline: 'none', + }, + styleOverrides: { + root: ({ theme }) => ({ + color: (theme.vars || theme).palette.text.primary, + fontWeight: 500, + position: 'relative', + textDecoration: 'none', + width: 'fit-content', + '&::before': { + content: '""', + position: 'absolute', + width: '100%', + height: '1px', + bottom: 0, + left: 0, + backgroundColor: (theme.vars || theme).palette.text.secondary, + opacity: 0.3, + transition: 'width 0.3s ease, opacity 0.3s ease', + }, + '&:hover::before': { + width: 0, + }, + '&:focus-visible': { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '4px', + borderRadius: '2px', + }, + }), + }, + }, + MuiDrawer: { + styleOverrides: { + paper: ({ theme }) => ({ + backgroundColor: (theme.vars || theme).palette.background.default, + }), + }, + }, + MuiPaginationItem: { + styleOverrides: { + root: ({ theme }) => ({ + '&.Mui-selected': { + color: 'white', + backgroundColor: (theme.vars || theme).palette.grey[900], + }, + ...theme.applyStyles('dark', { + '&.Mui-selected': { + color: 'black', + backgroundColor: (theme.vars || theme).palette.grey[50], + }, + }), + }), + }, + }, + MuiTabs: { + styleOverrides: { + root: { minHeight: 'fit-content' }, + indicator: ({ theme }) => ({ + backgroundColor: (theme.vars || theme).palette.grey[800], + ...theme.applyStyles('dark', { + backgroundColor: (theme.vars || theme).palette.grey[200], + }), + }), + }, + }, + MuiTab: { + styleOverrides: { + root: ({ theme }) => ({ + padding: '6px 8px', + marginBottom: '8px', + textTransform: 'none', + minWidth: 'fit-content', + minHeight: 'fit-content', + color: (theme.vars || theme).palette.text.secondary, + borderRadius: (theme.vars || theme).shape.borderRadius, + border: '1px solid', + borderColor: 'transparent', + ':hover': { + color: (theme.vars || theme).palette.text.primary, + backgroundColor: gray[100], + borderColor: gray[200], + }, + [`&.${tabClasses.selected}`]: { + color: gray[900], + }, + ...theme.applyStyles('dark', { + ':hover': { + color: (theme.vars || theme).palette.text.primary, + backgroundColor: gray[800], + borderColor: gray[700], + }, + [`&.${tabClasses.selected}`]: { + color: '#fff', + }, + }), + }), + }, + }, + MuiStepConnector: { + styleOverrides: { + line: ({ theme }) => ({ + borderTop: '1px solid', + borderColor: (theme.vars || theme).palette.divider, + flex: 1, + borderRadius: '99px', + }), + }, + }, + MuiStepIcon: { + styleOverrides: { + root: ({ theme }) => ({ + color: 'transparent', + border: `1px solid ${gray[400]}`, + width: 12, + height: 12, + borderRadius: '50%', + '& text': { + display: 'none', + }, + '&.Mui-active': { + border: 'none', + color: (theme.vars || theme).palette.primary.main, + }, + '&.Mui-completed': { + border: 'none', + color: (theme.vars || theme).palette.success.main, + }, + ...theme.applyStyles('dark', { + border: `1px solid ${gray[700]}`, + '&.Mui-active': { + border: 'none', + color: (theme.vars || theme).palette.primary.light, + }, + '&.Mui-completed': { + border: 'none', + color: (theme.vars || theme).palette.success.light, + }, + }), + variants: [ + { + props: { completed: true }, + style: { + width: 12, + height: 12, + }, + }, + ], + }), + }, + }, + MuiStepLabel: { + styleOverrides: { + label: ({ theme }) => ({ + '&.Mui-completed': { + opacity: 0.6, + ...theme.applyStyles('dark', { opacity: 0.5 }), + }, + }), + }, + }, +}; diff --git a/resources/js/pages/theme/customizations/surfaces.ts b/resources/js/pages/theme/customizations/surfaces.ts new file mode 100644 index 0000000..ff22893 --- /dev/null +++ b/resources/js/pages/theme/customizations/surfaces.ts @@ -0,0 +1,114 @@ +import { alpha } from '@mui/material/styles'; +import type { Theme, Components } from '@mui/material/styles'; +import { gray } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const surfacesCustomizations: Components = { + MuiAccordion: { + defaultProps: { + elevation: 0, + disableGutters: true, + }, + styleOverrides: { + root: ({ theme }) => ({ + padding: 4, + overflow: 'clip', + backgroundColor: (theme.vars || theme).palette.background.default, + border: '1px solid', + borderColor: (theme.vars || theme).palette.divider, + ':before': { + backgroundColor: 'transparent', + }, + '&:not(:last-of-type)': { + borderBottom: 'none', + }, + '&:first-of-type': { + borderTopLeftRadius: (theme.vars || theme).shape.borderRadius, + borderTopRightRadius: (theme.vars || theme).shape.borderRadius, + }, + '&:last-of-type': { + borderBottomLeftRadius: (theme.vars || theme).shape.borderRadius, + borderBottomRightRadius: (theme.vars || theme).shape.borderRadius, + }, + }), + }, + }, + MuiAccordionSummary: { + styleOverrides: { + root: ({ theme }) => ({ + border: 'none', + borderRadius: 8, + '&:hover': { backgroundColor: gray[50] }, + '&:focus-visible': { backgroundColor: 'transparent' }, + ...theme.applyStyles('dark', { + '&:hover': { backgroundColor: gray[800] }, + }), + }), + }, + }, + MuiAccordionDetails: { + styleOverrides: { + root: { mb: 20, border: 'none' }, + }, + }, + MuiPaper: { + defaultProps: { + elevation: 0, + }, + }, + MuiCard: { + styleOverrides: { + root: ({ theme }) => { + return { + padding: 16, + gap: 16, + transition: 'all 100ms ease', + backgroundColor: gray[50], + borderRadius: (theme.vars || theme).shape.borderRadius, + border: `1px solid ${(theme.vars || theme).palette.divider}`, + boxShadow: 'none', + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + }), + variants: [ + { + props: { + variant: 'outlined', + }, + style: { + border: `1px solid ${(theme.vars || theme).palette.divider}`, + boxShadow: 'none', + background: 'hsl(0, 0%, 100%)', + ...theme.applyStyles('dark', { + background: alpha(gray[900], 0.4), + }), + }, + }, + ], + }; + }, + }, + }, + MuiCardContent: { + styleOverrides: { + root: { + padding: 0, + '&:last-child': { paddingBottom: 0 }, + }, + }, + }, + MuiCardHeader: { + styleOverrides: { + root: { + padding: 0, + }, + }, + }, + MuiCardActions: { + styleOverrides: { + root: { + padding: 0, + }, + }, + }, +}; diff --git a/resources/js/pages/theme/themePrimitives.ts b/resources/js/pages/theme/themePrimitives.ts new file mode 100644 index 0000000..ddd1e5d --- /dev/null +++ b/resources/js/pages/theme/themePrimitives.ts @@ -0,0 +1,403 @@ +import { createTheme, alpha, PaletteMode, Shadows } from '@mui/material/styles'; + +declare module '@mui/material/Paper' { + interface PaperPropsVariantOverrides { + highlighted: true; + } +} +declare module '@mui/material/styles' { + interface ColorRange { + 50: string; + 100: string; + 200: string; + 300: string; + 400: string; + 500: string; + 600: string; + 700: string; + 800: string; + 900: string; + } + + interface PaletteColor extends ColorRange { } + + interface Palette { + baseShadow: string; + } +} + +const defaultTheme = createTheme(); + +const customShadows: Shadows = [...defaultTheme.shadows]; + +export const brand = { + 50: 'hsl(210, 100%, 95%)', + 100: 'hsl(210, 100%, 92%)', + 200: 'hsl(210, 100%, 80%)', + 300: 'hsl(210, 100%, 65%)', + 400: 'hsl(210, 98%, 48%)', + 500: 'hsl(210, 98%, 42%)', + 600: 'hsl(210, 98%, 55%)', + 700: 'hsl(210, 100%, 35%)', + 800: 'hsl(210, 100%, 16%)', + 900: 'hsl(210, 100%, 21%)', +}; + +export const gray = { + 50: 'hsl(220, 35%, 97%)', + 100: 'hsl(220, 30%, 94%)', + 200: 'hsl(220, 20%, 88%)', + 300: 'hsl(220, 20%, 80%)', + 400: 'hsl(220, 20%, 65%)', + 500: 'hsl(220, 20%, 42%)', + 600: 'hsl(220, 20%, 35%)', + 700: 'hsl(220, 20%, 25%)', + 800: 'hsl(220, 30%, 6%)', + 900: 'hsl(220, 35%, 3%)', +}; + +export const green = { + 50: 'hsl(120, 80%, 98%)', + 100: 'hsl(120, 75%, 94%)', + 200: 'hsl(120, 75%, 87%)', + 300: 'hsl(120, 61%, 77%)', + 400: 'hsl(120, 44%, 53%)', + 500: 'hsl(120, 59%, 30%)', + 600: 'hsl(120, 70%, 25%)', + 700: 'hsl(120, 75%, 16%)', + 800: 'hsl(120, 84%, 10%)', + 900: 'hsl(120, 87%, 6%)', +}; + +export const orange = { + 50: 'hsl(45, 100%, 97%)', + 100: 'hsl(45, 92%, 90%)', + 200: 'hsl(45, 94%, 80%)', + 300: 'hsl(45, 90%, 65%)', + 400: 'hsl(45, 90%, 40%)', + 500: 'hsl(45, 90%, 35%)', + 600: 'hsl(45, 91%, 25%)', + 700: 'hsl(45, 94%, 20%)', + 800: 'hsl(45, 95%, 16%)', + 900: 'hsl(45, 93%, 12%)', +}; + +export const red = { + 50: 'hsl(0, 100%, 97%)', + 100: 'hsl(0, 92%, 90%)', + 200: 'hsl(0, 94%, 80%)', + 300: 'hsl(0, 90%, 65%)', + 400: 'hsl(0, 90%, 40%)', + 500: 'hsl(0, 90%, 30%)', + 600: 'hsl(0, 91%, 25%)', + 700: 'hsl(0, 94%, 18%)', + 800: 'hsl(0, 95%, 12%)', + 900: 'hsl(0, 93%, 6%)', +}; + +export const getDesignTokens = (mode: PaletteMode) => { + customShadows[1] = + mode === 'dark' + ? 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px' + : 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px'; + + return { + palette: { + mode, + primary: { + light: brand[200], + main: brand[400], + dark: brand[700], + contrastText: brand[50], + ...(mode === 'dark' && { + contrastText: brand[50], + light: brand[300], + main: brand[400], + dark: brand[700], + }), + }, + info: { + light: brand[100], + main: brand[300], + dark: brand[600], + contrastText: gray[50], + ...(mode === 'dark' && { + contrastText: brand[300], + light: brand[500], + main: brand[700], + dark: brand[900], + }), + }, + warning: { + light: orange[300], + main: orange[400], + dark: orange[800], + ...(mode === 'dark' && { + light: orange[400], + main: orange[500], + dark: orange[700], + }), + }, + error: { + light: red[300], + main: red[400], + dark: red[800], + ...(mode === 'dark' && { + light: red[400], + main: red[500], + dark: red[700], + }), + }, + success: { + light: green[300], + main: green[400], + dark: green[800], + ...(mode === 'dark' && { + light: green[400], + main: green[500], + dark: green[700], + }), + }, + grey: { + ...gray, + }, + divider: mode === 'dark' ? alpha(gray[700], 0.6) : alpha(gray[300], 0.4), + background: { + default: 'hsl(0, 0%, 99%)', + paper: 'hsl(220, 35%, 97%)', + ...(mode === 'dark' && { default: gray[900], paper: 'hsl(220, 30%, 7%)' }), + }, + text: { + primary: gray[800], + secondary: gray[600], + warning: orange[400], + ...(mode === 'dark' && { primary: 'hsl(0, 0%, 100%)', secondary: gray[400] }), + }, + action: { + hover: alpha(gray[200], 0.2), + selected: `${alpha(gray[200], 0.3)}`, + ...(mode === 'dark' && { + hover: alpha(gray[600], 0.2), + selected: alpha(gray[600], 0.3), + }), + }, + }, + typography: { + fontFamily: 'Inter, sans-serif', + h1: { + fontSize: defaultTheme.typography.pxToRem(48), + fontWeight: 600, + lineHeight: 1.2, + letterSpacing: -0.5, + }, + h2: { + fontSize: defaultTheme.typography.pxToRem(36), + fontWeight: 600, + lineHeight: 1.2, + }, + h3: { + fontSize: defaultTheme.typography.pxToRem(30), + lineHeight: 1.2, + }, + h4: { + fontSize: defaultTheme.typography.pxToRem(24), + fontWeight: 600, + lineHeight: 1.5, + }, + h5: { + fontSize: defaultTheme.typography.pxToRem(20), + fontWeight: 600, + }, + h6: { + fontSize: defaultTheme.typography.pxToRem(18), + fontWeight: 600, + }, + subtitle1: { + fontSize: defaultTheme.typography.pxToRem(18), + }, + subtitle2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 500, + }, + body1: { + fontSize: defaultTheme.typography.pxToRem(14), + }, + body2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 400, + }, + caption: { + fontSize: defaultTheme.typography.pxToRem(12), + fontWeight: 400, + }, + }, + shape: { + borderRadius: 8, + }, + shadows: customShadows, + }; +}; + +export const colorSchemes = { + light: { + palette: { + primary: { + light: brand[200], + main: brand[400], + dark: brand[700], + contrastText: brand[50], + }, + info: { + light: brand[100], + main: brand[300], + dark: brand[600], + contrastText: gray[50], + }, + warning: { + light: orange[300], + main: orange[400], + dark: orange[800], + }, + error: { + light: red[300], + main: red[400], + dark: red[800], + }, + success: { + light: green[300], + main: green[400], + dark: green[800], + }, + grey: { + ...gray, + }, + divider: alpha(gray[300], 0.4), + background: { + default: 'hsl(0, 0%, 99%)', + paper: 'hsl(220, 35%, 97%)', + }, + text: { + primary: gray[800], + secondary: gray[600], + warning: orange[400], + }, + action: { + hover: alpha(gray[200], 0.2), + selected: `${alpha(gray[200], 0.3)}`, + }, + baseShadow: + 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px', + }, + }, + dark: { + palette: { + primary: { + contrastText: brand[50], + light: brand[300], + main: brand[400], + dark: brand[700], + }, + info: { + contrastText: brand[300], + light: brand[500], + main: brand[700], + dark: brand[900], + }, + warning: { + light: orange[400], + main: orange[500], + dark: orange[700], + }, + error: { + light: red[400], + main: red[500], + dark: red[700], + }, + success: { + light: green[400], + main: green[500], + dark: green[700], + }, + grey: { + ...gray, + }, + divider: alpha(gray[700], 0.6), + background: { + default: gray[900], + paper: 'hsl(220, 30%, 7%)', + }, + text: { + primary: 'hsl(0, 0%, 100%)', + secondary: gray[400], + }, + action: { + hover: alpha(gray[600], 0.2), + selected: alpha(gray[600], 0.3), + }, + baseShadow: + 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px', + }, + }, +}; + +export const typography = { + fontFamily: 'Inter, sans-serif', + h1: { + fontSize: defaultTheme.typography.pxToRem(48), + fontWeight: 600, + lineHeight: 1.2, + letterSpacing: -0.5, + }, + h2: { + fontSize: defaultTheme.typography.pxToRem(36), + fontWeight: 600, + lineHeight: 1.2, + }, + h3: { + fontSize: defaultTheme.typography.pxToRem(30), + lineHeight: 1.2, + }, + h4: { + fontSize: defaultTheme.typography.pxToRem(24), + fontWeight: 600, + lineHeight: 1.5, + }, + h5: { + fontSize: defaultTheme.typography.pxToRem(20), + fontWeight: 600, + }, + h6: { + fontSize: defaultTheme.typography.pxToRem(18), + fontWeight: 600, + }, + subtitle1: { + fontSize: defaultTheme.typography.pxToRem(18), + }, + subtitle2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 500, + }, + body1: { + fontSize: defaultTheme.typography.pxToRem(14), + }, + body2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 400, + }, + caption: { + fontSize: defaultTheme.typography.pxToRem(12), + fontWeight: 400, + }, +}; + +export const shape = { + borderRadius: 8, +}; + +// @ts-ignore +const defaultShadows: Shadows = [ + 'none', + 'var(--template-palette-baseShadow)', + ...defaultTheme.shadows.slice(2), +]; +export const shadows = defaultShadows; diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php new file mode 100644 index 0000000..ec07618 --- /dev/null +++ b/resources/views/app.blade.php @@ -0,0 +1,15 @@ + + + + + + @viteReactRefresh + @vite('resources/js/app.jsx') + @inertiaHead + + + + @inertia + + + diff --git a/routes/web.php b/routes/web.php index 86a06c5..7a01379 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,7 +1,6 @@ name('homepage'); diff --git a/vite.config.js b/vite.config.js index de47f8a..910b8e1 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,17 +1,18 @@ import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; import tailwindcss from '@tailwindcss/vite'; +import react from '@vitejs/plugin-react'; export default defineConfig({ plugins: [ laravel({ input: [ - 'resources/css/app.css', - 'resources/js/app.js', + 'resources/js/app.jsx', 'resources/css/filament/dashboard/theme.css' ], refresh: true, }), tailwindcss(), + react(), ], });