diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b703900c..35895582 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,9 +1,8 @@ name: CI on: - push: pull_request: - + workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/README.md b/README.md index d52746b7..26200274 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Laravel Forge Site Deployment Status](https://img.shields.io/endpoint?url=https%3A%2F%2Fforge.laravel.com%2Fsite-badges%2F454ef724-eb70-4aaf-b396-ab7d9ca383cf&style=plastic)](https://forge.laravel.com/torben-evald-hansen/tall-hamlet-iuu/2642934) # Introduction This project provides an application with tools to - calculate electricity bill before it's received from your vendor diff --git a/app/Console/Commands/ChargesManualLoad.php b/app/Console/Commands/ChargesManualLoad.php index 7cb3f511..8aed1d5e 100644 --- a/app/Console/Commands/ChargesManualLoad.php +++ b/app/Console/Commands/ChargesManualLoad.php @@ -19,7 +19,7 @@ class ChargesManualLoad extends Command * * @var string */ - protected $description = 'Command description'; + protected $description = 'Manually load hardcoded charges into cache'; /** * Execute the console command. diff --git a/app/Console/Commands/Database/DbExport.php b/app/Console/Commands/Database/DbExport.php new file mode 100644 index 00000000..d27f7c27 --- /dev/null +++ b/app/Console/Commands/Database/DbExport.php @@ -0,0 +1,82 @@ + */ + private array $defaultTables = [ + 'elspotprices', + 'metering_points', + 'charges', + 'charge_prices', + 'charge_groups', + 'datahub_price_lists', + 'users', + ]; + + public function handle(): int + { + $tables = $this->option('tables') + ? explode(',', $this->option('tables')) + : $this->defaultTables; + + $fixturesPath = database_path('fixtures'); + + foreach ($tables as $table) { + $table = trim($table); + + try { + $count = DB::table($table)->count(); + } catch (\Illuminate\Database\QueryException $e) { + $this->error("Table {$table} does not exist"); + + return Command::FAILURE; + } + + if ($count === 0) { + $this->warn("Skipping {$table} — table is empty"); + continue; + } + + $outputFile = $fixturesPath . '/poweruse-' . $table . '.csv'; + $this->info("Exporting {$table} ({$count} rows) to {$outputFile}"); + + $handle = fopen($outputFile, 'w'); + if ($handle === false) { + $this->error("Could not open {$outputFile} for writing"); + continue; + } + + foreach (DB::table($table)->get() as $row) { + /** @var array $fields */ + $fields = array_map(function ($value) { + return $value === null ? 'NULL' : (string) $value; + }, (array) $row); + fputcsv($handle, $fields); + } + + fclose($handle); + $this->info("Exported {$table} successfully"); + } + + $this->newLine(); + $this->info('Export complete. Files saved to ' . $fixturesPath); + + return Command::SUCCESS; + } +} diff --git a/app/Console/Commands/EnergiDataServiceLoadDatahubPriceLists.php b/app/Console/Commands/EnergiDataServiceLoadDatahubPriceLists.php index 44d28ff4..41f4bd05 100644 --- a/app/Console/Commands/EnergiDataServiceLoadDatahubPriceLists.php +++ b/app/Console/Commands/EnergiDataServiceLoadDatahubPriceLists.php @@ -44,7 +44,7 @@ public function handle() : int $more = 1; $i = 0; - $bar = $this->output->createProgressBar(266516); + $bar = $this->output->createProgressBar(423500); $bar->start(); while ($more) { $records = $datahubPriceListsService->requestAllDatahubPriceListsFromEnergiDataService(100, $i); diff --git a/app/Models/ChargeTariffMapping.php b/app/Models/ChargeTariffMapping.php new file mode 100644 index 00000000..8a040ef0 --- /dev/null +++ b/app/Models/ChargeTariffMapping.php @@ -0,0 +1,25 @@ + 'boolean', + ]; + } +} diff --git a/app/Services/GetPreliminaryInvoice.php b/app/Services/GetPreliminaryInvoice.php index b644d60f..5f73bcbd 100644 --- a/app/Services/GetPreliminaryInvoice.php +++ b/app/Services/GetPreliminaryInvoice.php @@ -5,6 +5,7 @@ use App\Enums\SourceEnum; use App\Exceptions\DataUnavailableException; use App\Exceptions\MissingDataException; +use App\Models\ChargeTariffMapping; use App\Models\DatahubPriceList; use App\Models\User; use App\Services\Interfaces\GetSpotPricesInterface; @@ -508,14 +509,73 @@ private function findDatahubPriceList(array|\ArrayAccess $tariff, string $toDate if (cache()->has($key)) { $datahubPriceLists = cache($key); } else { - $datahubPriceLists = $this->datahubPriceListService->getFromQuery( - $this->datahubPriceListService->getQueryForFetchingSpecificTariffFromDB($tariff['name'], $tariff['owner'], $tariff['description'] ?? '', $toDate, $fromDate) - ); + $datahubPriceLists = collect(); + + $mapping = ChargeTariffMapping::where('charge_name', $tariff['name']) + ->where('charge_owner_gln', $tariff['owner']) + ->first(); + + if ($mapping) { + $datahubPriceLists = $this->datahubPriceListService->getFromQuery( + $this->datahubPriceListService->getQueryForFetchingSpecificTariffFromDB( + $mapping->datahub_note, + $mapping->datahub_gln, + $mapping->datahub_description ?? '', + $toDate, + $fromDate + ) + ); + } + + if ($datahubPriceLists->isEmpty()) { + $datahubPriceLists = $this->datahubPriceListService->getFromQuery( + $this->datahubPriceListService->getQueryForFetchingSpecificTariffFromDB($tariff['name'], $tariff['owner'], $tariff['description'] ?? '', $toDate, $fromDate) + ); + + if ($datahubPriceLists->isNotEmpty() && !$mapping) { + $first = $datahubPriceLists->first(); + ChargeTariffMapping::updateOrCreate( + ['charge_name' => $tariff['name'], 'charge_owner_gln' => $tariff['owner']], + [ + 'datahub_note' => $first->Note, + 'datahub_gln' => $first->GLN_Number, + 'datahub_charge_type' => $first->ChargeType, + 'datahub_description' => $first->Description, + 'verified' => true, + ] + ); + } + } + if ($datahubPriceLists->isEmpty()) { $datahubPriceLists = $this->datahubPriceListService->getFromQuery( $this->datahubPriceListService->getQueryForFetchingTariffByGlnAndNameLike($tariff['name'], $tariff['owner'], $toDate, $fromDate) ); + + if ($datahubPriceLists->isNotEmpty() && !$mapping) { + $first = $datahubPriceLists->first(); + ChargeTariffMapping::updateOrCreate( + ['charge_name' => $tariff['name'], 'charge_owner_gln' => $tariff['owner']], + [ + 'datahub_note' => $first->Note, + 'datahub_gln' => $first->GLN_Number, + 'datahub_charge_type' => $first->ChargeType, + 'datahub_description' => $first->Description, + 'verified' => false, + ] + ); + } } + + if ($datahubPriceLists->isEmpty()) { + logger()->warning('No DatahubPriceList match found for tariff', [ + 'name' => $tariff['name'], + 'owner' => $tariff['owner'], + 'fromDate' => $fromDate, + 'toDate' => $toDate, + ]); + } + if ($datahubPriceLists->isNotEmpty()) { cache([$key => $datahubPriceLists], 2592000); } diff --git a/composer.json b/composer.json index fef8ba3e..07e8fa0e 100644 --- a/composer.json +++ b/composer.json @@ -7,27 +7,27 @@ "require": { "php": ">=8.5.0", "ext-curl": "*", - "laravel/framework": "^11.0", - "laravel/passport": "^12.0", - "laravel/tinker": "^2.8", - "laravel/ui": "^4.5", - "spatie/laravel-html": "^3.6", - "tvup/eloverblikapi": "^v2.1.1" + "laravel/framework": "^12.56", + "laravel/passport": "^12.4", + "laravel/tinker": "^3.0", + "laravel/ui": "^4.6", + "spatie/laravel-html": "^3.13", + "tvup/eloverblikapi": "^2.1" }, "require-dev": { - "brianium/paratest": "^7.19.2", - "fakerphp/faker": "^1.23", - "friendsofphp/php-cs-fixer": "^3.64", - "larastan/larastan": "^3.0", + "brianium/paratest": "^7.19", + "fakerphp/faker": "^1.24", + "friendsofphp/php-cs-fixer": "^3.94", + "larastan/larastan": "^3.9", "laravel/boost": "^2.4", - "laravel/breeze": "^2.2", - "laravel/sail": "^1.35", + "laravel/breeze": "^2.4", + "laravel/sail": "^1.55", "mockery/mockery": "^1.6", - "nunomaduro/collision": "^8.3", + "nunomaduro/collision": "^8.9", "phpstan/phpstan-mockery": "^2.0", "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^13.0.0", - "spatie/laravel-ignition": "^2.6" + "phpunit/phpunit": "^13.0", + "spatie/laravel-ignition": "^2.12" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 7e827b09..f98c5ad4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a186cf7a190eda55f8843bc6ef7b9c85", + "content-hash": "430e1e2d244aff90642f584f5d694c47", "packages": [ { "name": "brick/math", @@ -1186,20 +1186,20 @@ }, { "name": "laravel/framework", - "version": "v11.51.0", + "version": "v12.56.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "c8f9a04594b7044a189a3194cfb3594251eb74e5" + "reference": "dac16d424b59debb2273910dde88eb7050a2a709" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/c8f9a04594b7044a189a3194cfb3594251eb74e5", - "reference": "c8f9a04594b7044a189a3194cfb3594251eb74e5", + "url": "https://api.github.com/repos/laravel/framework/zipball/dac16d424b59debb2273910dde88eb7050a2a709", + "reference": "dac16d424b59debb2273910dde88eb7050a2a709", "shasum": "" }, "require": { - "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12|^0.13|^0.14", + "brick/math": "^0.11|^0.12|^0.13|^0.14", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.4", @@ -1214,32 +1214,34 @@ "fruitcake/php-cors": "^1.3", "guzzlehttp/guzzle": "^7.8.2", "guzzlehttp/uri-template": "^1.0", - "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0", + "laravel/prompts": "^0.3.0", "laravel/serializable-closure": "^1.3|^2.0", - "league/commonmark": "^2.7", + "league/commonmark": "^2.8.1", "league/flysystem": "^3.25.1", "league/flysystem-local": "^3.25.1", "league/uri": "^7.5.1", "monolog/monolog": "^3.0", - "nesbot/carbon": "^2.72.6|^3.8.4", + "nesbot/carbon": "^3.8.4", "nunomaduro/termwind": "^2.0", "php": "^8.2", "psr/container": "^1.1.1|^2.0.1", "psr/log": "^1.0|^2.0|^3.0", "psr/simple-cache": "^1.0|^2.0|^3.0", "ramsey/uuid": "^4.7", - "symfony/console": "^7.0.3", - "symfony/error-handler": "^7.0.3", - "symfony/finder": "^7.0.3", + "symfony/console": "^7.2.0", + "symfony/error-handler": "^7.2.0", + "symfony/finder": "^7.2.0", "symfony/http-foundation": "^7.2.0", - "symfony/http-kernel": "^7.0.3", - "symfony/mailer": "^7.0.3", - "symfony/mime": "^7.0.3", - "symfony/polyfill-php83": "^1.31", - "symfony/process": "^7.0.3", - "symfony/routing": "^7.0.3", - "symfony/uid": "^7.0.3", - "symfony/var-dumper": "^7.0.3", + "symfony/http-kernel": "^7.2.0", + "symfony/mailer": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33", + "symfony/process": "^7.2.0", + "symfony/routing": "^7.2.0", + "symfony/uid": "^7.2.0", + "symfony/var-dumper": "^7.2.0", "tijsverkoyen/css-to-inline-styles": "^2.2.5", "vlucas/phpdotenv": "^5.6.1", "voku/portable-ascii": "^2.0.2" @@ -1271,6 +1273,7 @@ "illuminate/filesystem": "self.version", "illuminate/hashing": "self.version", "illuminate/http": "self.version", + "illuminate/json-schema": "self.version", "illuminate/log": "self.version", "illuminate/macroable": "self.version", "illuminate/mail": "self.version", @@ -1280,6 +1283,7 @@ "illuminate/process": "self.version", "illuminate/queue": "self.version", "illuminate/redis": "self.version", + "illuminate/reflection": "self.version", "illuminate/routing": "self.version", "illuminate/session": "self.version", "illuminate/support": "self.version", @@ -1303,17 +1307,18 @@ "league/flysystem-read-only": "^3.25.1", "league/flysystem-sftp-v3": "^3.25.1", "mockery/mockery": "^1.6.10", - "orchestra/testbench-core": "^9.18.0", - "pda/pheanstalk": "^5.0.6", + "opis/json-schema": "^2.4.1", + "orchestra/testbench-core": "^10.9.0", + "pda/pheanstalk": "^5.0.6|^7.0.0", "php-http/discovery": "^1.15", - "phpstan/phpstan": "2.1.41", - "phpunit/phpunit": "^10.5.35|^11.3.6|^12.0.1", - "predis/predis": "^2.3", - "resend/resend-php": "^0.10.0", - "symfony/cache": "^7.0.3", - "symfony/http-client": "^7.0.3", - "symfony/psr-http-message-bridge": "^7.0.3", - "symfony/translation": "^7.0.3" + "phpstan/phpstan": "^2.1.41", + "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", + "predis/predis": "^2.3|^3.0", + "resend/resend-php": "^0.10.0|^1.0", + "symfony/cache": "^7.2.0", + "symfony/http-client": "^7.2.0", + "symfony/psr-http-message-bridge": "^7.2.0", + "symfony/translation": "^7.2.0" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", @@ -1328,7 +1333,7 @@ "ext-pdo": "Required to use all database features.", "ext-posix": "Required to use all features of the queue worker.", "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", - "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", "filp/whoops": "Required for friendly error pages in development (^2.14.3).", "laravel/tinker": "Required to use the tinker console command (^2.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", @@ -1339,22 +1344,22 @@ "mockery/mockery": "Required to use mocking (^1.6).", "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", - "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.3.6|^12.0.1).", - "predis/predis": "Required to use the predis connector (^2.3).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", + "predis/predis": "Required to use the predis connector (^2.3|^3.0).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", - "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^7.0).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", - "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).", - "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).", - "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)." + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0|^1.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -1365,6 +1370,7 @@ "src/Illuminate/Filesystem/functions.php", "src/Illuminate/Foundation/helpers.php", "src/Illuminate/Log/functions.php", + "src/Illuminate/Reflection/helpers.php", "src/Illuminate/Support/functions.php", "src/Illuminate/Support/helpers.php" ], @@ -1373,7 +1379,8 @@ "Illuminate\\Support\\": [ "src/Illuminate/Macroable/", "src/Illuminate/Collections/", - "src/Illuminate/Conditionable/" + "src/Illuminate/Conditionable/", + "src/Illuminate/Reflection/" ] } }, @@ -1397,7 +1404,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-03-26T14:54:53+00:00" + "time": "2026-03-26T14:51:54+00:00" }, { "name": "laravel/passport", @@ -1597,33 +1604,33 @@ }, { "name": "laravel/tinker", - "version": "v2.11.1", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741" + "reference": "cc74081282ba2e3dae1f0068ccb330370d24634e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/c9f80cc835649b5c1842898fb043f8cc098dd741", - "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741", + "url": "https://api.github.com/repos/laravel/tinker/zipball/cc74081282ba2e3dae1f0068ccb330370d24634e", + "reference": "cc74081282ba2e3dae1f0068ccb330370d24634e", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "php": "^7.2.5|^8.0", - "psy/psysh": "^0.11.1|^0.12.0", - "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0|^8.0" + "illuminate/console": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "php": "^8.1", + "psy/psysh": "^0.12.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0" }, "require-dev": { "mockery/mockery": "~1.3.3|^1.4.2", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + "phpunit/phpunit": "^10.5|^11.5" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + "illuminate/database": "The Illuminate Database package (^8.0|^9.0|^10.0|^11.0|^12.0|^13.0)." }, "type": "library", "extra": { @@ -1631,6 +1638,9 @@ "providers": [ "Laravel\\Tinker\\TinkerServiceProvider" ] + }, + "branch-alias": { + "dev-master": "3.x-dev" } }, "autoload": { @@ -1657,9 +1667,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.11.1" + "source": "https://github.com/laravel/tinker/tree/v3.0.0" }, - "time": "2026-02-06T14:12:35+00:00" + "time": "2026-03-17T14:53:17+00:00" }, { "name": "laravel/ui", @@ -5804,6 +5814,86 @@ ], "time": "2025-07-08T02:45:35+00:00" }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-24T13:30:11+00:00" + }, { "name": "symfony/polyfill-php85", "version": "v1.33.0", @@ -7795,53 +7885,6 @@ }, "time": "2026-01-28T22:20:33+00:00" }, - { - "name": "illuminate/json-schema", - "version": "v12.56.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/json-schema.git", - "reference": "207509531ee53b2c5b966c51c9c63355f8e96e1e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/json-schema/zipball/207509531ee53b2c5b966c51c9c63355f8e96e1e", - "reference": "207509531ee53b2c5b966c51c9c63355f8e96e1e", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^10.50.0|^11.47.0|^12.40.2", - "php": "^8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\JsonSchema\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Json Schema package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2026-02-24T14:03:17+00:00" - }, { "name": "jean85/pretty-package-versions", "version": "2.1.1", @@ -11472,86 +11515,6 @@ ], "time": "2024-09-09T11:45:10+00:00" }, - { - "name": "symfony/polyfill-php84", - "version": "v1.33.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php84\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-06-24T13:30:11+00:00" - }, { "name": "symfony/stopwatch", "version": "v8.0.0", diff --git a/database/fixtures/poweruse-metering_points.csv b/database/fixtures/poweruse-metering_points.csv new file mode 100644 index 00000000..2c86ac60 --- /dev/null +++ b/database/fixtures/poweruse-metering_points.csv @@ -0,0 +1 @@ +1,571313174112923291,NULL,E17,D01,21517435,NULL,NULL,2013-07-01,PT1H,"AURA El-handel AS (5790002742903)",3546,"Jernbane Alle",37,NULL,NULL,Taastrup,NULL,169,"i kælder","Torben Evald Hansen",NULL,1,1,"2026-03-28 12:40:04","2026-03-28 12:40:04" diff --git a/database/fixtures/poweruse-users.csv b/database/fixtures/poweruse-users.csv index efa16676..98f47543 100644 --- a/database/fixtures/poweruse-users.csv +++ b/database/fixtures/poweruse-users.csv @@ -1 +1 @@ -13,Torben Evald Hansen,tvupper@gmail.com,0000-00-00 00:00:00,$2y$10$7UQh6OWFcDJJJLfvQzG0Tef7tXed7jJdRDWwj5WVqPGcDExOnsK1W,"",eyJpdiI6ImNJUmhKNDZuTExuSG9iQ3lMc0NOWGc9PSIsInZhbHVlIjoiaFhVekFTU1Q4dEJ6bFJoUTljYnREaUZsaDJPMnRmcmF4YnZsTkpySldnQXNjTXgzT3lJc2J1QUxvS2F3NzdxVG5nSVlTQjJGSlZwZ1c3dWNBaG9ndmRrc2ZBSlNSdnBDenZ0Rlh0S2grL2xiTDFEaXhheDZVZEtrM2hvdXl4MWk0SUp4bXdkV015K2FWMjVHaHcrQ1VRbWdBY2xpN2Z6NUxtOVRDUkdCRk8rd21SenlEa1o2SVNtOFlnR0JoTU5EQ3cxMzVudkR5YVNZM0hWVmo4YlFFZTVzeHVPNHlTcEpQUlppOEdVai8wZm9oTWk3OCtBYVdmZ2JxbDVmVGRaNVRUbXNCajcwR3QwVFYrV0FkcXNpd1MyVVpyazhKemlScFhLcHFOSjUwMFJ1TkdLTTgzcVBVclNwbVQxc1RzdW5RRzBHVmhrQzFMaGNWODhYemlnblJsRjNmeU5zWDM2R05UNi82TDBVZUFseDYwY2V1cVJkY2FPdzJ5M29tK25oWmRRN3gxYjRpR3FHM2FVbjd5UVNHZjlTTFhRRE40RkVJRnVERk02d3lKK1dqOXc4UDk2Um5La1RIOWR0bFJDMTFqeFB2ZUV1Q2VEMDFIT2YzT2RkblhtZmcyck02dkEwcVdQUisxejJGRmpnMlNyT3dwWkRKZWI2QTVONGhPS0EvNkRKL0RsMEIrSEowRGNTdUUzMTA4VlJ3RzhxcTY3ODJQei9jSFg1N3RpL09ZQ09ZT0ltS2NkVkJtRVZDamI2aU5zRU1LNFZpQ1V0b1FhNTd6YzArVUlTWnI2ODBoSkpIbk80aVJwRTc2ajEzNjRWN0hHUFlWakZXaVdmQ1l0T0pEUUlXRTFVMWs4QnJpZGtMSzdhZStsZEJ2RmxQakxKNkhuQ1Q0ejB6WDJkb1A3aGF1YlNjVXpYNmNaTjdIdzNGYmdRRzFWbzFRUFdlTjdZaCsvTlVhd1dlcnBoZHQwL2Y1WmdGOFFpYytXNTlGSE1ScWpSY0k3VmVtNWRhblpxKzhUQ3B2Z21vOUVSblhKaHRmVHZmNGlhWUpDUXdJTFI3ZjV0aGJJU3YvUVhLalU1b1AvMUlJZFlQSUphbFRsUEpBSGFLc3hEWjRMWWdZVHdnNWdSWnJ3T2toa1Z5RVBFY2UvVm1NYVlFNGxBMjV1VnNOVEVVYm51WlI1b1cweWJHTEFNSHk4YVJseWx1SXFpRTkwdUdXdFdWZnVKY3VwM3p4WUhCWWEvWXFGdm1hUnNTOVB6VGdLQTBMeVVZdmVObXRJZCtDZE4vMlR0Wlo4OTRhMi9xT2QvS1lQK2t2TXA2cTg1ZEFBTk4xb3dkSUFyUE5sZmIxTDRDZmUwRnlRUG52VEZyTFViOTFWV2pDNDFJN1ZVOGc9PSIsIm1hYyI6IjIwM2UzMDJjMzhkYzFiODcxZTA1OTYyMzVlYWIxMzUzOWUwOWM1Nzg0ODliYmQ0M2NhMmQ3MzU5NDk1MDYzMjgiLCJ0YWciOiIifQ==,da_DK,2023-01-29 14:05:06,2023-01-29 14:11:46 +1,"Torben Evald Hansen",tvupper+poweruse_dev@gmail.com,NULL,$2y$10$0nxjpqgOVnkK52XbjDOo..f05cMbUfubmM7bNjSlGoByKuyKy3X26,xjdPPgt7krZw4lHegbq3uRqFn5kXtW7FPQEGMGDsH1XbM0Mu7Hl9EY8t0Yma,eyJpdiI6IjM0cThhSE1YWEU1VnRwdnJXUTJicnc9PSIsInZhbHVlIjoiVnpSTldBajRLNldsSS9oTDQ0c0xVcWcvcFhDcnNpWVd3YTdtZUkzU1RnL25mQm81NFQrR3lUWk0ydXN1cXVzOGdZMWJ3d1dNYnpscksrR0xhQk1zbXdHQjU3d3ZTTDNpK0ZoTzEwcmNGYXBvRlB3dzNhRnU1MnpLcXV0Tms0bFN4YnRuTWlBMXhxdGR1Z08vNi9MS3I1KzRJbnpOYUpTRzRNeU1yTEdza3BtdGdiL3lFYVZZOUlhRVROMmZOcCtMMjgxUFh5Zy8wdFcyYUVBeERlT1ZWbnpiRjFEZnR6VHhTM2sxODJGcDc2S284cWVoN29zMlVSVXZuT096c2Fubjk4Qi9qbUpFenJUbFA3N2xISUVaVmNSUkVuTkhnQnppLy9CYjdtYTU5YlN6U2xuUklvRkVFRWYra1JMZXV0Nmlvc1dOcTlJc0o0Qm0rRGdNaHA3MkZoL2tQaC9rZ3k4RGswNnVJU3N5Wm9oL1RYQmFsSFZYcHBqRFc4TXZ5eExYb1dCWG1vZ0JKUWNKMWh2WGhUalI4ZGtFdWI5c1R2UHMwbEZOSVpydzdGb2tKVlc2OFh2VTNNNUI5V2hNZWJVNk5BNUlwWmk2QnhrenRQLzAyc1V2UFNGZU0rY1Z1K2ZvbjNGNVdTOTBEM1dOK1MzaXJCM0pLSVJsY1QyaEZTRHltSzRHZ1hsUGkyQjQvbjI1MWlVZU5oMmJQblZ4ZmdSYmo2T3lGTXpkTHUwSHNGbUtzdGtTbWZTOUVXSThHOWhlcDZGc3R4QTFnVEpDcW92Ui8yNVI4dFJ4K3dYcWx0cHVCT3QzY2l4a1c2WHdaU2FPRHZwV2cyQUFnYmhqQWNScnp5N25UOWhpaXBxMTFCTzM4Zmc4U01KZy9BVjduZkRLMHVwUnMzNG9CbzlFaUhyL1hoY0I5eHpaZTJTOWp2Z0NOS0RzTTIxWlRHamxmeDd4Y0pITFFSTHJTSndIdjVQaHhOdytON2VQK0RrZnBtcDZuSTJ5aWNnNlczSW5Mcm13K2J2UktHK1FKOGkrb0dSVUVvSDRleXFYVElGaVMzbzc2YTUxbUtoTkFlOVRMOENZb0gvZG9ocm10d0taeFBLcXBRZmQ1WVZVOENhOVpwMkR5TWpib1k5ck9meGY0bzVxQmJBVmxYKzN6ZDlncVhIUUU2eW9wY3dlSHJBb1lmTG85UlBHN3dET1Q5WFdNeGNnTyttV3U4NG1xeG1uT2xtNmZ1ZFlYSnNpQ0lrS3Q1aEhPUjdCZk41TlpQR0VIR2dJZWNJMTVPSFF6NG5rTlZVVlcyczBKeEdINHlGcGFkUjlURDY2VzcxSHNuSFdxMzF5Tm5UcHlVeFNRUW1WeXBlaXJYNGV5R0hPRjhFUk5oQmc2NFJYOXV2Q09PYXFYQzY2SEVkNEpkMHZXK1JDY0RnRTNjZEpidnRpK1lqejZxUFg2UDNNRW9yMWhwVjFZMzZtaFFsbUpUZ1VtcW9pYURwSmFIUDB4UTUrcStoZkh5eExPWVJUczVXWlZvb0gvcS8vNkxTL0s5ZHZUSVB0UkVCVU1acCtKMWhSR3dFdnFxdjBLQzNGTzVXRWpaaEVZc0VjQzJZdmIzdWpvREo1dlJWTXEvWHRtMzh2bE9SUUJKT3FROWpURTlFVWs3Skd3bm1PWlBZV1RVUWRxdHdndUZ2amFkTHNWRGhsWlgrUDVGcHJReWJaNUYxVzVsMDVOOWJ5aUs3V3NjUlhQbURzV090ZlF1MmxDMVRrczRJV2loZHN3Y2V1aWRKVnB1cUNUNXk2eVlTbkd4MzdleTVvamR1bmpxL29jRVozdmMza1lTL0J2TURyV3NYS3ZyeGtsem1ZdVZvR3ppQ044V3d0enFacUcxYTJYTllQZDBtdW1nRTFyVTRCL3NlT2tBbEtVMDZzWEgvSnlsaWh3a1ovemVuVUxpU28xMmdadTVjZnJYMHJka0hBZzBQdlRSck8xaDVIZGNvYVR2M0F5LzRzM0hIZ2JTMC9yM0NJb0VJMkZlbGhUMHJhRzR4RWE3eXB2WVA5cTVsYTB4aVJVOEd5M1g5NHkwT0V2ckI2eGMzNUZzL3h0VVRSLytmY1R5QnJabHNsTG51Tm1tZ0Z0bGQyRndFL29JbmdjdzVudExuUUFMWXZvcWpUYU9oUHA0OEF1RFROeVoveFhpdlJTaXZzSC9md1JGMWQ4b2VSaXQxa2k2OWdtWE02Q09UNXJkWlJYU0lJUkhOcnZDU1FPcU81YjEzWEUwekZtSTZIS2tqNmlaUDVyUys4ZXZLNVU2ZE12TWdpc2JRTE9NcTF1UTV5aG1XYUYrRE41Z1VPM2xNWU44SlNZVDlJVm00NU1IVEt5TjhQbzQ2WEJVdmhCMmZwREovaW11YlE2YmFoQXo2VVVVL1I4NnBvQjFBZmJvM0o0MGtBZ3I5QXNvSC8rMGxQZlREbUdBQWo0dk0zbUd2aXNBREs0c0M4dkRsQTE2bW8rdjNTVDlxVjdnZ1FGZFVkN1VTNTQwWTM3WStmMzlPRVliUUdndTNjdTRWbHNWbXpXSlBqRWdjNmZJV2dIZEo2ZWc2UlJOTk9PUVJJeEpTV05TdnBFT01rQTFWRjUyYVZ3dzYwVEd1QU1MZUQzS3UzNm9RdFlJQlZBMzdNYXNqWG8rYVBjL1daQWZkYWplTnhIL2lzN21HazFjTlpHdVdROE1tQ1I0Mk1UUnIxbW4wNXovdnlaazU5WDQrR1g3czJ6TDdwVUZmRkxydlVndHdQUVZuY3dKWEM2RlQ4Rlc4S1pVZGd2c2VPM3NZWVFBUkp6VmVCeFZmdjNwUnRVdnExN2hLN2crbUZ4WVkxMDB2R0Z0dzZTMlJ4SlJINmRIaTIzYy9KK1M1WGM1OXd4cDB4bzltZlRtbHQ1d2UxYVZxUUowYmt1T00wTzBYUW02S0xCcWhqU1JKdUcxZEo0amdUZDdwK2dESFl6R0I3dVhERG9pRFg4aUFHMjZCd3ZEUHprRWh5Z1R4R3dIdHk4MUdocmdQZ3RqUGlBOXMwZnBPck9kUFVkOVY4UW13Uk1GdUYwRTlhcnFKU1ZabDc3djNCRlZXQmRXUktEMkdEckRFNnpwdGlDalROanRsdjB5dXhJYklFNDZZUXcvN3gybisyZGJieDhJclJkaFVLd29HVE9BNjBhbFZxUy9uaEJzemxTajVlMHpkRG5reUJuWUdVaFJvN2FkbEdkWCtGQklWUm1ZaGFMVFlFQkxMMENreHZxWWU1QUJYVXJpWlFHMWJjUTQxS3hyZWx6dHhlTkZXbTloY2hGR1lzaTRDcXRNQ1plRGdFeU5sVHJ4ekk0TUtYODV5YjluVG9uWmtFL210c0hEaHJjcEd5a1N6NG1rMy9uK24rZWE3ZEN2dXBjWkE1VllQaEFQVXRKc1BRMmJMRmRKY0Q0VjVJQkRxZnBWWkxNRHoxaG9BTkpKOXg1UXYxT21VYW1MYmNWcmhadEN2VWtkMU5obDZORnZvTHhVRFlHMHdwZ0YraUNrS1BjTnUxcjB2MDdncUdDaTJZamtUTmZ6UVRiVHpsWkloVkhVS1cyeTNqK2hjeHZKYm5YbzFoWnh0THpDa0taeUVJeXhkYUN3Qnp0SFZtaG9oWVBUSGpkSTJsREdCUUNlR1FaTW1jL0RERlRzL0VSTkE3KzRKek9BQldySW91WWtMMXRrQ29MN0RyamFhalRpVEVHTFNaRVNTRm5INjZtOEJqL0c4SnFqeHU3dFpYKzBWZGdnT2E0M0tCbXAzdmt0V3B3UkxsL1oraGlCWUgrN29qUDQ2d0MxTWdKdGl0ZmRldHhWYzB1djhFdFJTZ1NuRXE3ckVpOVUrY1VjUFkrR1d3dVFlZDhmZll6M2FkeUVKMjBSWjdxUXNtNFBGOHcwbGpCZnlpczFMZEJMdnhreTdzZHVwclJyK1IxemNxTjUwck16VFg4RWpzUWh3R3V6L1JaWEtOcW1PbHRBQStBNEh6NG0zUmhVL0tvVnlBWjlzaUNkazEyUmhicExtRXVqOFFwS3VBQm1vN1VkS1RZMllOSDlzOGF1K1lRMmFXUmFHSGJZcGhVdjZwdHluMHVaODhPTjJsQnVMQ1c5eU9VaVoybytLR1U4TW8yTkprL25EMERoZzc3UXpIckxWT0VSdVZkM2tRM21wUDVWR1ZMdU0rd3B0cURPbW5HWVo3MDQrbmZTUDh1ejdmVFk1VU1WM1dtUmhESWp0bDh6WXBrM05CeU1tUTlyMzh5RjJoa0gwZDh3RDRObXNJMDNGVGVqc2ZUUGVSN3FrWDNYWDVjdVI0cVZoaGlmRFR3YUJ1Y2dhNGYrWHovUnhjMHBPd1BEb0NRVmRFMzBoR0tObzNUMWZzZThrMlJIek9pZjd5dVlnb3dGMUdHVUVna29kRjlFb09pK3JiRkJiUUtjSk1CK0FjSnhXb1RRc0F0dzlhcXcySzB1L0dlNnZVQ1VPM3ZWeUIxOVd2eWtVZVUvSFdjZjdmSkwyQXlhbnVLNVdtMjBsYnFRSGRlVjBBTVZPQUh2LytkelhRSitraGYrTldJRXhWOFA3UDhMeUpIbVpRRDRjVkNaVGR6aWtIZ2g1TElSazEzZi83U1dHZVNvWktOTXZMOXhBSHRHSFdpK0MyK0w1UEdjR0FRZitNbXRycVQzVTBYVGY5VCtBcThkRUN5WE56TUVVY1FYOWIwSXlYN2FxWWhKN2xycW1BdzdnbHpqQSt0bGlQdy8wdENkS1JFNTNwNmdQSElyV2hqUHBHZ0orNVJRTXJyQmVaQjdGcHFwbzcxbEZoTjFtQU1GS21LeWxqRGlxRG1YS3ppK2pUT1hsUWlZc0ovelBMZDhkUDZOMXIxMWVVVHpPSG55OG5hWko1ck1BTWFwWFR3V0pURWFlSndieEZSdDBBNHRBQzJYYk0zNTdEbGZUNmVkUVEvUFM2eXh6ZjNuL1lPaHR6K2hud0dZL1VGeWJRZmZkbStpSjdXQlZYNVpZZEgyejlBMmZic2RWRVdoOXE4WFZMejBrMUY2aXp4bXlaOVlIakZsYjgzWm9BRVJydnpYWkMvbjFlQU1WZlFjWURMMVU4dGRnUDZIWjFqK0dyeTlURGxYRVZZUjE4Ni82TFc0aGcvbTcxa1MvOU9hUDIvN1NSUlQ0b3FxY1JPeU9hNjBtVlVVMVdyMVdGUis1SzJpNU90ZEoxODZnZzBPQ21tZlVhVUpIMVp5NjZhd2IvWHBMcVJlaTRHMEZGNm1Bb1VkdTZYSDNKWmVTM2xQd2tyZGV5RmhrSXN1L2wxWTd6Zkw1N0I0c0YvU3ZIQlZISWFBcUpMdkxXL1dGbXF4VzRTL3RLVkZkV2xpeEhBQ042V3dsaXpSN2I1dDRyZWU3NjBrelZiMjQrcEpUT2w2dE5NWXNpelNjdHBIUGtoeFhtdEdNcllFYVJEaHVIOW85QmVRWWJSWWFXQ0dyTFBGd2NKdWhOZ2huUFJrOXZSU0lxT2x5cWozUnlZSDFyMmhEWlJkSEFzSzRQd091SkxpV2REV1BGK0kzRng4dFZOeEFWMUd5MGc1WkNJa081SXZqY0NaTS91eGkwaFJGSCtRT3E2M1d2c1lKSUs2RkNjbnI0OHBsTXI4S1pWUlJwSWVkYlF1NDlVZ1N1Mm5zT2t6bWVFWGdRS3k1YXhTelc4RVlkQWpyRW5hS3l6dG40UEh4NU5acndCSU5uMkNhaXRockI1dlFoWFZxNDlMemo2eDQ4MmJ6OUVNTTVkUTR2bDlqN0VBZSthYnVQZklmd2I2Zmx6MHJZYzJsM2psbjdSSnQwMGtlU2VuYnI5Rk9iSXNkQTRLMW5lQXFTRUd1OS83QzI0dnNqSE1ON05ZZGJqQXhuVU1LbU56cHdTVk93aGR3RFlWRzQrZkpEaHBLbEMyVnNRVW9KdFpDZ3VrTmhzYkVMSDJ5RTFBaGo5L25pSGVkbHVLNmFMZFNnUGlIOVNseEU5aU5qTVFqZjJaZE54T0V6Sm1BL0I1eW1NU1JESDcvUTFkenVzOHpXellHQmVyVHFrTEJ4NXlqK21PeTRBL1VEQStnd1JkWko5K0VFNDdnaUE2M3hsam5HdWVLZG5XbEZXVm5Sb0EwNEpYaE8vd0VKcitUVTRtbEE3dWRtNFNhdGRZbjVnWlBONjEzT05zY3VCUUJCdVkrdjNrdVNGbFREaGMzVENxOTVVaFQ2b0poS29WWm9Ra0EwRUpTZ0VMSHB5S1FmR2c9PSIsIm1hYyI6IjFiYzE3MTM1YjljN2FlYzZlZjY4NjNhNjE2NGRjZDQ5MWIxZDMxOWY4YzNhNTNhYTQ4ZjA1YzEzMWViYWM3NjIiLCJ0YWciOiIifQ==,NULL,NULL,NULL,NULL,da_DK,"2026-03-28 11:19:30","2026-03-28 12:39:54" diff --git a/database/migrations/2026_03_28_153721_create_charge_tariff_mappings_table.php b/database/migrations/2026_03_28_153721_create_charge_tariff_mappings_table.php new file mode 100644 index 00000000..79f1663d --- /dev/null +++ b/database/migrations/2026_03_28_153721_create_charge_tariff_mappings_table.php @@ -0,0 +1,30 @@ +id(); + $table->string('charge_name', 132); + $table->string('charge_owner_gln', 16); + $table->string('datahub_note', 99)->nullable(); + $table->string('datahub_gln', 16)->nullable(); + $table->string('datahub_charge_type', 3)->nullable(); + $table->string('datahub_description', 264)->nullable(); + $table->boolean('verified')->default(false); + $table->timestamps(); + + $table->unique(['charge_name', 'charge_owner_gln'], 'charge_tariff_mapping_unique'); + }); + } + + public function down(): void + { + Schema::dropIfExists('charge_tariff_mappings'); + } +}; diff --git a/package-lock.json b/package-lock.json index 944c167e..d0a06a3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,35 +6,35 @@ "": { "name": "poweruse", "dependencies": { - "@fontsource/nunito": "^5.1.0", - "@fortawesome/fontawesome-free": "^6.6.0", - "@jridgewell/sourcemap-codec": "^1.5.0", - "@rollup/plugin-terser": "^0.4.4", - "chart.js": "^4.4.4", + "@fontsource/nunito": "^5.2.7", + "@fortawesome/fontawesome-free": "^7.2.0", + "@jridgewell/sourcemap-codec": "^1.5.5", + "@rollup/plugin-terser": "^1.0.0", + "chart.js": "^4.5.1", "flatpickr": "^4.6.13", - "jquery": "^3.7.1", - "laravel-vue-i18n": "^2.7.7", - "sweetalert2": "^11.14.2", + "jquery": "^4.0.0", + "laravel-vue-i18n": "^2.8.0", + "sweetalert2": "^11.26.24", "vform": "^2.1.2", "vuejs-paginate-next": "^1.0.2", - "workbox-precaching": "^7.1.0", - "workbox-routing": "^7.1.0", - "workbox-window": "^7.1.0" + "workbox-precaching": "^7.4.0", + "workbox-routing": "^7.4.0", + "workbox-window": "^7.4.0" }, "devDependencies": { "@popperjs/core": "^2.11.8", - "@tailwindcss/forms": "^0.5.9", - "@vitejs/plugin-vue": "^5.1.4", - "alpinejs": "^3.14.1", - "autoprefixer": "^10.4.20", - "axios": "^1.7.7", - "bootstrap": "^5.3.3", - "laravel-vite-plugin": "^1.0.5", - "lodash": "^4.17.21", - "postcss": "^8.4.47", + "@tailwindcss/forms": "^0.5.11", + "@vitejs/plugin-vue": "^6.0.5", + "alpinejs": "^3.15.9", + "autoprefixer": "^10.4.27", + "axios": "^1.14.0", + "bootstrap": "^5.3.8", + "laravel-vite-plugin": "^2.0.0", + "lodash": "^4.17.23", + "postcss": "^8.5.8", "sass": "1.98.0", - "vite": "^5.4.8", - "vite-plugin-pwa": "^0.21.0" + "vite": "^7.0.0", + "vite-plugin-pwa": "^1.2.0" } }, "node_modules/@alloc/quick-lru": { @@ -1801,394 +1801,419 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", "cpu": [ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", "cpu": [ "mips64el" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@fontsource/nunito": { @@ -2201,10 +2226,9 @@ } }, "node_modules/@fortawesome/fontawesome-free": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", - "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==", - "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz", + "integrity": "sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg==", "engines": { "node": ">=6" } @@ -2669,6 +2693,12 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "dev": true + }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", @@ -2695,16 +2725,16 @@ } }, "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-1.0.0.tgz", + "integrity": "sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==", "dependencies": { - "serialize-javascript": "^6.0.1", + "serialize-javascript": "^7.0.3", "smob": "^1.0.0", "terser": "^5.17.4" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" }, "peerDependencies": { "rollup": "^2.0.0||^3.0.0||^4.0.0" @@ -2715,14 +2745,6 @@ } } }, - "node_modules/@rollup/plugin-terser/node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/@rollup/pluginutils": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", @@ -2747,208 +2769,325 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz", + "integrity": "sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==", "cpu": [ "arm" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.0.tgz", + "integrity": "sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==", "cpu": [ "arm64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.0.tgz", + "integrity": "sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==", "cpu": [ "arm64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.0.tgz", + "integrity": "sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==", "cpu": [ "x64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.0.tgz", + "integrity": "sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.0.tgz", + "integrity": "sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.0.tgz", + "integrity": "sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==", "cpu": [ "arm" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.0.tgz", + "integrity": "sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==", "cpu": [ "arm" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.0.tgz", + "integrity": "sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==", "cpu": [ "arm64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.0.tgz", + "integrity": "sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==", "cpu": [ "arm64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.0.tgz", + "integrity": "sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.0.tgz", + "integrity": "sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.0.tgz", + "integrity": "sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==", "cpu": [ "ppc64" ], - "license": "MIT", + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.0.tgz", + "integrity": "sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==", + "cpu": [ + "ppc64" + ], + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.0.tgz", + "integrity": "sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==", "cpu": [ "riscv64" ], - "license": "MIT", + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.0.tgz", + "integrity": "sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==", + "cpu": [ + "riscv64" + ], + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.0.tgz", + "integrity": "sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==", "cpu": [ "s390x" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.0.tgz", + "integrity": "sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==", "cpu": [ "x64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.0.tgz", + "integrity": "sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==", "cpu": [ "x64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.0.tgz", + "integrity": "sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.0.tgz", + "integrity": "sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.0.tgz", + "integrity": "sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==", "cpu": [ "arm64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.0.tgz", + "integrity": "sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==", "cpu": [ "ia32" ], - "license": "MIT", + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.0.tgz", + "integrity": "sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==", + "cpu": [ + "x64" + ], + "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.0.tgz", + "integrity": "sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==", "cpu": [ "x64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "win32" @@ -2989,22 +3128,10 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.11.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", - "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~5.26.4" - } + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "devOptional": true }, "node_modules/@types/resolve": { "version": "1.20.2", @@ -3019,16 +3146,18 @@ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, "node_modules/@vitejs/plugin-vue": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.5.tgz", + "integrity": "sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==", "dev": true, - "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2" + }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vue": "^3.2.25" } }, @@ -4181,42 +4310,44 @@ } }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" } }, "node_modules/escalade": { @@ -4425,6 +4556,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -5179,9 +5311,9 @@ } }, "node_modules/jquery": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz", + "integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==" }, "node_modules/js-beautify": { "version": "1.15.1", @@ -5277,11 +5409,10 @@ } }, "node_modules/laravel-vite-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.3.0.tgz", - "integrity": "sha512-P5qyG56YbYxM8OuYmK2OkhcKe0AksNVJUjq9LUZ5tOekU9fBn9LujYyctI4t9XoLjuMvHJXXpCoPntY1oKltuA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-2.1.0.tgz", + "integrity": "sha512-z+ck2BSV6KWtYcoIzk9Y5+p4NEjqM+Y4i8/H+VZRLq0OgNjW2DqyADquwYu5j8qRvaXwzNmfCWl1KrMlV1zpsg==", "dev": true, - "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "vite-plugin-full-reload": "^1.1.0" @@ -5290,10 +5421,10 @@ "clean-orphaned-assets": "bin/clean.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0" + "vite": "^7.0.0" } }, "node_modules/laravel-vue-i18n": { @@ -5889,6 +6020,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -6043,13 +6175,12 @@ } }, "node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.0.tgz", + "integrity": "sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==", "devOptional": true, - "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -6059,22 +6190,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", + "@rollup/rollup-android-arm-eabi": "4.60.0", + "@rollup/rollup-android-arm64": "4.60.0", + "@rollup/rollup-darwin-arm64": "4.60.0", + "@rollup/rollup-darwin-x64": "4.60.0", + "@rollup/rollup-freebsd-arm64": "4.60.0", + "@rollup/rollup-freebsd-x64": "4.60.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.0", + "@rollup/rollup-linux-arm-musleabihf": "4.60.0", + "@rollup/rollup-linux-arm64-gnu": "4.60.0", + "@rollup/rollup-linux-arm64-musl": "4.60.0", + "@rollup/rollup-linux-loong64-gnu": "4.60.0", + "@rollup/rollup-linux-loong64-musl": "4.60.0", + "@rollup/rollup-linux-ppc64-gnu": "4.60.0", + "@rollup/rollup-linux-ppc64-musl": "4.60.0", + "@rollup/rollup-linux-riscv64-gnu": "4.60.0", + "@rollup/rollup-linux-riscv64-musl": "4.60.0", + "@rollup/rollup-linux-s390x-gnu": "4.60.0", + "@rollup/rollup-linux-x64-gnu": "4.60.0", + "@rollup/rollup-linux-x64-musl": "4.60.0", + "@rollup/rollup-openbsd-x64": "4.60.0", + "@rollup/rollup-openharmony-arm64": "4.60.0", + "@rollup/rollup-win32-arm64-msvc": "4.60.0", + "@rollup/rollup-win32-ia32-msvc": "4.60.0", + "@rollup/rollup-win32-x64-gnu": "4.60.0", + "@rollup/rollup-win32-x64-msvc": "4.60.0", "fsevents": "~2.3.2" } }, @@ -6124,6 +6264,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -6237,6 +6378,14 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/serialize-javascript": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", + "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -6913,14 +7062,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -7049,21 +7190,23 @@ } }, "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -7072,19 +7215,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -7105,6 +7254,12 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, @@ -7119,17 +7274,16 @@ } }, "node_modules/vite-plugin-pwa": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.21.2.tgz", - "integrity": "sha512-vFhH6Waw8itNu37hWUJxL50q+CBbNcMVzsKaYHQVrfxTt3ihk3PeLO22SbiP1UNWzcEPaTQv+YVxe4G0KOjAkg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.2.0.tgz", + "integrity": "sha512-a2xld+SJshT9Lgcv8Ji4+srFJL4k/1bVbd1x06JIkvecpQkwkvCncD1+gSzcdm3s+owWLpMJerG3aN5jupJEVw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.3.6", "pretty-bytes": "^6.1.1", "tinyglobby": "^0.2.10", - "workbox-build": "^7.3.0", - "workbox-window": "^7.3.0" + "workbox-build": "^7.4.0", + "workbox-window": "^7.4.0" }, "engines": { "node": ">=16.0.0" @@ -7138,10 +7292,10 @@ "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "@vite-pwa/assets-generator": "^0.2.6", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", - "workbox-build": "^7.3.0", - "workbox-window": "^7.3.0" + "@vite-pwa/assets-generator": "^1.0.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "workbox-build": "^7.4.0", + "workbox-window": "^7.4.0" }, "peerDependenciesMeta": { "@vite-pwa/assets-generator": { @@ -7149,6 +7303,35 @@ } } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vue": { "version": "3.5.31", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.31.tgz", @@ -7373,6 +7556,28 @@ "rollup": "^1.20.0 || ^2.0.0" } }, + "node_modules/workbox-build/node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/workbox-build/node_modules/@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", @@ -7546,6 +7751,15 @@ "fsevents": "~2.3.2" } }, + "node_modules/workbox-build/node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/workbox-cacheable-response": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.4.0.tgz", @@ -7796,16 +8010,19 @@ "dev": true }, "node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "dev": true, "peer": true, "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } } } diff --git a/package.json b/package.json index e28a64fa..fd1edcf9 100644 --- a/package.json +++ b/package.json @@ -8,34 +8,34 @@ }, "devDependencies": { "@popperjs/core": "^2.11.8", - "@tailwindcss/forms": "^0.5.9", - "@vitejs/plugin-vue": "^5.1.4", - "alpinejs": "^3.14.1", - "autoprefixer": "^10.4.20", - "axios": "^1.7.7", - "bootstrap": "^5.3.3", - "laravel-vite-plugin": "^1.0.5", - "lodash": "^4.17.21", - "postcss": "^8.4.47", + "@tailwindcss/forms": "^0.5.11", + "@vitejs/plugin-vue": "^6.0.5", + "alpinejs": "^3.15.9", + "autoprefixer": "^10.4.27", + "axios": "^1.14.0", + "bootstrap": "^5.3.8", + "laravel-vite-plugin": "^2.0.0", + "lodash": "^4.17.23", + "postcss": "^8.5.8", "sass": "1.98.0", - "vite": "^5.4.8", - "vite-plugin-pwa": "^0.21.0" + "vite": "^7.0.0", + "vite-plugin-pwa": "^1.2.0" }, "dependencies": { - "@fontsource/nunito": "^5.1.0", - "@fortawesome/fontawesome-free": "^6.6.0", - "@jridgewell/sourcemap-codec": "^1.5.0", - "@rollup/plugin-terser": "^0.4.4", - "chart.js": "^4.4.4", + "@fontsource/nunito": "^5.2.7", + "@fortawesome/fontawesome-free": "^7.2.0", + "@jridgewell/sourcemap-codec": "^1.5.5", + "@rollup/plugin-terser": "^1.0.0", + "chart.js": "^4.5.1", "flatpickr": "^4.6.13", - "jquery": "^3.7.1", - "laravel-vue-i18n": "^2.7.7", - "sweetalert2": "^11.14.2", + "jquery": "^4.0.0", + "laravel-vue-i18n": "^2.8.0", + "sweetalert2": "^11.26.24", "vform": "^2.1.2", "vuejs-paginate-next": "^1.0.2", - "workbox-precaching": "^7.1.0", - "workbox-routing": "^7.1.0", - "workbox-window": "^7.1.0" + "workbox-precaching": "^7.4.0", + "workbox-routing": "^7.4.0", + "workbox-window": "^7.4.0" }, "type": "module" } diff --git a/public/.gitignore b/public/.gitignore old mode 100644 new mode 100755 diff --git a/resources/lang/da.json b/resources/lang/da.json index f1511ee6..6b5445ec 100644 --- a/resources/lang/da.json +++ b/resources/lang/da.json @@ -122,5 +122,68 @@ "It wasn't possible to get today's day-ahead prices from \"ENERGI DATA SERVICE\" ( https://api.energidataservice.dk )": "Det var ikke muligt at hente dagens dag-til-dag priser fra \"ENERGI DATA SERVICE\" ( https://api.energidataservice.dk )", "Type to search...": "Skriv for at søge...", "Type to search for grid operator...": "Skriv for at søge efter netselskab...", - "No results": "Ingen resultater" + "No results": "Ingen resultater", + "Smart electricity tools": "Smarte el-værktøjer", + "Welcome to": "Velkommen til", + "Here you will find tools for calculation on electricity usage and tools to retrieve data from operators in the energy market": "Her finder du værktøjer til beregning af elforbrug og til at hente data fra operatører i energimarkedet", + "How to get your refresh token from Energioverblik": "Sådan henter du dit forny-token fra Energioverblik", + "Retrieve and analyze your electricity consumption data": "Hent og analyser dit elforbrugsdata", + "View consumption": "Se forbrug", + "View current and historical spot prices for DK1 and DK2": "Se aktuelle og historiske spotpriser for DK1 og DK2", + "View prices": "Se priser", + "Manage and view your metering point data": "Administrer og se dine målepunktsdata", + "Manage": "Administrer", + "Results": "Resultater", + "View spot prices from EnergiDataService": "Se spotpriser fra EnergiDataService", + "Calculate costs for custom hourly usage": "Beregn omkostninger for brugerdefineret timeforbrug", + "Calculate your electricity bill based on actual usage": "Beregn din elregning baseret på faktisk forbrug", + "Processing": "Behandler", + "Retrieve consumption data from Datahub or Smart-ME": "Hent forbrugsdata fra Datahub eller Smart-ME", + "Source:": "Kilde:", + "Smart-me id:": "Smart-me id:", + "Smart-me username:": "Smart-me brugernavn:", + "Smart-me password:": "Smart-me adgangskode:", + "View charges for your metering point": "Se priselementer for dit målepunkt", + "Manage your electricity metering points": "Administrer dine elmålepunkter", + "Hourly prices including all tariffs": "Timepriser inklusiv alle tariffer", + "Smart electricity insights for Denmark": "Smarte el-indsigter for Danmark", + "Developed by": "Udviklet af", + "Toggle navigation": "Skift navigation", + "App": "App", + "API-credentials created": "API-adgangsoplysninger oprettet", + "Create API-access": "Opret API-adgang", + "Access token": "Adgangstoken", + "Email": "E-mail", + "English": "Engelsk", + "Danish": "Dansk", + "Delete Account": "Slet konto", + "Smart-me credentials updated": "Smart-me adgangsoplysninger opdateret", + "Smart-me": "Smart-me", + "Username": "Brugernavn", + "Directory id": "Mappe-id", + "Reset Password": "Nulstil adgangskode", + "Send Password Reset Link": "Send link til nulstilling af adgangskode", + "Please confirm your password before continuing.": "Bekræft venligst din adgangskode før du fortsætter.", + "Forgot Your Password?": "Glemt din adgangskode?", + "Verify Your Email Address": "Bekræft din e-mailadresse", + "A fresh verification link has been sent to your email address.": "Et nyt bekræftelseslink er blevet sendt til din e-mailadresse.", + "Before proceeding, please check your email for a verification link.": "Tjek venligst din e-mail for et bekræftelseslink, inden du fortsætter.", + "If you did not receive the email": "Hvis du ikke har modtaget e-mailen", + "click here to request another": "klik her for at anmode om en ny", + "Add charge manually": "Tilføj priselement manuelt", + "Get charges from external source": "Hent priselementer fra ekstern kilde", + "Type": "Type", + "Position": "Position", + "Update charge": "Opdater priselement", + "Update metering point": "Opdater målepunkt", + "Consumer start date": "Forbruger startdato", + "Meter reading occurrence": "Måleraflæsningsfrekvens", + "City sub division name": "Bydelsnavn", + "Municipality code": "Kommunekode", + "Location description": "Stedbeskrivelse", + "First consumer party name": "Første forbrugerpartsnavn", + "Second consumer party name": "Anden forbrugerpartsnavn", + "Has Relation": "Har relation", + "Has relation": "Har relation", + "Charge updated successfully": "Priselementet blev opdateret med success" } diff --git a/resources/sass/_variables.scss b/resources/sass/_variables.scss index 172daaad..330a9a50 100644 --- a/resources/sass/_variables.scss +++ b/resources/sass/_variables.scss @@ -1,7 +1,53 @@ -// Body -$body-bg: #f8fafc; +// Colors +$primary: #0F766E; +$secondary: #64748B; +$success: #10B981; +$danger: #EF4444; +$warning: #F59E0B; +$info: #0EA5E9; +$body-bg: #F8FAFC; +$body-color: #0F172A; + +// Borders +$border-color: #E2E8F0; +$border-radius: 0.75rem; +$border-radius-sm: 0.5rem; +$border-radius-lg: 1rem; + +// Cards +$card-border-color: #E2E8F0; +$card-cap-bg: transparent; +$card-cap-padding-y: 1.25rem; +$card-cap-padding-x: 1.5rem; +$card-spacer-y: 1.25rem; +$card-spacer-x: 1.5rem; +$card-border-radius: 1rem; + +// Inputs +$input-border-color: #CBD5E1; +$input-border-radius: 0.5rem; +$input-focus-border-color: #0F766E; +$input-focus-box-shadow: 0 0 0 3px rgba(15, 118, 110, 0.15); +$input-padding-y: 0.625rem; +$input-padding-x: 0.875rem; + +// Buttons +$btn-border-radius: 0.5rem; +$btn-padding-y: 0.625rem; +$btn-padding-x: 1.25rem; +$btn-font-weight: 600; + +// Navbar +$navbar-padding-y: 0.75rem; +$navbar-light-color: #334155; +$navbar-light-hover-color: #0F766E; +$navbar-light-active-color: #0F766E; // Typography $font-family-sans-serif: 'Nunito', sans-serif; -$font-size-base: 0.9rem; +$font-size-base: 0.9375rem; $line-height-base: 1.6; +$headings-font-weight: 700; +$headings-color: #0F172A; +$headings-margin-bottom: 0.75rem; +$small-font-size: 0.8125rem; diff --git a/resources/sass/app.scss b/resources/sass/app.scss index db1a2837..7d8568db 100644 --- a/resources/sass/app.scss +++ b/resources/sass/app.scss @@ -1,7 +1,11 @@ $fa-font-path: "@fortawesome/fontawesome-free/webfonts"; // Fonts -@import "@fontsource/nunito/scss/mixins.scss"; +@import "@fontsource/nunito/300.css"; +@import "@fontsource/nunito/400.css"; +@import "@fontsource/nunito/600.css"; +@import "@fontsource/nunito/700.css"; +@import "@fontsource/nunito/800.css"; // Font Awesome @import "@fortawesome/fontawesome-free/scss/fontawesome.scss"; @import "@fortawesome/fontawesome-free/scss/solid.scss"; @@ -14,6 +18,617 @@ $fa-font-path: "@fortawesome/fontawesome-free/webfonts"; // Bootstrap @import 'bootstrap/scss/bootstrap'; +// Font Awesome 7 alias — SCSS only defines .fas, not .fa-solid +.fa-solid { + @extend .fas; +} + +.fa-regular { + @extend .far; +} + +// Design tokens +:root { + --pu-accent: #F59E0B; + --pu-gradient-start: #0F766E; + --pu-gradient-end: #14B8A6; + --pu-surface-elevated: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04); + --pu-surface-hover: 0 4px 12px rgba(0,0,0,0.08); + --pu-text-secondary: #64748B; + --pu-text-muted: #94A3B8; + --pu-border-light: #F1F5F9; + --pu-transition: 0.2s ease; +} + +// Typography utilities +.page-title { + font-size: 1.75rem; + font-weight: 800; + letter-spacing: -0.025em; + color: #0F172A; +} + +.page-subtitle { + font-size: 1rem; + font-weight: 400; + color: var(--pu-text-secondary); + margin-top: 0.25rem; +} + +.section-label { + font-size: 0.75rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--pu-text-muted); +} + +// Card enhancements +.card { + box-shadow: var(--pu-surface-elevated); + transition: box-shadow var(--pu-transition); + overflow: hidden; +} + +.card-header { + border-bottom: 1px solid var(--pu-border-light); + + .card-title { + margin-bottom: 0; + font-size: 1.125rem; + font-weight: 700; + } +} + +.card-premium { + border-top: 3px solid transparent; + border-image: linear-gradient(90deg, var(--pu-gradient-start), var(--pu-gradient-end)) 1; +} + +.card-icon { + width: 2.75rem; + height: 2.75rem; + border-radius: 0.75rem; + background: linear-gradient(135deg, var(--pu-gradient-start), var(--pu-gradient-end)); + display: flex; + align-items: center; + justify-content: center; + color: white; + font-size: 1.125rem; + flex-shrink: 0; +} + +// Data panel (replaces raw
 JSON)
