feat: integrate maryUI and update ConnectedApps handling

- Added `mary.php` configuration file for customizable component and route prefixes.
- Upgraded `livewire/livewire` to v4.3 and added `robsontenorio/mary` v2.8 for maryUI support.
- Updated `ConnectedApps` component to fetch data dynamically via `ConnectedAppService`.
- Replaced static services with computed properties and streamlined data mappings in templates.
- Enhanced frontend styling with `daisyUI` and TailwindCSS v4.3 integration.
- Improved user feedback in `ConnectedAppForm` with success/error toasts.
This commit is contained in:
= 2026-05-14 08:47:23 +00:00
parent f90655bc43
commit db8e34b622
17 changed files with 731 additions and 160 deletions

View File

@ -1,10 +1,11 @@
<?php <?php
declare(strict_types=1);
namespace App\Data\ConnectedApp; namespace App\Data\ConnectedApp;
use App\Enums\ConnectionStatusEnum; use App\Enums\ConnectionStatusEnum;
use Spatie\LaravelData\Attributes\MapInputName; use Spatie\LaravelData\Attributes\{MapInputName, WithCast};
use Spatie\LaravelData\Attributes\WithCast;
use Spatie\LaravelData\Casts\EnumCast; use Spatie\LaravelData\Casts\EnumCast;
use Spatie\LaravelData\Data; use Spatie\LaravelData\Data;
use Spatie\LaravelData\Mappers\SnakeCaseMapper; use Spatie\LaravelData\Mappers\SnakeCaseMapper;
@ -16,8 +17,6 @@ public function __construct(
public int $id, public int $id,
#[WithCast(EnumCast::class)] #[WithCast(EnumCast::class)]
public ConnectionStatusEnum $name, public ConnectionStatusEnum $name,
) ) {}
{
}
} }

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace App\Data\Ui\ConnectedApps;
use App\Enums\{ConnectionProtocolEnum, ConnectionStatusEnum};
use App\Models\ConnectedApp;
use Spatie\LaravelData\Data;
final class ConnectedAppData extends Data
{
public function __construct(
public int $id,
public string $name,
public ConnectionProtocolEnum $protocol,
public ?string $provider,
public ConnectionStatusEnum $status,
) {}
public static function fromModel(ConnectedApp $app): self
{
return new self(
id: $app->id,
name: $app->name,
protocol: ConnectionProtocolEnum::tryFrom($app->protocol->name),
provider: $app->provider?->name,
status: ConnectionStatusEnum::tryFrom($app->status->name)
);
}
}

View File

@ -1,19 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Data\Ui\ConnectedServices;
use App\Enums\{ConnectionProtocolEnum, ConnectionStatusEnum};
use Spatie\LaravelData\Data;
final class ConnectedServiceData extends Data
{
public function __construct(
public string $name,
public string $icon,
public ConnectionProtocolEnum $type,
public string $connectionService,
public ConnectionStatusEnum $status,
) {}
}

View File

@ -19,16 +19,16 @@ class ConnectedApp extends Model
{ {
public function protocol(): HasOne public function protocol(): HasOne
{ {
return $this->hasOne(ConnectionProtocol::class, 'id', 'service_protocol_id'); return $this->hasOne(ConnectionProtocol::class, 'id', 'connection_protocol_id');
} }
public function provider(): HasOne public function provider(): HasOne
{ {
return $this->hasOne(ConnectionProvider::class, 'id', 'service_provider_id'); return $this->hasOne(ConnectionProvider::class, 'id', 'connection_provider_id');
} }
public function status(): HasOne public function status(): HasOne
{ {
return $this->hasOne(ConnectionStatus::class, 'id', 'service_status_id'); return $this->hasOne(ConnectionStatus::class, 'id', 'connection_status_id');
} }
} }

View File

@ -5,14 +5,17 @@
namespace App\Services; namespace App\Services;
use App\Data\ConnectedApp\ConnectAppRequest; use App\Data\ConnectedApp\ConnectAppRequest;
use App\Data\Ui\ConnectedApps\ConnectedAppData;
use App\Models\ConnectedApp; use App\Models\ConnectedApp;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Spatie\LaravelData\DataCollection;
use Throwable; use Throwable;
final class ConnectedAppService final class ConnectedAppService
{ {
/** /**
* Create a new connected app. * Create a new connected app.
*
* @throws Throwable * @throws Throwable
*/ */
public function create(ConnectAppRequest $data): void public function create(ConnectAppRequest $data): void
@ -23,4 +26,14 @@ public function create(ConnectAppRequest $data): void
) )
); );
} }
/**
* @return DataCollection<int, ConnectedAppData>
*/
public function getAll(): DataCollection
{
$data = ConnectedApp::with('provider', 'protocol', 'status')->get();
return ConnectedAppData::collect($data, DataCollection::class);
}
} }

View File

