diff --git a/app/.editorconfig b/app/.editorconfig new file mode 100644 index 0000000..a186cd2 --- /dev/null +++ b/app/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[compose.yaml] +indent_size = 4 diff --git a/app/README.md b/app/README.md new file mode 100644 index 0000000..0165a77 --- /dev/null +++ b/app/README.md @@ -0,0 +1,59 @@ +

Laravel Logo

+ +

+Build Status +Total Downloads +Latest Stable Version +License +

+ +## About Laravel + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: + +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). + +Laravel is accessible, powerful, and provides tools required for large, robust applications. + +## Learning Laravel + +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. You can also check out [Laravel Learn](https://laravel.com/learn), where you will be guided through building a modern Laravel application. + +If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. + +## Laravel Sponsors + +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com). + +### Premium Partners + +- **[Vehikl](https://vehikl.com)** +- **[Tighten Co.](https://tighten.co)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Redberry](https://redberry.international/laravel-development)** +- **[Active Logic](https://activelogic.com)** + +## Contributing + +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). + +## Code of Conduct + +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). + +## Security Vulnerabilities + +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. + +## License + +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/app/app/Http/Controllers/Auth/VerifyEmailController.php b/app/app/Http/Controllers/Auth/VerifyEmailController.php deleted file mode 100644 index 784765e..0000000 --- a/app/app/Http/Controllers/Auth/VerifyEmailController.php +++ /dev/null @@ -1,27 +0,0 @@ -user()->hasVerifiedEmail()) { - return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); - } - - if ($request->user()->markEmailAsVerified()) { - event(new Verified($request->user())); - } - - return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); - } -} diff --git a/app/database/seeders/DatabaseSeeder.php b/app/database/seeders/DatabaseSeeder.php index 6b901f8..4a4cb0d 100644 --- a/app/database/seeders/DatabaseSeeder.php +++ b/app/database/seeders/DatabaseSeeder.php @@ -21,5 +21,14 @@ class DatabaseSeeder extends Seeder 'name' => 'Test User', 'email' => 'test@example.com', ]); + + User::updateOrCreate( + ['email' => 'admin@clupilot.test'], + [ + 'name' => 'Admin', + 'password' => bcrypt('clupilot'), + 'email_verified_at' => now(), + ] + ); } } diff --git a/app/package-lock.json b/app/package-lock.json index c912961..c9688b7 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -16,23 +16,10 @@ "concurrently": "^9.0.1", "laravel-vite-plugin": "^2.0.0", "postcss": "^8.4.31", - "tailwindcss": "^3.4.19", + "tailwindcss": "^4.3.0", "vite": "^7.0.7" } }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.7", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", @@ -525,44 +512,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", @@ -949,13 +898,6 @@ "tailwindcss": "4.3.0" } }, - "node_modules/@tailwindcss/node/node_modules/tailwindcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", - "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@tailwindcss/oxide": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", @@ -1212,13 +1154,6 @@ "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, - "node_modules/@tailwindcss/vite/node_modules/tailwindcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", - "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1265,34 +1200,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1363,32 +1270,6 @@ "node": ">=6.0.0" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/browserslist": { "version": "4.28.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", @@ -1437,16 +1318,6 @@ "node": ">= 0.4" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001793", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", @@ -1498,44 +1369,6 @@ "node": ">=8" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -1584,16 +1417,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/concurrently": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", @@ -1619,19 +1442,6 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -1669,20 +1479,6 @@ "node": ">=8" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1851,59 +1647,6 @@ "node": ">=6" } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/follow-redirects": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", @@ -2030,19 +1773,6 @@ "node": ">= 0.4" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -2129,45 +1859,6 @@ "node": ">= 6" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "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", @@ -2178,29 +1869,6 @@ "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/jiti": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", @@ -2505,26 +2173,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -2545,30 +2193,6 @@ "node": ">= 0.4" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2608,18 +2232,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nanoid": { "version": "3.3.12", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", @@ -2649,43 +2261,6 @@ "node": ">=18" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -2706,26 +2281,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/postcss": { "version": "8.5.15", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", @@ -2755,133 +2310,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -2908,50 +2336,6 @@ "tweetnacl": "^1.0.3" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2962,39 +2346,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "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/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rollup": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", @@ -3040,30 +2391,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -3155,29 +2482,6 @@ "node": ">=8" } }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -3194,66 +2498,12 @@ "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tailwindcss": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", - "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", + "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } + "license": "MIT" }, "node_modules/tapable": { "version": "2.3.3", @@ -3269,29 +2519,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tinyglobby": { "version": "0.2.16", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", @@ -3340,19 +2567,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -3363,13 +2577,6 @@ "tree-kill": "cli.js" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -3414,13 +2621,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, "node_modules/vite": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", diff --git a/app/package.json b/app/package.json index 475604f..32e86e9 100644 --- a/app/package.json +++ b/app/package.json @@ -14,7 +14,7 @@ "concurrently": "^9.0.1", "laravel-vite-plugin": "^2.0.0", "postcss": "^8.4.31", - "tailwindcss": "^3.4.19", + "tailwindcss": "^4.3.0", "vite": "^7.0.7" }, "dependencies": { diff --git a/app/phpunit.xml b/app/phpunit.xml new file mode 100644 index 0000000..e7f0a48 --- /dev/null +++ b/app/phpunit.xml @@ -0,0 +1,36 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + + + + diff --git a/app/resources/css/app.css b/app/resources/css/app.css index a3c856c..6cbb6ff 100644 --- a/app/resources/css/app.css +++ b/app/resources/css/app.css @@ -1,25 +1,331 @@ @import "tailwindcss"; - @theme { - --color-bg: #0a0a0f; - --color-s1: #111117; - --color-s2: #16161e; - --color-s3: #1c1c26; - --color-b1: rgba(255,255,255,0.06); - --color-b2: rgba(255,255,255,0.10); - --color-t1: #f0f0f5; - --color-t2: #8888a0; - --color-t3: #44445a; - --color-akzent: #4f8ef7; - --color-success: #3ecf8e; - --color-warning: #f5a623; - --color-danger: #f05252; + --color-bg: #0a0a0f; + --color-s0: #0c0c12; + --color-s1: #111117; + --color-s2: #16161e; + --color-s3: #1c1c26; + --color-hover: #1a1a24; + --color-surface: #101019; + --color-surface2: #1d1d28; + --color-b1: rgba(255,255,255,0.06); + --color-b2: rgba(255,255,255,0.10); + --color-t1: #f0f0f5; + --color-t2: #8888a0; + --color-t3: #44445a; + --color-dim: #5c5c70; + --color-akzent: #4f8ef7; + --color-akzent2: #7c5cff; + --color-success: #3ecf8e; + --color-warning: #f5a623; + --color-danger: #f05252; + --color-purple: #c084fc; --font-sans: "Inter", system-ui, sans-serif; --font-mono: "JetBrains Mono", monospace; } +/* ── Keyframes ── */ +@keyframes clu-pulse { 0%{transform:scale(.6);opacity:.5} 100%{transform:scale(2.4);opacity:0} } +@keyframes clu-type-in { to{opacity:1;transform:translateY(0)} } +@keyframes clu-blink { 50%{opacity:0} } +@keyframes clu-spin { to{transform:rotate(360deg)} } +@keyframes clu-dot-pulse { 0%,100%{opacity:1} 50%{opacity:.3} } + @layer utilities { - .dot-pulse { animation: clupilot-pulse 2s infinite; } - @keyframes clupilot-pulse { 0%,100%{opacity:1} 50%{opacity:.3} } + .dot-pulse { animation: clu-dot-pulse 2s infinite; } + .clu-reset { all: revert; } + .clu-spin { animation: clu-spin .8s linear infinite; } +} + +@layer components { + + /* Login ambient background */ + .clu-login-body::before { + content:"";position:fixed;inset:0;z-index:0;pointer-events:none; + background: + radial-gradient(60% 50% at 12% 10%,rgba(79,142,247,.10),transparent 65%), + radial-gradient(50% 50% at 88% 100%,rgba(124,92,255,.08),transparent 65%); + } + .clu-login-body::after { + content:"";position:fixed;inset:0;z-index:0;pointer-events:none; + background-image: + linear-gradient(rgba(255,255,255,.018) 1px,transparent 1px), + linear-gradient(90deg,rgba(255,255,255,.018) 1px,transparent 1px); + background-size:32px 32px; + mask-image:radial-gradient(ellipse at center,#000 30%,transparent 75%); + } + + /* Brand marks */ + .clu-brand-mark { + background:linear-gradient(135deg,#4f8ef7 0%,#7c5cff 100%); + box-shadow:0 0 0 1px rgba(255,255,255,.06) inset,0 6px 16px rgba(79,142,247,.30); + display:grid;place-items:center; + } + .clu-brand-mark::before { + content:"";width:11px;height:11px;border-radius:50%; + background:#0a0a0f;box-shadow:inset 0 0 0 2px #fff; + } + .clu-brand-mark-sm { + background:linear-gradient(135deg,#4f8ef7 0%,#7c5cff 100%); + box-shadow:0 0 0 1px rgba(255,255,255,.06) inset,0 4px 12px rgba(79,142,247,.25); + display:grid;place-items:center; + } + .clu-brand-mark-sm::before { + content:"";width:10px;height:10px;border-radius:50%; + background:#0c0c12;box-shadow:inset 0 0 0 2px #fff; + } + + /* Pulse dot */ + .clu-pulse-dot { position:relative;flex:none; } + .clu-pulse-dot::after { + content:"";position:absolute;inset:-3px;border-radius:50%; + background:currentColor;opacity:.35;animation:clu-pulse 1.8s ease-out infinite; + } + + /* Input with :focus-within */ + .clu-input { + display:flex;align-items:center;gap:10px;padding:0 12px; + background:#101019;border:1px solid rgba(255,255,255,.06);border-radius:8px; + transition:border-color .15s,background .15s,box-shadow .15s;height:40px; + } + .clu-input:hover { border-color:rgba(255,255,255,.10); } + .clu-input:focus-within { + border-color:rgba(79,142,247,.50);background:#12121c; + box-shadow:0 0 0 3px rgba(79,142,247,.10); + } + .clu-input input { + flex:1;background:none;border:0;outline:0; + color:#f0f0f5;font-size:13.5px;font-family:inherit;min-width:0;height:100%; + } + .clu-input input::placeholder { color:#5c5c70; } + + /* Divider */ + .clu-divider { + display:flex;align-items:center;gap:12px;color:#5c5c70; + font-size:11px;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em; + } + .clu-divider::before,.clu-divider::after { + content:"";flex:1;height:1px;background:rgba(255,255,255,.06); + } + + /* SSO button */ + .clu-sso-btn { + display:flex;align-items:center;justify-content:center;gap:8px;padding:9px 12px; + background:#101019;border:1px solid rgba(255,255,255,.06);border-radius:8px; + color:#f0f0f5;font-size:12.5px;font-weight:500;transition:all .15s;cursor:pointer;font-family:inherit; + } + .clu-sso-btn:hover { background:#1d1d28;border-color:rgba(255,255,255,.10); } + + /* Primary button */ + .clu-btn-primary { + display:inline-flex;align-items:center;justify-content:center;gap:8px; + padding:10px 16px;background:#4f8ef7;color:#fff;border-radius:8px; + font-weight:500;font-size:13.5px;height:40px;width:100%; + transition:background .15s,transform .05s;border:none;cursor:pointer;font-family:inherit; + box-shadow:0 1px 0 rgba(255,255,255,.08) inset,0 1px 3px rgba(79,142,247,.35); + } + .clu-btn-primary:hover { background:#5e98f7; } + .clu-btn-primary:active { transform:translateY(1px); } + .clu-btn-primary:disabled { opacity:.7;cursor:not-allowed; } + .clu-btn-primary svg.arrow { transition:transform .15s; } + .clu-btn-primary:hover:not(:disabled) svg.arrow { transform:translateX(2px); } + + /* Alt button */ + .clu-alt-btn { + display:flex;align-items:center;gap:10px;padding:9px 12px; + background:transparent;border:1px solid rgba(255,255,255,.06);border-radius:8px; + font-size:12.5px;color:#f0f0f5;font-weight:500;transition:all .15s; + width:100%;cursor:pointer;font-family:inherit; + } + .clu-alt-btn:hover { border-color:rgba(255,255,255,.10);background:#101019; } + + /* Live side glow */ + .clu-live-side::before { + content:"";position:absolute;inset:0;pointer-events:none; + background:radial-gradient(80% 50% at 100% 0%,rgba(79,142,247,.12),transparent 65%); + } + + /* Terminal */ + .clu-term-line { + display:flex;gap:10px;align-items:flex-start; + opacity:0;transform:translateY(4px);animation:clu-type-in .35s ease forwards; + } + .clu-term-ok { color:#3ecf8e; } + .clu-term-warn { color:#f5a623; } + .clu-term-err { color:#f05252; } + .clu-term-acc { color:#4f8ef7; } + .clu-term-dim { color:#5c5c70; } + .clu-term-pkg { color:#c084fc; } + + /* Cursor */ + .clu-cursor { + display:inline-block;width:7px;height:13px;background:#4f8ef7; + vertical-align:-2px;animation:clu-blink 1s steps(1) infinite;margin-left:2px; + } + + /* Dashboard topbar */ + .clu-topbar { + backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px); + background:rgba(10,10,15,.85); + } + + /* Search */ + .clu-search { + display:flex;align-items:center;gap:8px;padding:6px 10px; + background:#101019;border:1px solid rgba(255,255,255,.06);border-radius:7px; + color:#8888a0;transition:border-color .15s;min-width:280px; + } + .clu-search:hover { border-color:rgba(255,255,255,.10); } + .clu-search:focus-within { border-color:rgba(79,142,247,.5);background:#12121c; } + .clu-search input { + flex:1;background:none;border:0;outline:0; + color:#f0f0f5;font-size:12.5px;font-family:inherit;min-width:0; + } + .clu-search input::placeholder { color:#8888a0; } + + /* Dashboard button */ + .clu-btn-dash { + display:inline-flex;align-items:center;gap:6px;padding:7px 12px; + background:#4f8ef7;color:#fff;border-radius:7px;font-weight:500;font-size:12.5px; + transition:background .15s;border:none;cursor:pointer;font-family:inherit; + box-shadow:0 1px 0 rgba(255,255,255,.08) inset,0 1px 3px rgba(79,142,247,.35); + } + .clu-btn-dash:hover { background:#5e98f7; } + + /* Metric top stripe */ + .clu-metric { position:relative;overflow:hidden; } + .clu-metric::before { content:"";position:absolute;top:0;left:0;right:0;height:2px;background:#4f8ef7; } + .clu-metric-success::before { background:#3ecf8e; } + .clu-metric-warning::before { background:#f5a623; } + .clu-metric-danger::before { background:#f05252; } + .clu-metric-neutral::before { background:#5c5c70; } + + /* Nav active bar */ + .clu-nav-active { position:relative; } + .clu-nav-active::before { + content:"";position:absolute;left:-12px;top:6px;bottom:6px; + width:2px;border-radius:2px;background:#4f8ef7; + } + + /* Row actions */ + .clu-row-actions { display:flex;gap:4px;justify-content:flex-end;opacity:0;transition:opacity .15s; } + tr:hover .clu-row-actions { opacity:1; } + + /* Plan box overlay */ + .clu-plan-box { position:relative;overflow:hidden; } + .clu-plan-box::before { + content:"";position:absolute;inset:0;pointer-events:none; + background:radial-gradient(120% 80% at 0% 0%,rgba(79,142,247,.10),transparent 60%); + } + + /* Chart axis */ + .clu-chart-axis { font-family:var(--font-mono);font-size:9.5px;fill:#5c5c70; } + + /* ── Stepper ── */ + .clu-stepper { display:flex;align-items:center;gap:10px;margin-top:28px;font-family:var(--font-mono);font-size:11px;color:#44445a; } + .clu-step { display:flex;align-items:center;gap:7px; } + .clu-step-num { width:20px;height:20px;border-radius:50%;border:1px solid rgba(255,255,255,.06);display:grid;place-items:center;font-size:10.5px;color:#8888a0;background:#101019; } + .clu-step.active .clu-step-num { border-color:#4f8ef7;color:#4f8ef7;background:rgba(79,142,247,.12); } + .clu-step.done .clu-step-num { border-color:#3ecf8e;color:#0a0a0f;background:#3ecf8e; } + .clu-step-label { font-size:11px;color:#8888a0;text-transform:uppercase;letter-spacing:.06em;font-weight:500; } + .clu-step.active .clu-step-label { color:#f0f0f5; } + .clu-step-line { flex:1;height:1px;background:rgba(255,255,255,.06);min-width:14px;max-width:28px; } + + /* ── Two-column field row ── */ + .clu-field-row { display:grid;grid-template-columns:1fr 1fr;gap:10px; } + + /* ── Input suffix ── */ + .clu-input.with-suffix { padding-right:0; } + .clu-input-suffix { height:100%;display:flex;align-items:center;padding:0 12px;border-left:1px solid rgba(255,255,255,.06);color:#8888a0;font-family:var(--font-mono);font-size:11.5px;background:rgba(255,255,255,.015);border-top-right-radius:8px;border-bottom-right-radius:8px; } + + /* ── Input valid checkmark ── */ + .clu-input-check { color:#3ecf8e;display:none;flex:none; } + .clu-input.valid .clu-input-check { display:inline-flex; } + + /* ── Slug preview ── */ + .clu-slug-preview { font-family:var(--font-mono);font-size:11px;color:#8888a0;margin-top:4px; } + .clu-slug-preview b { color:#4f8ef7;font-weight:500; } + + /* ── Password strength meter ── */ + .clu-pw-meter { display:flex;gap:4px;margin-top:6px; } + .clu-pw-meter span { flex:1;height:3px;border-radius:2px;background:#16161e;transition:background .2s; } + .clu-pw-meter.s1 span:nth-child(-n+1) { background:#f05252; } + .clu-pw-meter.s2 span:nth-child(-n+2) { background:#f5a623; } + .clu-pw-meter.s3 span:nth-child(-n+3) { background:#4f8ef7; } + .clu-pw-meter.s4 span { background:#3ecf8e; } + .clu-pw-rules { display:flex;flex-wrap:wrap;gap:6px 12px;margin-top:6px;font-family:var(--font-mono);font-size:10.5px;color:#5c5c70; } + .clu-pw-rule { display:inline-flex;align-items:center;gap:5px; } + .clu-pw-rule .clu-pw-bullet { width:5px;height:5px;border-radius:50%;background:#5c5c70;transition:background .15s; } + .clu-pw-rule.ok { color:#3ecf8e; } + .clu-pw-rule.ok .clu-pw-bullet { background:#3ecf8e; } + + /* ── Checkbox ── */ + .clu-checkbox { display:flex;align-items:flex-start;gap:10px;font-size:12.5px;color:#8888a0;cursor:pointer;user-select:none;line-height:1.45; } + .clu-checkbox .clu-check-box { width:15px;height:15px;border-radius:4px;border:1px solid rgba(255,255,255,.10);background:#101019;display:grid;place-items:center;transition:all .15s;flex:none;margin-top:1px; } + .clu-checkbox input:checked ~ .clu-check-box { background:#4f8ef7;border-color:#4f8ef7; } + .clu-checkbox input:checked ~ .clu-check-box svg { opacity:1;transform:scale(1); } + .clu-checkbox .clu-check-box svg { opacity:0;transform:scale(.6);transition:all .15s;color:#fff; } + .clu-checkbox:hover { color:#f0f0f5; } + + /* ── Trial card (signup right panel) ── */ + .clu-trial-card { background:#16161e;border:1px solid rgba(255,255,255,.06);border-radius:12px;padding:18px 20px;position:relative;overflow:hidden; } + .clu-trial-card::before { content:"";position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,#4f8ef7,#7c5cff); } + .clu-trial-row { display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px; } + .clu-trial-tag { font-family:var(--font-mono);font-size:10.5px;color:#4f8ef7;background:rgba(79,142,247,.12);padding:3px 8px;border-radius:5px;border:1px solid rgba(79,142,247,.25);font-weight:500;text-transform:uppercase;letter-spacing:.05em; } + .clu-trial-count { font-family:var(--font-mono);font-size:11px;color:#8888a0;display:inline-flex;align-items:center;gap:6px; } + .clu-trial-title { font-size:22px;font-weight:600;letter-spacing:-.015em;line-height:1.25;margin-top:12px; } + .clu-trial-title em { font-style:normal;background:linear-gradient(90deg,#4f8ef7,#a78bfa);-webkit-background-clip:text;background-clip:text;color:transparent;font-weight:700; } + .clu-trial-sub { color:#8888a0;font-size:13px;margin-top:6px; } + + /* ── Benefit list ── */ + .clu-benefit-list { list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:14px; } + .clu-benefit { display:flex;gap:12px;align-items:flex-start; } + .clu-benefit-ico { width:30px;height:30px;border-radius:8px;background:rgba(79,142,247,.12);border:1px solid rgba(79,142,247,.22);color:#4f8ef7;display:grid;place-items:center;flex:none; } + .clu-benefit-ico.success { background:rgba(62,207,142,.12);border-color:rgba(62,207,142,.22);color:#3ecf8e; } + .clu-benefit-ico.purple { background:rgba(124,92,255,.12);border-color:rgba(124,92,255,.25);color:#a78bfa; } + .clu-benefit-ico.warn { background:rgba(245,166,35,.10);border-color:rgba(245,166,35,.22);color:#f5a623; } + .clu-benefit-title { font-size:13.5px;font-weight:500;color:#f0f0f5; } + .clu-benefit-desc { font-size:12.5px;color:#8888a0;margin-top:2px;line-height:1.5; } + + /* ── Quote card ── */ + .clu-quote-card { background:#16161e;border:1px solid rgba(255,255,255,.06);border-radius:12px;padding:18px 20px;margin-top:auto; } + .clu-quote-text { font-size:13.5px;color:#dcdce8;line-height:1.55; } + .clu-quote-text::before { content:"\201E";color:#4f8ef7;font-size:24px;line-height:0;margin-right:4px;vertical-align:-6px;font-weight:600; } + .clu-quote-text::after { content:"\201D";color:#4f8ef7;font-weight:600; } + .clu-quote-author { display:flex;align-items:center;gap:10px;margin-top:12px; } + .clu-avatar { width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#3ecf8e,#2a9d6f);display:grid;place-items:center;color:#0a0a0f;font-weight:600;font-size:12px;font-family:var(--font-mono); } + .clu-author-name { font-size:12px;color:#f0f0f5;font-weight:500; } + .clu-author-role { font-size:11px;color:#8888a0;font-family:var(--font-mono); } + + /* ── Logo strip ── */ + .clu-logos { display:flex;align-items:center;gap:20px;flex-wrap:wrap;opacity:.55;font-family:var(--font-mono);font-size:11px;color:#8888a0;text-transform:uppercase;letter-spacing:.08em; } + .clu-logo-pill { padding:5px 10px;border:1px solid rgba(255,255,255,.06);border-radius:5px;background:#101019; } + + /* Login page responsive grid */ + .clu-login-grid { + display:grid; + grid-template-columns:minmax(420px,1fr) 1fr; + min-height:100vh; + min-height:100dvh; + position:relative; + z-index:10; + } + .clu-form-side { padding:32px 48px; } + .clu-sso-row { display:grid;grid-template-columns:1fr 1fr;gap:8px; } + @media(max-width:1080px){ + .clu-login-grid { grid-template-columns:1fr; } + .clu-live-side { display:none !important; } + .clu-form-side { padding:28px 36px; } + } + @media(max-width:640px){ + .clu-form-side { padding:20px; } + .clu-sso-row { grid-template-columns:1fr; } + .clu-login-status { display:none !important; } + .clu-field-row { grid-template-columns:1fr; } + .clu-step-label { display:none; } + } + @media(max-width:390px){ + .clu-form-side { padding:16px; } + } } diff --git a/app/resources/js/app.js b/app/resources/js/app.js index e59d6a0..4a70671 100644 --- a/app/resources/js/app.js +++ b/app/resources/js/app.js @@ -1 +1,4 @@ import './bootstrap'; +import './login-effects'; +import './register-effects'; +window.__clupilot = 1; diff --git a/app/resources/js/login-effects.js b/app/resources/js/login-effects.js new file mode 100644 index 0000000..db6069f --- /dev/null +++ b/app/resources/js/login-effects.js @@ -0,0 +1,47 @@ +function initLoginEffects() { + const eyeBtn = document.getElementById('toggle-eye'); + const pwd = document.getElementById('password'); + if (eyeBtn && pwd && !eyeBtn.dataset.bound) { + eyeBtn.dataset.bound = '1'; + eyeBtn.addEventListener('click', () => { + pwd.type = pwd.type === 'password' ? 'text' : 'password'; + }); + } + const body = document.getElementById('term-body'); + if (!body || body.dataset.bound) return; + body.dataset.bound = '1'; + const lines = [ + ['09:42:18', '$ clupilot status --cluster=acme'], + ['09:42:18', ' 87/87 sites healthy · 142ms ø response'], + ['09:42:19', ' backup eu-prod-02 → s3://clupilot-backups 248 MB'], + ['09:42:21', ' deploying Yoast-SEO@22.5 to 3 sites…'], + ['09:42:23', ' agentur-helio.com (312ms)'], + ['09:42:24', ' blog.fintech-radar.io (287ms)'], + ['09:42:24', ' docs.opencrate.dev (298ms)'], + ['09:42:26', '! classic.tonhoff-bau.de PHP 7.4 EOL — migration queued'], + ['09:42:28', ' fw blocked 17 attempts from 185.220.101.18 (TOR)'], + ['09:42:30', ' SSL renewed: *.kunde-mueller.de until 2026-08-25'], + ['09:42:32', '$ tail -f /var/log/clupilot/audit.log'], + ]; + let i = 0; + function addLine() { + if (i >= lines.length) { + setTimeout(() => { body.innerHTML = ''; i = 0; addLine(); }, 5000); + return; + } + const [t, html] = lines[i++]; + const el = document.createElement('div'); + el.className = 'clu-term-line'; + el.innerHTML = + '
' + t + '
' + + '
' + html + '
'; + body.appendChild(el); + body.scrollTop = body.scrollHeight; + while (body.children.length > 11) body.removeChild(body.firstChild); + setTimeout(addLine, 600 + Math.random() * 450); + } + addLine(); +} + +document.addEventListener('DOMContentLoaded', initLoginEffects); +document.addEventListener('livewire:navigated', initLoginEffects); diff --git a/app/resources/js/register-effects.js b/app/resources/js/register-effects.js new file mode 100644 index 0000000..66eb0d6 --- /dev/null +++ b/app/resources/js/register-effects.js @@ -0,0 +1,59 @@ +function initRegisterEffects() { + // Workspace slug preview + const ws = document.getElementById('reg-workspace'); + const slugEl = document.getElementById('reg-slug-preview'); + if (ws && slugEl && !ws.dataset.bound) { + ws.dataset.bound = '1'; + const slugify = s => s.toLowerCase().trim() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-|-$/g, '') + .slice(0, 32) || 'dein-team'; + ws.addEventListener('input', () => { slugEl.textContent = slugify(ws.value); }); + } + + // Email valid checkmark + const emailInput = document.getElementById('reg-email'); + const emailWrap = document.getElementById('reg-email-wrap'); + if (emailInput && emailWrap && !emailInput.dataset.bound) { + emailInput.dataset.bound = '1'; + emailInput.addEventListener('input', () => { + emailWrap.classList.toggle('valid', /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(emailInput.value)); + }); + } + + // Password strength meter + rules + const pwd = document.getElementById('reg-password'); + const meter = document.getElementById('reg-pw-meter'); + if (pwd && meter && !pwd.dataset.bound) { + pwd.dataset.bound = '1'; + pwd.addEventListener('input', () => { + const v = pwd.value; + const tests = { + len: v.length >= 10, + upper: /[A-Z]/.test(v), + num: /[0-9]/.test(v), + sym: /[^A-Za-z0-9]/.test(v), + }; + let score = 0; + Object.keys(tests).forEach(k => { + const ok = tests[k]; + const el = document.querySelector('.clu-pw-rule[data-rule="' + k + '"]'); + if (el) { el.classList.toggle('ok', ok); } + if (ok) score++; + }); + meter.className = 'clu-pw-meter' + (v.length ? ' s' + score : ''); + }); + } + + // Password eye toggle + const eyeBtn = document.getElementById('reg-toggle-eye'); + if (pwd && eyeBtn && !eyeBtn.dataset.bound) { + eyeBtn.dataset.bound = '1'; + eyeBtn.addEventListener('click', () => { + pwd.type = pwd.type === 'password' ? 'text' : 'password'; + }); + } +} + +document.addEventListener('DOMContentLoaded', initRegisterEffects); +document.addEventListener('livewire:navigated', initRegisterEffects); diff --git a/app/resources/views/dashboard.blade.php b/app/resources/views/dashboard.blade.php index 66028f2..fbab3c4 100644 --- a/app/resources/views/dashboard.blade.php +++ b/app/resources/views/dashboard.blade.php @@ -1,17 +1,704 @@ - - -