+.data-panel {
+  background: #F8FAFC;
+  border: 1px solid #E2E8F0;
+  border-radius: 0.75rem;
+  margin: 1rem 1.5rem;
+  overflow: hidden;
+
+  .data-panel-header {
+    padding: 0.75rem 1rem;
+    background: white;
+    border-bottom: 1px solid #E2E8F0;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    cursor: pointer;
+
+    .data-panel-title {
+      font-size: 0.8125rem;
+      font-weight: 700;
+      color: var(--pu-text-secondary);
+      text-transform: uppercase;
+      letter-spacing: 0.05em;
+    }
+  }
+
+  .data-panel-body {
+    padding: 1rem;
+    max-height: 400px;
+    overflow-y: auto;
+
+    pre {
+      margin: 0;
+      font-size: 0.8125rem;
+      line-height: 1.6;
+      color: #334155;
+      white-space: pre-wrap;
+      word-break: break-word;
+    }
+  }
+}
+
+// Form enhancements
+.form-group {
+  margin-bottom: 1.25rem;
+
+  label {
+    font-size: 0.8125rem;
+    font-weight: 600;
+    color: #334155;
+    margin-bottom: 0.375rem;
+  }
+}
+
+.form-section {
+  padding: 1.5rem;
+  border-bottom: 1px solid var(--pu-border-light);
+
+  &:last-child {
+    border-bottom: none;
+  }
+}
+
+.form-section-title {
+  font-size: 0.75rem;
+  font-weight: 700;
+  text-transform: uppercase;
+  letter-spacing: 0.05em;
+  color: var(--pu-text-muted);
+  margin-bottom: 1rem;
+}
+
+// Radio button pill styling
+.form-check-inline-styled {
+  display: inline-flex;
+  gap: 0.5rem;
+
+  .form-check-label {
+    display: inline-flex;
+    align-items: center;
+    padding: 0.5rem 1rem;
+    border: 1px solid #E2E8F0;
+    border-radius: 0.5rem;
+    cursor: pointer;
+    font-size: 0.875rem;
+    font-weight: 600;
+    color: #475569;
+    transition: all var(--pu-transition);
+    background: white;
+
+    &:hover {
+      border-color: $primary;
+      color: $primary;
+    }
+  }
+
+  input[type="radio"]:checked + .form-check-label {
+    border-color: $primary;
+    background: rgba(15, 118, 110, 0.06);
+    color: $primary;
+  }
+
+  input[type="radio"] {
+    display: none;
+  }
+}
+
+// Button system
+.btn {
+  font-weight: 600;
+  letter-spacing: 0.01em;
+  transition: all var(--pu-transition);
+  border-radius: 0.5rem;
+  font-size: 0.875rem;
+  padding: 0.625rem 1.25rem;
+  &:hover {
+    transform: translateY(-1px);
+  }
+
+  &:active {
+    transform: translateY(0);
+  }
+
+  &:disabled, &.disabled {
+    opacity: 0.6;
+    transform: none;
+    box-shadow: none;
+  }
+
+  > i, > .spinner-border {
+    margin-right: 0.375rem;
+    font-size: 0.8em;
+  }
+}
+
+.btn-primary {
+  &:hover {
+    box-shadow: 0 4px 12px rgba(15, 118, 110, 0.3);
+  }
+}
+
+.btn-secondary {
+  background-color: #F1F5F9;
+  border-color: #E2E8F0;
+  color: #475569;
+
+  &:hover {
+    background-color: #E2E8F0;
+    border-color: #CBD5E1;
+    color: #334155;
+    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
+  }
+}
+
+.btn-danger {
+  &:hover {
+    box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);
+  }
+}
+
+.btn-outline-secondary {
+  border-color: #E2E8F0;
+  color: #475569;
+
+  &:hover {
+    background-color: #F8FAFC;
+    border-color: #CBD5E1;
+    color: #334155;
+  }
+}
+
+.btn-info {
+  background-color: #0EA5E9;
+  border-color: #0EA5E9;
+  color: white;
+
+  &:hover {
+    background-color: #0284C7;
+    border-color: #0284C7;
+    box-shadow: 0 4px 12px rgba(14, 165, 233, 0.3);
+  }
+}
+
+.btn-link {
+  font-weight: 600;
+  text-decoration: none;
+  padding: 0;
+
+  &:hover {
+    text-decoration: underline;
+    transform: none;
+  }
+}
+
+// Action buttons — uniform width with centered text
+.btn-action {
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  width: 18rem;
+  max-width: 100%;
+}
+
+// Consistent button sizing
+.btn-sm {
+  font-size: 0.8125rem;
+  padding: 0.375rem 0.875rem;
+}
+
+.btn-lg {
+  font-size: 1rem;
+  padding: 0.75rem 1.75rem;
+  border-radius: 0.625rem;
+}
+
+// Form submit button consistency
+form .btn[type="submit"],
+form button.btn-primary {
+  min-width: 8rem;
+}
+
+// Override Tailwind button components to match Bootstrap design
+[class*="bg-gray-800"][class*="rounded-md"],
+[class*="bg-red-600"][class*="rounded-md"],
+[class*="bg-white"][class*="border-gray-300"][class*="rounded-md"] {
+  font-family: 'Nunito', sans-serif !important;
+  border-radius: 0.5rem !important;
+  font-size: 0.875rem !important;
+  font-weight: 600 !important;
+  letter-spacing: 0.01em !important;
+  padding: 0.625rem 1.25rem !important;
+  text-transform: none !important;
+  transition: all 0.2s ease !important;
+}
+
+[class*="bg-gray-800"][class*="rounded-md"] {
+  background-color: $primary !important;
+
+  &:hover {
+    background-color: darken($primary, 8%) !important;
+    transform: translateY(-1px);
+    box-shadow: 0 4px 12px rgba(15, 118, 110, 0.3);
+  }
+}
+
+[class*="bg-red-600"][class*="rounded-md"] {
+  background-color: #EF4444 !important;
+
+  &:hover {
+    background-color: #DC2626 !important;
+    transform: translateY(-1px);
+    box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);
+  }
+}
+
+[class*="bg-white"][class*="border-gray-300"][class*="rounded-md"] {
+  background-color: #F1F5F9 !important;
+  border-color: #E2E8F0 !important;
+  color: #475569 !important;
+
+  &:hover {
+    background-color: #E2E8F0 !important;
+    transform: translateY(-1px);
+  }
+}
+
+// Navbar
+.navbar-accent-bar {
+  height: 3px;
+  background: linear-gradient(90deg, var(--pu-gradient-start), var(--pu-gradient-end), var(--pu-accent));
+}
+
+.navbar-main {
+  border-bottom: 1px solid var(--pu-border-light);
+  transition: box-shadow var(--pu-transition);
+
+  &.scrolled {
+    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);
+  }
+
+  .navbar-brand {
+    font-weight: 800;
+    font-size: 1.25rem;
+    color: #0F172A;
+    letter-spacing: -0.025em;
+  }
+
+  .nav-link {
+    font-weight: 600;
+    font-size: 0.8125rem;
+    color: #475569;
+    padding: 0.5rem 0.75rem;
+    border-radius: 0.5rem;
+    transition: all var(--pu-transition);
+
+    &:hover {
+      color: $primary;
+      background-color: rgba(15, 118, 110, 0.06);
+    }
+
+    &.active {
+      color: $primary;
+      background-color: rgba(15, 118, 110, 0.1);
+    }
+
+    i {
+      font-size: 0.75rem;
+      opacity: 0.7;
+    }
+  }
+}
+
+// Footer
+.footer-main {
+  background: white;
+  border-top: 1px solid #E2E8F0;
+  margin-top: 3rem;
+}
+
+.footer-brand {
+  font-weight: 800;
+  font-size: 1rem;
+  color: #0F172A;
+}
+
+.footer-tagline {
+  font-size: 0.75rem;
+  color: var(--pu-text-muted);
+}
+
+.footer-credits {
+  font-size: 0.8125rem;
+  color: var(--pu-text-secondary);
+}
+
+.footer-link {
+  color: $primary;
+  text-decoration: none;
+  font-weight: 600;
+  font-size: 0.8125rem;
+  transition: color var(--pu-transition);
+
+  &:hover {
+    color: darken($primary, 10%);
+    text-decoration: underline;
+  }
+}
+
+// Hero section
+.hero-section {
+  padding: 3rem 0 2rem;
+  background: linear-gradient(135deg, #F0FDFA 0%, #F8FAFC 50%, #FFF7ED 100%);
+  border-bottom: 1px solid #E2E8F0;
+}
+
+.hero-badge {
+  display: inline-flex;
+  align-items: center;
+  padding: 0.375rem 0.875rem;
+  background: rgba(15, 118, 110, 0.08);
+  color: $primary;
+  font-size: 0.8125rem;
+  font-weight: 700;
+  border-radius: 2rem;
+}
+
+.hero-title {
+  font-size: 2.5rem;
+  font-weight: 800;
+  color: #0F172A;
+  letter-spacing: -0.03em;
+  line-height: 1.2;
+}
+
+.hero-description {
+  font-size: 1.125rem;
+  color: var(--pu-text-secondary);
+  line-height: 1.7;
+  max-width: 32rem;
+}
+
+.min-vh-50 {
+  min-height: 50vh;
+}
+
+.hero-video-container {
+  border-radius: 1rem;
+  overflow: hidden;
+  box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
+  border: 1px solid #E2E8F0;
+  background: #0F172A;
+}
+
+.hero-video {
+  width: 100%;
+  height: auto;
+  display: block;
+}
+
+.feature-card {
+  padding: 1.75rem;
+  background: white;
+  border: 1px solid #E2E8F0;
+  border-radius: 1rem;
+  height: 100%;
+  transition: all 0.3s ease;
+
+  &:hover {
+    transform: translateY(-4px);
+    box-shadow: 0 12px 24px rgba(0, 0, 0, 0.08);
+  }
+}
+
+.feature-title {
+  font-size: 1.125rem;
+  font-weight: 700;
+  color: #0F172A;
+  margin-bottom: 0.5rem;
+}
+
+.feature-desc {
+  font-size: 0.875rem;
+  color: var(--pu-text-secondary);
+  line-height: 1.6;
+  margin-bottom: 1rem;
+}
+
+.feature-link {
+  font-size: 0.875rem;
+  font-weight: 700;
+  color: $primary;
+  text-decoration: none;
+
+  &:hover {
+    text-decoration: underline;
+
+    i { transform: translateX(3px); }
+  }
+
+  i { transition: transform var(--pu-transition); }
+}
+
+// Animations
+main > .container {
+  animation: fadeInUp 0.3s ease-out;
+}
+
+@keyframes fadeInUp {
+  from { opacity: 0; transform: translateY(8px); }
+  to { opacity: 1; transform: translateY(0); }
+}
+
+// Alert improvements
+.alert {
+  border: none;
+  border-radius: 0.75rem;
+  padding: 1rem 1.25rem;
+  font-size: 0.875rem;
+  font-weight: 600;
+  animation: slideInDown 0.3s ease-out;
+
+  &.alert-success {
+    background-color: #F0FDF4;
+    color: #166534;
+    border-left: 4px solid #10B981;
+  }
+
+  &.alert-danger {
+    background-color: #FEF2F2;
+    color: #991B1B;
+    border-left: 4px solid #EF4444;
+  }
+
+  &.alert-warning {
+    background-color: #FFFBEB;
+    color: #92400E;
+    border-left: 4px solid #F59E0B;
+  }
+}
+
+@keyframes slideInDown {
+  from { opacity: 0; transform: translateY(-12px); }
+  to { opacity: 1; transform: translateY(0); }
+}
+
+// Flatpickr overrides
+.flatpickr-calendar {
+  border-radius: 0.75rem !important;
+  box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1) !important;
+  border: 1px solid #E2E8F0 !important;
+}
+
+.flatpickr-day.selected,
+.flatpickr-day.startRange,
+.flatpickr-day.endRange {
+  background: $primary !important;
+  border-color: $primary !important;
+}
+
+.flatpickr-day:hover {
+  background: rgba(15, 118, 110, 0.1) !important;
+  border-color: rgba(15, 118, 110, 0.1) !important;
+}
+
+// Toggle switch color update
+input:checked + .slider {
+  background-color: $primary;
+}
+
+input:focus + .slider {
+  box-shadow: 0 0 0 3px rgba(15, 118, 110, 0.2);
+}
+
+// Focus ring
+*:focus-visible {
+  outline: 2px solid rgba(15, 118, 110, 0.5);
+  outline-offset: 2px;
+}
+
+// Responsive
+@media (min-width: 1200px) {
+  .container { max-width: 1080px; }
+}
+
+@media (max-width: 767.98px) {
+  .hero-title { font-size: 1.75rem; }
+  .page-title { font-size: 1.375rem; }
+  .card-header, .card-body { padding: 1rem; }
+  .data-panel-body { max-height: 250px; }
+}
+
 // Datepicker
 @import 'flatpickr/dist/flatpickr.css';
 