@ -1,5 +1,7 @@
<?php <?php
declare(strict_types=1);
namespace App\Services; namespace App\Services;
use App\Data\ConnectedApp\ConnectionStatusData; use App\Data\ConnectedApp\ConnectionStatusData;
@ -14,6 +16,7 @@ class ConnectionStatusService
public function getAll(): DataCollection public function getAll(): DataCollection
{ {
$statuses = ConnectionStatus::query()->get(); $statuses = ConnectionStatus::query()->get();
return ConnectionStatusData::collect($statuses, DataCollection::class); return ConnectionStatusData::collect($statuses, DataCollection::class);
} }
} }

View File

@ -15,8 +15,9 @@
"laravel/framework": "^13.7", "laravel/framework": "^13.7",
"laravel/tinker": "^3.0", "laravel/tinker": "^3.0",
"livewire/flux": "^2.13.1", "livewire/flux": "^2.13.1",
"livewire/livewire": "^4.1", "livewire/livewire": "^4.3",
"mallardduck/blade-lucide-icons": "^1.26", "mallardduck/blade-lucide-icons": "^1.26",
"robsontenorio/mary": "^2.8",
"spatie/laravel-data": "^4.22", "spatie/laravel-data": "^4.22",
"spatie/laravel-permission": "^7.4" "spatie/laravel-permission": "^7.4"
}, },