- {{ __('Dashboard') }} -

-
+@extends('layouts.dash') -
-
-
-
- {{ __("You're logged in!") }} -
-
+@section('content') +
+ + {{-- ===== SIDEBAR ===== --}} + + + {{-- ===== MAIN ===== --}} +
+ + {{-- Topbar --}} +
+
+ Acme Cluster + / + Dashboard +
+ + + All systems operational + +
+ + + + +
+ + {{-- Content --}} +
+ + {{-- METRICS --}} +
+
+
+ + Sites Online +
+
+ 87/87 +
+
+ 100% Verfügbarkeit · 24h +
+ +
+ +
+
+ + Ø Response +
+
+ 142ms +
+
+ ↓ 8.4% vs. letzte Woche +
+ +
+ +
+
+ + Updates Pending +
+
24
+
+ 7 kritisch · 17 minor +
+ +
+ +
+
+ + Backups 24h +
+
+ 86/87 +
+
+ 1 fehlgeschlagen · 02:14 UTC +
+ +
+ +
+
+ + Security Events +
+
128
+
+ ↑ 23% Brute-force blockiert +
+ +
+ +
+
+ + Storage +
+
+ 1.84TB +
+
+ 73% von 2.5 TB belegt +
+ +
+
+ + {{-- SERVER TABLE --}} +
+
+