@@ -60,14 +675,6 @@ $fa-font-path: "@fortawesome/fontawesome-free/webfonts";
   transition: .4s;
 }
 
-input:checked + .slider {
-  background-color: #2196F3;
-}
-
-input:focus + .slider {
-  box-shadow: 0 0 1px #2196F3;
-}
-
 input:checked + .slider:before {
   -webkit-transform: translateX(26px);
   -ms-transform: translateX(26px);
@@ -83,63 +690,41 @@ input:checked + .slider:before {
   border-radius: 50%;
 }
 
+// PWA box modernization
 .box {
   z-index: -1;
   position: fixed;
-  top: 1.25em;
-  right: 0.75em;
-  max-width: 18em;
-  border: 2px solid gray;
-  border-radius: 0.5em;
-  box-shadow: -1em 1em 2em rgb(0 0 0 / 50%);
-  xxbackground-color: #aaa;
-  font-size: 0.9em;
-  font-family: verdana, sans-serif;
-  padding: 1em;
-  background: rgb(179,190,173);
-  background: -moz-linear-gradient(45deg, rgba(179,190,173,1) 0%, rgba(223,229,215,1) 60%, rgba(252,255,244,1) 100%);
-  background: -webkit-linear-gradient(45deg, rgba(179,190,173,1) 0%,rgba(223,229,215,1) 60%,rgba(252,255,244,1) 100%);
-  background: linear-gradient(45deg, rgba(179,190,173,1) 0%,rgba(223,229,215,1) 60%,rgba(252,255,244,1) 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#b3bead', endColorstr='#fcfff4',GradientType=1 );
-}
-
-.arrow {
-  z-index: 2;
-  position: fixed;
-  top: 0.4em;
-  right: 0.7em;
-  width: 0;
-  height: 0;
-  border-left: 0.75em solid transparent;
-  border-right: 0.75em solid transparent;
-  xxborder-bottom: 1.4em solid rgba(252,255,244,1);
-  border-bottom: 1.4em solid red;
-  z-order: 10;
-  font-family: verdana;
+  top: 4.5rem;
+  right: 0.75rem;
+  max-width: 20em;
+  border-radius: 1rem;
+  box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
+  background: white;
+  font-size: 0.875rem;
+  padding: 1.5rem;
+  border: 1px solid #E2E8F0;
 }
 
 .step {
   position: relative;
-  padding: 0.5em;
-  background-color: rgba(250,250,250,0.9);
-  margin-top: 1.028em;
-  font-size: 0.9em;
-  padding-top: 0.85em;
-  padding-bottom: 0.85em;
-  border-radius: 0.5em;
-  margin-left: 1.5em;
-  border: 1px solid gray;
-}
-
-.step>div {
-  position: absolute;
-  width: 1.15em;
-  height: 1.5em;
-  top: 0.3em;
-  left: -1.25em;
-  color: rgba(0,0,0,0.4);
-  font-weight: bold;
-  font-size: 1.2em;
+  padding: 0.75rem 0.75rem 0.75rem 2.5rem;
+  background: #F8FAFC;
+  margin-top: 0.75rem;
+  font-size: 0.8125rem;
+  border-radius: 0.5rem;
+  border: 1px solid var(--pu-border-light);
+
+  > div {
+    position: absolute;
+    width: 1.5rem;
+    height: 1.5rem;
+    top: 50%;
+    transform: translateY(-50%);
+    left: 0.625rem;
+    color: $primary;
+    font-weight: 800;
+    font-size: 0.875rem;
+  }
 }
 
 .pwa-toast {
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php
index 1325fe13..20a63d85 100644
--- a/resources/views/auth/login.blade.php
+++ b/resources/views/auth/login.blade.php
@@ -42,6 +42,7 @@
                         
diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index 12cad1a9..3533ecfd 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -64,6 +64,7 @@
diff --git a/resources/views/charges.blade.php b/resources/views/charges.blade.php index eb9f69bb..5a78fb4e 100644 --- a/resources/views/charges.blade.php +++ b/resources/views/charges.blade.php @@ -3,14 +3,28 @@ @section('content')
-
- {{ __('Get charges for metering point') }} +
+
+
+
+

{{ __('Get charges for metering point') }}

+

{{ __('View charges for your metering point') }}

+
+
@if($data) -
{{ json_encode($data, JSON_UNESCAPED_SLASHES+JSON_UNESCAPED_UNICODE+JSON_PRETTY_PRINT) }}
+
+
+ {{ __('Results') }} + +
+
+
{{ json_encode($data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT) }}
+
+
{{ csrf_field() }} - +
@endif
diff --git a/resources/views/components/charges/Charge.vue b/resources/views/components/charges/Charge.vue index b4d90780..8d0b8f8a 100644 --- a/resources/views/components/charges/Charge.vue +++ b/resources/views/components/charges/Charge.vue @@ -2,32 +2,26 @@
-
-

{{ $t('Charges') }} - {{ metering_point_gsrn }}

-
-
- - -
+
+
+
{{ $t('Add charge manually') }}
+
-
-
-
-
-
- - -
-
- - -
-
-
+
+
{{ $t('Get charges from external source') }}
+
+
+ + +
+
+ +
+
@@ -99,14 +93,16 @@ :pageCount="last_page" :prev-text="$t('Prev')" :next-text="$t('Next')"> - - +
+ + +
@@ -219,9 +215,9 @@
diff --git a/resources/views/components/footer.blade.php b/resources/views/components/footer.blade.php index 4f28cb60..8d0477f8 100644 --- a/resources/views/components/footer.blade.php +++ b/resources/views/components/footer.blade.php @@ -1,13 +1,17 @@ -
-
- +
+
+
+ PowerUse + +
+
+ +
+
- - -
\ No newline at end of file +
diff --git a/resources/views/components/metering-points/MeteringPoint.vue b/resources/views/components/metering-points/MeteringPoint.vue index a7c3448e..9402bd8a 100644 --- a/resources/views/components/metering-points/MeteringPoint.vue +++ b/resources/views/components/metering-points/MeteringPoint.vue @@ -2,223 +2,161 @@
-
-

{{ $t('Metering point') }}

-
-

{{ $t('Add metering point manually') }}

-
-
- - -
+
+
+
{{ $t('Add metering point manually') }}
+
-
-

{{ $t('Get metering point from external source') }}

-
+
+
{{ $t('Get metering point from external source') }}
- -
- - -
-
- - + +
+
+ + +
+
+ + +
-
- - +
+ +
- -
- +
+
-
-
-
-
-
-
-
-
-
+
+
+
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
- -
+ -
-
- - - -
+
+ + + +
-
-
-
-
@@ -434,9 +372,9 @@
diff --git a/resources/views/components/totalprices/form.blade.php b/resources/views/components/totalprices/form.blade.php index 03a76fad..08c881d1 100644 --- a/resources/views/components/totalprices/form.blade.php +++ b/resources/views/components/totalprices/form.blade.php @@ -40,7 +40,11 @@ />
- {{ html()->button(__('Get'), 'submit')->class('btn btn-primary mt-2') }} +
+ +
{{ html()->form()->close() }}
diff --git a/resources/views/consumption.blade.php b/resources/views/consumption.blade.php index 31e16ca3..086bbd56 100644 --- a/resources/views/consumption.blade.php +++ b/resources/views/consumption.blade.php @@ -13,11 +13,25 @@
@endif
-
- Hent forbrug +
+
+
+
+

Hent forbrug

+

{{ __('Retrieve consumption data from Datahub or Smart-ME') }}

+
+
@if(@isset($data)) -
{{ $data ? json_encode($data, JSON_UNESCAPED_SLASHES+JSON_UNESCAPED_UNICODE+JSON_PRETTY_PRINT) : '' }}
+
+
+ {{ __('Results') }} + +
+
+
{{ $data ? json_encode($data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT) : '' }}
+
+
@endif
@@ -62,7 +76,11 @@
- +
+ +
diff --git a/resources/views/el-custom.blade.php b/resources/views/el-custom.blade.php index 10737323..f5e0c6ad 100644 --- a/resources/views/el-custom.blade.php +++ b/resources/views/el-custom.blade.php @@ -18,10 +18,26 @@
@endif
-
- Beregning af et bestemt forbrug i dag +
+
+
+
+

Beregning af et bestemt forbrug i dag

+

{{ __('Calculate costs for custom hourly usage') }}

+
+
+
+ @if($data) +
+
+ {{ __('Results') }} + +
+
+
{{ json_encode($data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT) }}
+
-
{{ $data ? json_encode($data, JSON_UNESCAPED_SLASHES+JSON_UNESCAPED_UNICODE+JSON_PRETTY_PRINT) : '' }}
+ @endif
{{ csrf_field() }} @@ -53,7 +69,11 @@
- +
+ +
diff --git a/resources/views/el-spotprices.blade.php b/resources/views/el-spotprices.blade.php index cfdf5b94..2b4dcd24 100644 --- a/resources/views/el-spotprices.blade.php +++ b/resources/views/el-spotprices.blade.php @@ -13,15 +13,29 @@
@endif
-
- Hent spotpriser +
+
+
+
+

Hent spotpriser

+

{{ __('View spot prices from EnergiDataService') }}

+
+
@if(@isset($data)) - @if(old('outputformat')=='SQL') -
{{ $data ? $data : '' }}
- @else -
{{ $data ? json_encode($data, JSON_UNESCAPED_SLASHES+JSON_UNESCAPED_UNICODE+JSON_PRETTY_PRINT) : '' }}
- @endif +
+
+ {{ __('Results') }} + +
+
+ @if(old('outputformat')=='SQL') +
{{ $data ? $data : '' }}
+ @else +
{{ $data ? json_encode($data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT) : '' }}
+ @endif +
+
@endif
@@ -58,7 +72,11 @@
- +
+ +
diff --git a/resources/views/el.blade.php b/resources/views/el.blade.php index 0f7efaf2..17e4e631 100644 --- a/resources/views/el.blade.php +++ b/resources/views/el.blade.php @@ -18,10 +18,26 @@
@endif
-
- {{ __('Calculation of energy data') }} +
+
+
+
+

{{ __('Calculation of energy data') }}

+

{{ __('Calculate your electricity bill based on actual usage') }}

+
+
+
+ @if($data) +
+
+ {{ __('Results') }} + +
+
+
{{ json_encode($data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT) }}
+
-
{{ $data ? json_encode($data, JSON_UNESCAPED_SLASHES+JSON_UNESCAPED_UNICODE+JSON_PRETTY_PRINT) : '' }}
+ @endif
{{ csrf_field() }} @@ -74,10 +90,12 @@
- +
+ +
@@ -128,6 +146,7 @@ function updateDatePicker($boolean) { $('#get-preliminary-invoice-form').on('submit', function() { $('#submit-spinner').removeClass('d-none'); + $('#submit-icon').addClass('d-none'); $('#submit-text').text('{{ __('Processing') }}...'); $('#submit-btn').prop('disabled', true); }); diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index bce39193..bd2f2568 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -1,22 +1,32 @@ @extends('layouts.app') @section('content') -
-
-
-
-
{{ __('Welcome to PowerUse') }}
- -
- @if (session('status')) - - @endif - -

{{ __('Here you\'ll find tools for calculation on electricity usage and tools to retrieve data from operators in the energy market') }}

-

{{ __('Below you can find a video on how to retrieve a refresh token from energioverblik which is used to retrieve consumption and static data for your metering point') }}

-