394
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "c67b7d3d288d70102f45a51aac214c15", "content-hash": "87c14752eaead13e07a445ce4a569510",
"packages": [ "packages": [
{ {
"name": "bacon/bacon-qr-code", "name": "bacon/bacon-qr-code",
@ -61,6 +61,75 @@
}, },
"time": "2026-04-05T21:06:35+00:00" "time": "2026-04-05T21:06:35+00:00"
}, },
{
"name": "blade-ui-kit/blade-heroicons",
"version": "2.7.0",
"source": {
"type": "git",
"url": "https://github.com/driesvints/blade-heroicons.git",
"reference": "66fa8ba09dba12e0cdb410b8cb94f3b890eca440"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/driesvints/blade-heroicons/zipball/66fa8ba09dba12e0cdb410b8cb94f3b890eca440",
"reference": "66fa8ba09dba12e0cdb410b8cb94f3b890eca440",
"shasum": ""
},
"require": {
"blade-ui-kit/blade-icons": "^1.6",
"illuminate/support": "^9.0|^10.0|^11.0|^12.0|^13.0",
"php": "^8.0"
},
"require-dev": {
"orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0",
"phpunit/phpunit": "^9.0|^10.5|^11.0|^12.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"BladeUI\\Heroicons\\BladeHeroiconsServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"BladeUI\\Heroicons\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Dries Vints",
"homepage": "https://driesvints.com"
}
],
"description": "A package to easily make use of Heroicons in your Laravel Blade views.",
"homepage": "https://github.com/driesvints/blade-heroicons",
"keywords": [
"Heroicons",
"blade",
"laravel"
],
"support": {
"issues": "https://github.com/driesvints/blade-heroicons/issues",
"source": "https://github.com/driesvints/blade-heroicons/tree/2.7.0"
},
"funding": [
{
"url": "https://github.com/sponsors/driesvints",
"type": "github"
},
{
"url": "https://www.paypal.com/paypalme/driesvints",
"type": "paypal"
}
],
"time": "2026-03-16T13:00:23+00:00"
},
{ {
"name": "blade-ui-kit/blade-icons", "name": "blade-ui-kit/blade-icons",
"version": "1.10.0", "version": "1.10.0",
@ -1428,6 +1497,243 @@
], ],
"time": "2025-08-22T14:27:06+00:00" "time": "2025-08-22T14:27:06+00:00"
}, },
{
"name": "jfcherng/php-color-output",
"version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/jfcherng/php-color-output.git",
"reference": "6c7bf16686cc6a291647fcb87491640a2d5edd20"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jfcherng/php-color-output/zipball/6c7bf16686cc6a291647fcb87491640a2d5edd20",
"reference": "6c7bf16686cc6a291647fcb87491640a2d5edd20",
"shasum": ""
},
"require": {
"php": ">=7.1.3"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.19",
"liip/rmt": "^1.6",
"phan/phan": "^2 || ^3 || ^4",
"phpunit/phpunit": ">=7 <10",
"squizlabs/php_codesniffer": "^3.5"
},
"type": "library",
"autoload": {
"psr-4": {
"Jfcherng\\Utility\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jack Cherng",
"email": "jfcherng@gmail.com"
}
],
"description": "Make your PHP command-line application colorful.",
"keywords": [
"ansi-colors",
"color",
"command-line",
"str-color"
],
"support": {
"issues": "https://github.com/jfcherng/php-color-output/issues",
"source": "https://github.com/jfcherng/php-color-output/tree/3.0.0"
},
"funding": [
{
"url": "https://www.paypal.me/jfcherng/5usd",
"type": "custom"
}
],
"time": "2021-05-27T02:45:54+00:00"
},
{
"name": "jfcherng/php-diff",
"version": "6.16.2",
"source": {
"type": "git",
"url": "https://github.com/jfcherng/php-diff.git",
"reference": "7f46bcfc582e81769237d0b3f6b8a548efe8799d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jfcherng/php-diff/zipball/7f46bcfc582e81769237d0b3f6b8a548efe8799d",
"reference": "7f46bcfc582e81769237d0b3f6b8a548efe8799d",
"shasum": ""
},
"require": {
"jfcherng/php-color-output": "^3",
"jfcherng/php-mb-string": "^1.4.6 || ^2",
"jfcherng/php-sequence-matcher": "^3.2.10 || ^4",
"php": ">=7.4"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.51",
"liip/rmt": "^1.6",
"phan/phan": "^5",
"phpunit/phpunit": "^9",
"squizlabs/php_codesniffer": "^3.6"
},
"type": "library",
"autoload": {
"psr-4": {
"Jfcherng\\Diff\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Jack Cherng",
"email": "jfcherng@gmail.com"
},
{
"name": "Chris Boulton",
"email": "chris.boulton@interspire.com"
}
],
"description": "A comprehensive library for generating differences between two strings in multiple formats (unified, side by side HTML etc).",
"keywords": [
"diff",
"udiff",
"unidiff",
"unified diff"
],
"support": {
"issues": "https://github.com/jfcherng/php-diff/issues",
"source": "https://github.com/jfcherng/php-diff/tree/6.16.2"
},
"funding": [
{
"url": "https://www.paypal.me/jfcherng/5usd",
"type": "custom"
}
],
"time": "2024-03-10T17:40:29+00:00"
},
{
"name": "jfcherng/php-mb-string",
"version": "2.0.1",
"source": {
"type": "git",
"url": "https://github.com/jfcherng/php-mb-string.git",
"reference": "8407bfefde47849c9e7c9594e6de2ac85a0f845d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jfcherng/php-mb-string/zipball/8407bfefde47849c9e7c9594e6de2ac85a0f845d",
"reference": "8407bfefde47849c9e7c9594e6de2ac85a0f845d",
"shasum": ""
},
"require": {
"ext-iconv": "*",
"php": ">=8.1"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3",
"phan/phan": "^5",
"phpunit/phpunit": "^9 || ^10"
},
"suggest": {
"ext-iconv": "Either \"ext-iconv\" or \"ext-mbstring\" is requried.",
"ext-mbstring": "Either \"ext-iconv\" or \"ext-mbstring\" is requried."
},
"type": "library",
"autoload": {
"psr-4": {
"Jfcherng\\Utility\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jack Cherng",
"email": "jfcherng@gmail.com"
}
],
"description": "A high performance multibytes sting implementation for frequently reading/writing operations.",
"support": {
"issues": "https://github.com/jfcherng/php-mb-string/issues",
"source": "https://github.com/jfcherng/php-mb-string/tree/2.0.1"
},
"funding": [
{
"url": "https://www.paypal.me/jfcherng/5usd",
"type": "custom"
}
],
"time": "2023-04-17T14:23:16+00:00"
},
{
"name": "jfcherng/php-sequence-matcher",
"version": "4.0.3",
"source": {
"type": "git",
"url": "https://github.com/jfcherng/php-sequence-matcher.git",
"reference": "d2038ac29627340a7458609072a8ba355e80ec5b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jfcherng/php-sequence-matcher/zipball/d2038ac29627340a7458609072a8ba355e80ec5b",
"reference": "d2038ac29627340a7458609072a8ba355e80ec5b",
"shasum": ""
},
"require": {
"php": ">=8.1"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3",
"phan/phan": "^5",
"phpunit/phpunit": "^9 || ^10",
"squizlabs/php_codesniffer": "^3.7"
},
"type": "library",
"autoload": {
"psr-4": {
"Jfcherng\\Diff\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Jack Cherng",
"email": "jfcherng@gmail.com"
},
{
"name": "Chris Boulton",
"email": "chris.boulton@interspire.com"
}
],
"description": "A longest sequence matcher. The logic is primarily based on the Python difflib package.",
"support": {
"issues": "https://github.com/jfcherng/php-sequence-matcher/issues",
"source": "https://github.com/jfcherng/php-sequence-matcher/tree/4.0.3"
},
"funding": [
{
"url": "https://www.paypal.me/jfcherng/5usd",
"type": "custom"
}
],
"time": "2023-05-21T07:57:08+00:00"
},
{ {
"name": "laravel/fortify", "name": "laravel/fortify",
"version": "v1.37.0", "version": "v1.37.0",
@ -4352,6 +4658,92 @@
}, },
"time": "2025-12-14T04:43:48+00:00" "time": "2025-12-14T04:43:48+00:00"
}, },
{
"name": "robsontenorio/mary",
"version": "2.8.2",
"source": {
"type": "git",
"url": "https://github.com/robsontenorio/mary.git",
"reference": "fee6e23a158c54c682b5dd5d7c9377ba4889761a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/robsontenorio/mary/zipball/fee6e23a158c54c682b5dd5d7c9377ba4889761a",
"reference": "fee6e23a158c54c682b5dd5d7c9377ba4889761a",
"shasum": ""
},
"require": {
"blade-ui-kit/blade-heroicons": "^2.6",
"illuminate/support": "^10.0|^11.0|^12.0|^13.0",
"jfcherng/php-diff": "^6.15",
"laravel/prompts": "^0|^1"
},
"require-dev": {
"orchestra/testbench": "^8|^9|^10|^11.0",
"phpunit/phpunit": "^10|^11|^12.5.12"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Mary": "Mary\\Facades\\Mary"
},
"providers": [
"Mary\\MaryServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Mary\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Robson Tenório",
"email": "rrtenorio@gmail.com",
"homepage": "https://github.com/robsontenorio"
}
],
"description": "Gorgeous UI components for Livewire powered by daisyUI and Tailwind",
"homepage": "https://mary-ui.com",
"keywords": [
"DaisyUI",
"alpinejs",
"blade",
"blade ui components",
"components",
"laravel",
"livewire",
"livewire components",
"livewire packages",
"livewire ui",
"livewire ui components",
"livewire-components",
"livewire-packages",
"tailwind",
"tallstack",
"tallstack components",
"tallstack ui",
"tallstackui",
"ui"
],
"support": {
"issues": "https://github.com/robsontenorio/mary/issues",
"source": "https://github.com/robsontenorio/mary/tree/2.8.2"
},
"funding": [
{
"url": "https://github.com/robsontenorio",
"type": "github"
}
],
"time": "2026-04-17T13:40:53+00:00"
},
{ {
"name": "spatie/laravel-data", "name": "spatie/laravel-data",
"version": "4.23.0", "version": "4.23.0",

46
config/mary.php Normal file
View File

@ -0,0 +1,46 @@
<?php
declare(strict_types=1);
return [
/**
* Default component prefix.
*
* Make sure to clear view cache after renaming with `php artisan view:clear`
*
* prefix => ''
* <x-button />
* <x-card />
*
* prefix => 'mary-'
* <x-mary-button />
* <x-mary-card />
*/
'prefix' => 'mary-',
/**
* Default route prefix.
*
* Some maryUI components make network request to its internal routes.
*
* route_prefix => ''
* - Spotlight: '/mary/spotlight'
* - Editor: '/mary/upload'
* - ...
*
* route_prefix => 'my-components'
* - Spotlight: '/my-components/mary/spotlight'
* - Editor: '/my-components/mary/upload'
* - ...
*/
'route_prefix' => '',
/**
* Components settings
*/
'components' => [
'spotlight' => [
'class' => 'App\Support\Spotlight',
],
],
];

View File

@ -4,7 +4,7 @@
namespace Database\Seeders; namespace Database\Seeders;
use App\Enums\{ConnectionProtocolEnum}; use App\Enums\ConnectionProtocolEnum;
use App\Models\ConnectionProtocol; use App\Models\ConnectionProtocol;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;

198
package-lock.json generated
View File

@ -5,13 +5,16 @@
"packages": { "packages": {
"": { "": {
"dependencies": { "dependencies": {
"@tailwindcss/vite": "^4.1.11",
"autoprefixer": "^10.4.20", "autoprefixer": "^10.4.20",
"concurrently": "^9.0.1", "concurrently": "^9.0.1",
"laravel-vite-plugin": "^3.1", "laravel-vite-plugin": "^3.1",
"tailwindcss": "^4.0.7",
"vite": "^8.0.0" "vite": "^8.0.0"
}, },
"devDependencies": {
"@tailwindcss/vite": "^4.3.0",
"daisyui": "^5.5.19",
"tailwindcss": "^4.3.0"
},
"optionalDependencies": { "optionalDependencies": {
"@rollup/rollup-linux-x64-gnu": "4.9.5", "@rollup/rollup-linux-x64-gnu": "4.9.5",
"@tailwindcss/oxide-linux-x64-gnu": "^4.0.1", "@tailwindcss/oxide-linux-x64-gnu": "^4.0.1",
@ -53,6 +56,7 @@
"version": "0.3.13", "version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/sourcemap-codec": "^1.5.0",
@ -63,6 +67,7 @@
"version": "2.3.5", "version": "2.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/gen-mapping": "^0.3.5",
@ -73,6 +78,7 @@
"version": "3.1.2", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=6.0.0" "node": ">=6.0.0"
@ -82,12 +88,14 @@
"version": "1.5.5", "version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@jridgewell/trace-mapping": { "node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31", "version": "0.3.31",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/resolve-uri": "^3.1.0",
@ -383,50 +391,53 @@
] ]
}, },
"node_modules/@tailwindcss/node": { "node_modules/@tailwindcss/node": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz",
"integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==", "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@jridgewell/remapping": "^2.3.5", "@jridgewell/remapping": "^2.3.5",
"enhanced-resolve": "^5.19.0", "enhanced-resolve": "^5.21.0",
"jiti": "^2.6.1", "jiti": "^2.6.1",
"lightningcss": "1.32.0", "lightningcss": "1.32.0",
"magic-string": "^0.30.21", "magic-string": "^0.30.21",
"source-map-js": "^1.2.1", "source-map-js": "^1.2.1",
"tailwindcss": "4.2.4" "tailwindcss": "4.3.0"
} }
}, },
"node_modules/@tailwindcss/oxide": { "node_modules/@tailwindcss/oxide": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz",
"integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==", "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 20" "node": ">= 20"
}, },
"optionalDependencies": { "optionalDependencies": {
"@tailwindcss/oxide-android-arm64": "4.2.4", "@tailwindcss/oxide-android-arm64": "4.3.0",
"@tailwindcss/oxide-darwin-arm64": "4.2.4", "@tailwindcss/oxide-darwin-arm64": "4.3.0",
"@tailwindcss/oxide-darwin-x64": "4.2.4", "@tailwindcss/oxide-darwin-x64": "4.3.0",
"@tailwindcss/oxide-freebsd-x64": "4.2.4", "@tailwindcss/oxide-freebsd-x64": "4.3.0",
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0",
"@tailwindcss/oxide-linux-arm64-gnu": "4.2.4", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0",
"@tailwindcss/oxide-linux-arm64-musl": "4.2.4", "@tailwindcss/oxide-linux-arm64-musl": "4.3.0",
"@tailwindcss/oxide-linux-x64-gnu": "4.2.4", "@tailwindcss/oxide-linux-x64-gnu": "4.3.0",
"@tailwindcss/oxide-linux-x64-musl": "4.2.4", "@tailwindcss/oxide-linux-x64-musl": "4.3.0",
"@tailwindcss/oxide-wasm32-wasi": "4.2.4", "@tailwindcss/oxide-wasm32-wasi": "4.3.0",
"@tailwindcss/oxide-win32-arm64-msvc": "4.2.4", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0",
"@tailwindcss/oxide-win32-x64-msvc": "4.2.4" "@tailwindcss/oxide-win32-x64-msvc": "4.3.0"
} }
}, },
"node_modules/@tailwindcss/oxide-android-arm64": { "node_modules/@tailwindcss/oxide-android-arm64": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz",
"integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==", "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@ -437,12 +448,13 @@
} }
}, },
"node_modules/@tailwindcss/oxide-darwin-arm64": { "node_modules/@tailwindcss/oxide-darwin-arm64": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz",
"integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==", "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@ -453,12 +465,13 @@
} }
}, },
"node_modules/@tailwindcss/oxide-darwin-x64": { "node_modules/@tailwindcss/oxide-darwin-x64": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz",
"integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==", "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@ -469,12 +482,13 @@
} }
}, },
"node_modules/@tailwindcss/oxide-freebsd-x64": { "node_modules/@tailwindcss/oxide-freebsd-x64": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz",
"integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==", "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@ -485,12 +499,13 @@
} }
}, },
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz",
"integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==", "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@ -501,12 +516,16 @@
} }
}, },
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": { "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz",
"integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==", "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@ -517,12 +536,16 @@
} }
}, },
"node_modules/@tailwindcss/oxide-linux-arm64-musl": { "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz",
"integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==", "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@ -533,12 +556,15 @@
} }
}, },
"node_modules/@tailwindcss/oxide-linux-x64-gnu": { "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz",
"integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==", "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@ -549,12 +575,16 @@
} }
}, },
"node_modules/@tailwindcss/oxide-linux-x64-musl": { "node_modules/@tailwindcss/oxide-linux-x64-musl": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz",
"integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==", "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@ -565,9 +595,9 @@
} }
}, },
"node_modules/@tailwindcss/oxide-wasm32-wasi": { "node_modules/@tailwindcss/oxide-wasm32-wasi": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz",
"integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==", "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==",
"bundleDependencies": [ "bundleDependencies": [
"@napi-rs/wasm-runtime", "@napi-rs/wasm-runtime",
"@emnapi/core", "@emnapi/core",
@ -579,13 +609,14 @@
"cpu": [ "cpu": [
"wasm32" "wasm32"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@emnapi/core": "^1.8.1", "@emnapi/core": "^1.10.0",
"@emnapi/runtime": "^1.8.1", "@emnapi/runtime": "^1.10.0",
"@emnapi/wasi-threads": "^1.1.0", "@emnapi/wasi-threads": "^1.2.1",
"@napi-rs/wasm-runtime": "^1.1.1", "@napi-rs/wasm-runtime": "^1.1.4",
"@tybys/wasm-util": "^0.10.1", "@tybys/wasm-util": "^0.10.1",
"tslib": "^2.8.1" "tslib": "^2.8.1"
}, },
@ -594,12 +625,13 @@
} }
}, },
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": { "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz",
"integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==", "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@ -610,12 +642,13 @@
} }
}, },
"node_modules/@tailwindcss/oxide-win32-x64-msvc": { "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz",
"integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==", "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@ -626,14 +659,15 @@
} }
}, },
"node_modules/@tailwindcss/vite": { "node_modules/@tailwindcss/vite": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.4.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.0.tgz",
"integrity": "sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==", "integrity": "sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@tailwindcss/node": "4.2.4", "@tailwindcss/node": "4.3.0",
"@tailwindcss/oxide": "4.2.4", "@tailwindcss/oxide": "4.3.0",
"tailwindcss": "4.2.4" "tailwindcss": "4.3.0"
}, },
"peerDependencies": { "peerDependencies": {
"vite": "^5.2.0 || ^6 || ^7 || ^8" "vite": "^5.2.0 || ^6 || ^7 || ^8"
@ -858,6 +892,16 @@
"url": "https://github.com/open-cli-tools/concurrently?sponsor=1" "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
} }
}, },
"node_modules/daisyui": {
"version": "5.5.19",
"resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.5.19.tgz",
"integrity": "sha512-pbFAkl1VCEh/MPCeclKL61I/MqRIFFhNU7yiXoDDRapXN4/qNCoMxeCCswyxEEhqL5eiTTfwHvucFtOE71C9sA==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/saadeghi/daisyui?sponsor=1"
}
},
"node_modules/detect-libc": { "node_modules/detect-libc": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
@ -880,9 +924,10 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/enhanced-resolve": { "node_modules/enhanced-resolve": {
"version": "5.21.0", "version": "5.21.3",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz",
"integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", "integrity": "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"graceful-fs": "^4.2.4", "graceful-fs": "^4.2.4",
@ -958,6 +1003,7 @@
"version": "4.2.11", "version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/has-flag": { "node_modules/has-flag": {
@ -982,6 +1028,7 @@
"version": "2.7.0", "version": "2.7.0",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
"integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
"devOptional": true,
"license": "MIT", "license": "MIT",
"bin": { "bin": {
"jiti": "lib/jiti-cli.mjs" "jiti": "lib/jiti-cli.mjs"
@ -1266,6 +1313,7 @@
"version": "0.30.21", "version": "0.30.21",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.5" "@jridgewell/sourcemap-codec": "^1.5.5"
@ -1461,15 +1509,17 @@
} }
}, },
"node_modules/tailwindcss": { "node_modules/tailwindcss": {
"version": "4.2.4", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz",
"integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==", "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/tapable": { "node_modules/tapable": {
"version": "2.3.3", "version": "2.3.3",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
"integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=6" "node": ">=6"

View File

@ -7,16 +7,19 @@
"dev": "vite" "dev": "vite"
}, },
"dependencies": { "dependencies": {
"@tailwindcss/vite": "^4.1.11",
"autoprefixer": "^10.4.20", "autoprefixer": "^10.4.20",
"concurrently": "^9.0.1", "concurrently": "^9.0.1",
"laravel-vite-plugin": "^3.1", "laravel-vite-plugin": "^3.1",
"tailwindcss": "^4.0.7",
"vite": "^8.0.0" "vite": "^8.0.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@rollup/rollup-linux-x64-gnu": "4.9.5", "@rollup/rollup-linux-x64-gnu": "4.9.5",
"@tailwindcss/oxide-linux-x64-gnu": "^4.0.1", "@tailwindcss/oxide-linux-x64-gnu": "^4.0.1",
"lightningcss-linux-x64-gnu": "^1.29.1" "lightningcss-linux-x64-gnu": "^1.29.1"
},
"devDependencies": {
"@tailwindcss/vite": "^4.3.0",
"daisyui": "^5.5.19",
"tailwindcss": "^4.3.0"
} }
} }

View File

@ -52,7 +52,7 @@ [data-flux-field]:not(ui-radio, ui-checkbox) {
} }
[data-flux-label] { [data-flux-label] {
@apply !mb-0 !leading-tight; @apply !mb-0 !leading-tight;
} }
input:focus[data-flux-control], input:focus[data-flux-control],
@ -64,3 +64,69 @@ select:focus[data-flux-control] {
/* \[:where(&)\]:size-4 { /* \[:where(&)\]:size-4 {
@apply size-4; @apply size-4;
} */ } */
/**
The lines above are intact.
The lines below were added by maryUI installer.
*/
/** daisyUI */
@plugin "daisyui" {
themes: light --default
}
@plugin "daisyui/theme" {
name: "light";
default: true;
prefersdark: false;
color-scheme: "light";
--color-base-100: oklch(100% 0 0);
--color-base-200: oklch(98% 0 0);
--color-base-300: oklch(95% 0 0);
--color-base-content: oklch(21% 0.006 285.885);
--color-primary: oklch(54% 0.245 262.881);
--color-primary-content: oklch(97% 0.014 254.604);
--color-secondary: oklch(65% 0.241 354.308);
--color-secondary-content: oklch(94% 0.028 342.258);
--color-accent: oklch(77% 0.152 181.912);
--color-accent-content: oklch(38% 0.063 188.416);
--color-neutral: oklch(14% 0.005 285.823);
--color-neutral-content: oklch(92% 0.004 286.32);
--color-info: oklch(74% 0.16 232.661);
--color-info-content: oklch(29% 0.066 243.157);
--color-success: oklch(76% 0.177 163.223);
--color-success-content: oklch(37% 0.077 168.94);
--color-warning: oklch(82% 0.189 84.429);
--color-warning-content: oklch(41% 0.112 45.904);
--color-error: oklch(71% 0.194 13.428);
--color-error-content: oklch(27% 0.105 12.094);
--radius-selector: 0.5rem;
--radius-field: 0.5rem;
--radius-box: 1rem;
--size-selector: 0.25rem;
--size-field: 0.25rem;
--border: 1px;
--depth: 0;
--noise: 0;
}
/* maryUI */
@source "../../vendor/robsontenorio/mary/src/View/Components/**/*.php";
/* Theme toggle */
@custom-variant dark (&:where(.dark, .dark *));
/**
* Paginator - Traditional style
* Because Laravel defaults does not match well the design of daisyUI.
*/
.mary-table-pagination span[aria-current="page"] > span {
@apply bg-primary text-base-100
}
.mary-table-pagination button {
@apply cursor-pointer
}