+ + Server-Flotte + 6 nodes +

+
+ + + + +
+
+
+ + + + + + + + + + + + +
ServerSitesCPU · RAM · DiskStandortUptime
+
+
+ + {{-- SITES TABLE --}} +
+
+

+ + WordPress-Sites + 8 sichtbar · 87 gesamt +

+
+ + + +
+
+
+ + + + + + + + + + + + + + + +
SiteServerWPPHPVisitors / 24hUpdatesBackupSecurity
+
+
+ + {{-- BOTTOM ROW --}} +
+ + {{-- Traffic chart --}} +
+
+

+ + Traffic + + live + +

+
+ + + + +
+
+
+
+
+
14.2kreq/min
+
Peak vor 12 min · 16.8k req/min
+
+
+ Requests + Cache hit +
+
+ + + + + + + + + + + + + + + + + + 20k + 15k + 10k + 5k + + + + + + -60m + -45m + -30m + -15m + jetzt + +
+
+ + {{-- Update pipeline --}} +
+
+

+ + Update-Pipeline +

+ 5 aktiv · 19 wartend +
+
+
+ + {{-- Activity feed --}} +
+
+

+ + Live Activity + + live + +

+ letzte 30 min +
+
+
+
+ +
+ CluPilot · region: eu-central-1 · build #4f8a32c · uptime 99.984% +
+
+
+
+ + +@endsection diff --git a/app/resources/views/layouts/app.blade.php b/app/resources/views/layouts/app.blade.php index 363b5d0..d39c60d 100644 --- a/app/resources/views/layouts/app.blade.php +++ b/app/resources/views/layouts/app.blade.php @@ -12,7 +12,7 @@ - @vite(['resources/css/app.css', 'resources/js/app.js']) + @vite(['resources/css/app.css'])
@@ -32,6 +32,7 @@ {{ $slot }}
- + @vite(['resources/js/app.js']) + @livewire('wire-elements-modal') diff --git a/app/resources/views/layouts/dash.blade.php b/app/resources/views/layouts/dash.blade.php new file mode 100644 index 0000000..a90fc33 --- /dev/null +++ b/app/resources/views/layouts/dash.blade.php @@ -0,0 +1,18 @@ + + + + + + + {{ config('app.name', 'CluPilot') }} + + + + @vite(['resources/css/app.css', 'resources/js/app.js']) + @livewireStyles + + + @yield('content') + @livewireScripts + + diff --git a/app/resources/views/layouts/login.blade.php b/app/resources/views/layouts/login.blade.php new file mode 100644 index 0000000..d5c9c94 --- /dev/null +++ b/app/resources/views/layouts/login.blade.php @@ -0,0 +1,18 @@ + + + + + + + Anmelden · {{ config('app.name', 'CluPilot') }} + + + + @vite(['resources/css/app.css', 'resources/js/app.js']) + @livewireStyles + + + {{ $slot }} + @livewireScripts + + diff --git a/app/resources/views/livewire/pages/auth/login.blade.php b/app/resources/views/livewire/pages/auth/login.blade.php index f688340..afe6250 100644 --- a/app/resources/views/livewire/pages/auth/login.blade.php +++ b/app/resources/views/livewire/pages/auth/login.blade.php @@ -5,7 +5,7 @@ use Illuminate\Support\Facades\Session; use Livewire\Attributes\Layout; use Livewire\Volt\Component; -new #[Layout('layouts.guest')] class extends Component +new #[Layout('layouts.login')] class extends Component { public LoginForm $form; @@ -18,61 +18,249 @@ new #[Layout('layouts.guest')] class extends Component } }; ?> -
- + diff --git a/app/resources/views/livewire/pages/auth/register.blade.php b/app/resources/views/livewire/pages/auth/register.blade.php index 3f06ba9..430161b 100644 --- a/app/resources/views/livewire/pages/auth/register.blade.php +++ b/app/resources/views/livewire/pages/auth/register.blade.php @@ -8,79 +8,320 @@ use Illuminate\Validation\Rules; use Livewire\Attributes\Layout; use Livewire\Volt\Component; -new #[Layout('layouts.guest')] class extends Component +new #[Layout('layouts.login')] class extends Component { - public string $name = ''; - public string $email = ''; - public string $password = ''; - public string $password_confirmation = ''; + public string $firstname = ''; + public string $lastname = ''; + public string $email = ''; + public string $workspace = ''; + public string $password = ''; + public bool $terms = false; public function register(): void { - $validated = $this->validate([ - 'name' => ['required', 'string', 'max:255'], - 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class], - 'password' => ['required', 'string', 'confirmed', Rules\Password::defaults()], + $this->validate([ + 'firstname' => ['required', 'string', 'max:255'], + 'lastname' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class], + 'workspace' => ['required', 'string', 'max:255'], + 'password' => ['required', 'string', Rules\Password::min(10)], + 'terms' => ['accepted'], ]); - $validated['password'] = Hash::make($validated['password']); - - event(new Registered($user = User::create($validated))); + $user = User::create([ + 'name' => trim($this->firstname . ' ' . $this->lastname), + 'email' => $this->email, + 'password' => Hash::make($this->password), + ]); + event(new Registered($user)); Auth::login($user); $this->redirect(route('dashboard', absolute: false), navigate: true); } }; ?> -
-

Create account

+