View File

@ -1,57 +1,36 @@
<?php <?php
use App\Data\Ui\ConnectedServices\ConnectedServiceData; use App\Data\Ui\ConnectedApps\ConnectedAppData;
use App\Enums\ConnectionProtocolEnum; use App\Enums\ConnectionProtocolEnum;
use App\Enums\ConnectionStatusEnum; use App\Enums\ConnectionStatusEnum;
use App\Enums\ConnectionProtocols; use App\Services\ConnectedAppService;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Livewire\Attributes\Computed;
use Livewire\Component; use Livewire\Component;
use Spatie\LaravelData\Attributes\DataCollectionOf; use Spatie\LaravelData\Attributes\DataCollectionOf;
use Spatie\LaravelData\DataCollection; use Spatie\LaravelData\DataCollection;
new class extends Component { new class extends Component {
#[DataCollectionOf(ConnectedServiceData::class)] #[DataCollectionOf(ConnectedAppData::class)]
public DataCollection $connectedServices; public DataCollection $connectedApps;
public function mount(): void public function mount(): void
{ {
$this->connectedServices = ConnectedServiceData::collect([ $this->connectedApps = $this->getConnectedApps();
new ConnectedServiceData( }
name: 'Microsoft Outlook',
icon: 'home', #[Computed]
type: ConnectionProtocolEnum::OIDC, private function getConnectedApps()
connectionService: 'Azure AD', {
status: ConnectionStatusEnum::Connected $service = app(ConnectedAppService::class);
), return $service->getAll();
new ConnectedServiceData(
name: 'Microsoft Teams',
icon: 'home',
type: ConnectionProtocolEnum::OIDC,
connectionService: 'Azure AD',
status: ConnectionStatusEnum::Pending
),
new ConnectedServiceData(
name: 'Keka HR',
icon: 'home',
type: ConnectionProtocolEnum::SAML,
connectionService: 'KeKA',
status: ConnectionStatusEnum::Disconnected
),
new ConnectedServiceData(
name: 'Trutimer',
icon: 'home',
type: ConnectionProtocolEnum::SAML,
connectionService: 'Redmine',
status: ConnectionStatusEnum::Error
),
], DataCollection::class);
} }
}; };
?> ?>
<div class="flex overflow-x-auto gap-x-4"> <div class="flex overflow-x-auto gap-x-4">
@foreach ($connectedServices as $service) @foreach ($connectedApps as $app)
<x-shared.card class="min-w-60 p-4"> <x-shared.card class="min-w-60 p-4" wire:key="{{$app->id}}">
<div class="flex space-x-4"> <div class="flex space-x-4">
<div class="bg-blue-200 p-4 rounded-lg flex items-center justify-center max-h-10"> <div class="bg-blue-200 p-4 rounded-lg flex items-center justify-center max-h-10">
<svg role="img" class="w-4 h-4" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title> <svg role="img" class="w-4 h-4" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>
@ -61,8 +40,8 @@ public function mount(): void
</svg> </svg>
</div> </div>
<div class="flex flex-col"> <div class="flex flex-col">
<p class="font-medium">{{$service->name}}</p> <p class="font-medium">{{$app->name}}</p>
<p class="text-sm text-gray-600">{{$service->type->name}} - {{$service->connectionService}}</p> <p class="text-sm text-gray-600">{{$app->protocol->name}} - {{$app->provider}}</p>
</div> </div>
</div> </div>
<div class="mt-4 flex space-x-2.5 justify-between items-center"> <div class="mt-4 flex space-x-2.5 justify-between items-center">
@ -70,13 +49,13 @@ public function mount(): void
<div <div
@class([ @class([
"w-2 h-2 rounded-full", "w-2 h-2 rounded-full",
'bg-green-400' => $service->status === ConnectionStatusEnum::Connected, 'bg-green-400' => $app->status === ConnectionStatusEnum::Connected,
'bg-gray-400' => $service->status === ConnectionStatusEnum::Disconnected, 'bg-gray-400' => $app->status === ConnectionStatusEnum::Disconnected,
'bg-yellow-400' => $service->status === ConnectionStatusEnum::Pending, 'bg-yellow-400' => $app->status === ConnectionStatusEnum::Pending,
'bg-red-400' => $service->status === ConnectionStatusEnum::Error, 'bg-red-400' => $app->status === ConnectionStatusEnum::Error,
]) ])
></div> ></div>
<p class="text-sm">{{ucfirst($service->status->name)}}</p> <p class="text-sm">{{ucfirst($app->status->name)}}</p>
</div> </div>
<x-shared.button>Revoke</x-shared.button> <x-shared.button>Revoke</x-shared.button>
</div> </div>

View File

@ -8,25 +8,26 @@
?> ?>
<div> <div>
<x-shared.card title="Connected Services" icon="lucide-grid-2x2-plus" class="p-0"> <x-shared.card title="Connected Apps" icon="lucide-grid-2x2-plus" class="p-0">
<x-slot:actions> <x-slot:actions>
<x-shared.button :link="route('connected-apps.create')"> <x-shared.button :link="route('connected-apps.create')">
<div class="flex items-center gap-x-2"> <div class="flex items-center gap-x-2">
<x-lucide-plus class="w-5 h-5"/> <x-lucide-plus class="w-5 h-5"/>
{{ __('Add service') }} {{ __('Connect App') }}
</div> </div>
</x-shared.button> </x-shared.button>
</x-slot:actions> </x-slot:actions>
<x-shared.tabs.tabs wire:model="selectedTab" class="px-4"> <x-mary-tabs wire:model="selectedTab" class="px-4" label-div-class="pt-3 bg-gray-50 border-b border-gray-200"
<x-shared.tabs.tab name="all-tab" label="All" class=""> label-class=" font-bold pb-3">
<x-mary-tab name="all-tab" label="All" class="">
<livewire:dashboard.connected-apps.all/> <livewire:dashboard.connected-apps.all/>
</x-shared.tabs.tab> </x-mary-tab>
<x-shared.tabs.tab name="oidc-tab" label="OIDC"> <x-mary-tab name="oidc-tab" label="OIDC">
<div>Tricks</div> <div>Tricks</div>
</x-shared.tabs.tab> </x-mary-tab>
<x-shared.tabs.tab name="saml-tab" label="SAML"> <x-mary-tab name="saml-tab" label="SAML">
<div>Musics</div> <div>Musics</div>
</x-shared.tabs.tab> </x-mary-tab>
</x-shared.tabs.tabs> </x-mary-tabs>
</x-shared.card> </x-shared.card>
</div> </div>

View File

@ -14,6 +14,7 @@
{{ $slot }} {{ $slot }}
</main> </main>
</div> </div>
<x-mary-toast/>
</div> </div>
@livewireScripts @livewireScripts
</body> </body>

View File

@ -13,11 +13,13 @@
use Livewire\Attributes\Computed; use Livewire\Attributes\Computed;
use Livewire\Component; use Livewire\Component;
use Livewire\Attributes\Title; use Livewire\Attributes\Title;
use Mary\Traits\Toast;
use Spatie\LaravelData\DataCollection; use Spatie\LaravelData\DataCollection;
new new
#[Title('Create a service')] #[Title('Create a service')]
class extends Component { class extends Component {
use Toast;
public StoreConnectedAppFrom $form; public StoreConnectedAppFrom $form;
@ -65,7 +67,10 @@ public function save()
{ {
try { try {
$this->form->save(); $this->form->save();
$this->success('New App connected ');
return to_route('dashboard');
} catch (Throwable $e) { } catch (Throwable $e) {
$this->error('Something gone wrong. Try again');
\Illuminate\Support\Facades\Log::error('Error while submitting Create a connected app', [$e->getMessage()]); \Illuminate\Support\Facades\Log::error('Error while submitting Create a connected app', [$e->getMessage()]);
} }
} }