diff --git a/.gitignore b/.gitignore index e9cdc70..e00c845 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,16 @@ Homestead.yaml npm-debug.log yarn-error.log .npmrc + +# Ignore public favicon +/public/android-chrome-192x192.png +/public/android-chrome-512x512.png +/public/apple-touch-icon.png +/public/browserconfig.xml +/public/browserconfig.xml +/public/favicon-16x16.png +/public/favicon-32x32.png +/public/favicon.ico +/public/mstile-150x150.png +/public/safari-pinned-tab.svg +/public/site.webmanifest diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0c9015f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM registry.s-web.fr/ldc-web/projets/ldc-web-images-docker/ldcweb-production-8.2:latest +COPY --chown=www-data:www-data . /app/srcs +USER root +RUN chmod -R 755 /app/srcs/storage +USER www-data diff --git a/app/Enums/Theme/BootstrapThemeEnum.php b/app/Enums/Theme/BootstrapThemeEnum.php index f1f3725..a9683e8 100644 --- a/app/Enums/Theme/BootstrapThemeEnum.php +++ b/app/Enums/Theme/BootstrapThemeEnum.php @@ -15,7 +15,7 @@ enum BootstrapThemeEnum: int * Optionnal labels definition */ private const LABELS = [ - self::light->name => 'Light', - self::dark->name => 'Dark', + self::light->name => 'enums.bootstrap-theme.light', + self::dark->name => 'enums.bootstrap-theme.dark', ]; } diff --git a/app/Enums/Users/RoleEnum.php b/app/Enums/Users/RoleEnum.php index 53b5ada..94d0471 100644 --- a/app/Enums/Users/RoleEnum.php +++ b/app/Enums/Users/RoleEnum.php @@ -16,8 +16,8 @@ enum RoleEnum: int * Optionnal labels definition. */ private const LABELS = [ - self::conceptor->name => 'Concepteur', - self::admin->name => 'Administrateur', - self::visitor->name => 'Visiteur', + self::conceptor->name => 'enums.user-role.conceptor', + self::admin->name => 'enums.user-role.admin', + self::visitor->name => 'enums.user-role.visitor', ]; } diff --git a/app/Http/Controllers/Bo/UserController.php b/app/Http/Controllers/Bo/UserController.php index 72f632e..a723403 100644 --- a/app/Http/Controllers/Bo/UserController.php +++ b/app/Http/Controllers/Bo/UserController.php @@ -63,7 +63,6 @@ class UserController extends Controller return view('bo.pages.users.index', compact('userModels', 'search', 'searchFields')); } - /** * Show the form for creating a new resource. * diff --git a/app/Http/Controllers/Fo/StaticPageController.php b/app/Http/Controllers/Fo/StaticPageController.php new file mode 100644 index 0000000..d233b4c --- /dev/null +++ b/app/Http/Controllers/Fo/StaticPageController.php @@ -0,0 +1,46 @@ +where('type', StaticPageType::contact)->first(); + return view('fo.pages.legals', ['staticPageModel' => $contactPage]); + } + + /** + * Legal show + * + * @param \App\Models\StaticPage $legalPage + * @return \Illuminate\Contracts\View\View + */ + public function legals(StaticPage $legalPage) + { + $legalPage = StaticPage::query()->where('type', StaticPageType::legals)->first(); + return view('fo.pages.legals', ['staticPageModel' => $legalPage]); + } + + /** + * Policies show + * + * @param \App\Models\StaticPage $policiesPage + * @return \Illuminate\Contracts\View\View + */ + public function policies(StaticPage $policiesPage) + { + $policiesPage = StaticPage::query()->where('type', StaticPageType::confidentiality)->first(); + return view('fo.pages.legals', ['staticPageModel' => $policiesPage]); + } +} diff --git a/app/Http/Middleware/SecureHeaders.php b/app/Http/Middleware/SecureHeaders.php index db85da3..19aaa34 100644 --- a/app/Http/Middleware/SecureHeaders.php +++ b/app/Http/Middleware/SecureHeaders.php @@ -53,13 +53,18 @@ class SecureHeaders "default-src 'none';", "manifest-src 'self';", // * CKEDITOR Specific https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/csp.html - "connect-src 'self' " . implode(' ', [ + "connect-src 'self' blob: " . implode(' ', [ // * VITE DEV config('app.debug') ? "wss://{$host}:4443" : '', config('app.debug') ? "https://{$host}:4443" : '', + 'https://yl.s-web.fr' ]) . ';', - "img-src * data: blob:;", - 'frame-src ' . implode(' ', [ + "img-src 'self' data: blob: " . implode(' ', [ + // * VITE DEV + config('app.debug') ? "https://{$host}:4443" : '', + ]) . ';', + "object-src 'self' " . implode(' ', []) . ';', + "frame-src 'self' " . implode(' ', [ 'https://www.google.com/recaptcha/', 'https://recaptcha.google.com/recaptcha/', 'https://www.google.com/maps/' diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index d727add..608f711 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -10,9 +10,11 @@ class TrustProxies extends Middleware /** * The trusted proxies for this application. * + * ! Added * as tmp Fix for #13 + * * @var array|string|null */ - protected $proxies; + protected $proxies = '*'; /** * The headers that should be used to detect proxies. @@ -20,7 +22,7 @@ class TrustProxies extends Middleware * @var integer */ protected $headers = - Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO | diff --git a/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php b/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php index 6f6e9cb..a309bc4 100644 --- a/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php +++ b/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php @@ -13,7 +13,7 @@ class UpdateStaticPageRequest extends FormRequest * * @return boolean */ - public function authorize() + public function authorize(): bool { return Gate::check('update', $this->route('static_page')); } @@ -38,10 +38,10 @@ class UpdateStaticPageRequest extends FormRequest public function rules(): array { return [ - 'seo_title' => 'required|min:45|max:70', + 'seo_title' => 'required|min:45|max:70', 'seo_description' => 'required|min:50|max:160', - 'title' => 'required|min:3|max:255', - 'content' => 'present', + 'title' => 'required|min:3|max:255', + 'content' => 'present', ]; } @@ -53,10 +53,10 @@ class UpdateStaticPageRequest extends FormRequest public function attributes(): array { return [ - 'seo_title' => trans('validation.custom.seo_title'), + 'seo_title' => trans('validation.custom.seo_title'), 'seo_description' => trans('validation.custom.seo_description'), - 'name' => trans('validation.attributes.title'), - 'content' => trans('validation.attributes.content'), + 'title' => trans('validation.attributes.title'), + 'content' => trans('validation.attributes.content'), ]; } } diff --git a/app/Http/Requests/Bo/UpdateChangeOrderRequest.php b/app/Http/Requests/Bo/UpdateChangeOrderRequest.php index b88283e..d6be727 100644 --- a/app/Http/Requests/Bo/UpdateChangeOrderRequest.php +++ b/app/Http/Requests/Bo/UpdateChangeOrderRequest.php @@ -24,7 +24,7 @@ class UpdateChangeOrderRequest extends FormRequest protected function prepareForValidation(): void { $this->merge([ - 'direction' => $this->direction === 'up' ? true : false + 'direction' => $this->route('direction') === 'up' ? true : false ]); } diff --git a/app/Http/Requests/Bo/UpdateMiniCrudRequest.php b/app/Http/Requests/Bo/UpdateMiniCrudRequest.php index 40c2f4a..ac3d1d0 100644 --- a/app/Http/Requests/Bo/UpdateMiniCrudRequest.php +++ b/app/Http/Requests/Bo/UpdateMiniCrudRequest.php @@ -21,7 +21,7 @@ abstract class UpdateMiniCrudRequest extends FormRequest * * @return boolean */ - public function authorize() + public function authorize(): bool { return auth('backend')->check(); } @@ -33,7 +33,7 @@ abstract class UpdateMiniCrudRequest extends FormRequest * @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh * @phpcs:disable Generic.Metrics.NestingLevel.TooHigh */ - public function rules() + public function rules(): array { // phpcs:enable $rules = []; @@ -87,10 +87,9 @@ abstract class UpdateMiniCrudRequest extends FormRequest break; case InputType::image->value: $required = $this->isUpdate() ? 'sometimes' : 'required'; - - $ipt = $this->data[$iptName]; - $max = isset($ipt['dimensionsMax']); - $dim = \is_string($input['dimensions']) ? collect(explode( + $ipt = $this->data[$iptName]; + $max = isset($ipt['dimensionsMax']); + $dim = \is_string($input['dimensions']) ? collect(explode( ',', (isset($ipt['dimensionsMax']) and is_string($ipt['dimensionsMax'])) ? $ipt['dimensionsMax'] : $input['dimensions'] @@ -127,7 +126,7 @@ abstract class UpdateMiniCrudRequest extends FormRequest ]), $input ), - "data.$iptName.alt" => $this->compileValidate("$required|string|min:5", $input), + "data.$iptName.alt" => $this->compileValidate("$required|string|min:5", $input), "data.$iptName.title" => $this->compileValidate("$required|string|min:5", $input) ]); break; diff --git a/app/Http/Requests/Bo/Users/StoreUserRequest.php b/app/Http/Requests/Bo/Users/StoreUserRequest.php index dbbef55..3253b45 100644 --- a/app/Http/Requests/Bo/Users/StoreUserRequest.php +++ b/app/Http/Requests/Bo/Users/StoreUserRequest.php @@ -15,7 +15,7 @@ class StoreUserRequest extends FormRequest * * @return boolean */ - public function authorize() + public function authorize(): bool { return Gate::check('create', User::class); } @@ -25,7 +25,7 @@ class StoreUserRequest extends FormRequest * * @return void */ - protected function prepareForValidation() + protected function prepareForValidation(): void { $this->merge([ 'published' => $this->boolean('published') @@ -41,9 +41,9 @@ class StoreUserRequest extends FormRequest { return [ 'first_name' => 'required|string|min:3|max:255', - 'last_name' => 'required|string|min:3|max:255', - 'email' => 'required|email:rfc,strict,dns,spoof,filter|unique:users,email', - 'password' => [ + 'last_name' => 'required|string|min:3|max:255', + 'email' => 'required|email:rfc,strict,dns,spoof,filter|unique:users,email', + 'password' => [ 'required', 'required_with:password_confirmation', 'confirmed', 'max:255', Password::min(8) ->letters() ->mixedCase() @@ -51,8 +51,8 @@ class StoreUserRequest extends FormRequest ->symbols() ->uncompromised() ], - 'role' => ['required', new Enum(RoleEnum::class)], - 'published' => 'required|boolean', + 'role' => ['required', new Enum(RoleEnum::class)], + 'published' => 'required|boolean', ]; } @@ -65,11 +65,11 @@ class StoreUserRequest extends FormRequest { return [ 'first_name' => trans('validation.attributes.first_name'), - 'last_name' => trans('validation.attributes.last_name'), - 'email' => trans('validation.attributes.email'), - 'password' => trans('validation.attributes.password'), - 'role' => trans('validation.attributes.role'), - 'published' => trans('validation.custom.publication') + 'last_name' => trans('validation.attributes.last_name'), + 'email' => trans('validation.attributes.email'), + 'password' => trans('validation.attributes.password'), + 'role' => trans('validation.attributes.role'), + 'published' => trans('validation.custom.publication') ]; } } diff --git a/app/Http/Requests/Bo/Users/UpdateUserRequest.php b/app/Http/Requests/Bo/Users/UpdateUserRequest.php index c19c740..bdd2489 100644 --- a/app/Http/Requests/Bo/Users/UpdateUserRequest.php +++ b/app/Http/Requests/Bo/Users/UpdateUserRequest.php @@ -13,7 +13,7 @@ class UpdateUserRequest extends StoreUserRequest * * @return boolean */ - public function authorize() + public function authorize(): bool { return Gate::check('update', $this->route('user')); } @@ -23,16 +23,14 @@ class UpdateUserRequest extends StoreUserRequest * * @return void */ - protected function prepareForValidation() + protected function prepareForValidation(): void { $this->merge([ - 'published' => $this->boolean('published'), - 'password' => $this->input( - 'password', - ) ?? $this->route('user')->password, - 'password_confirmation' => $this->input( - 'password_confirmation' - ) ?? $this->route('user')->password + 'published' => $this->boolean('published'), + 'password' => $this->input('password') ?? + $this->route('user')->password, + 'password_confirmation' => $this->input('password_confirmation') ?? + $this->route('user')->password ]); } @@ -44,7 +42,7 @@ class UpdateUserRequest extends StoreUserRequest public function rules(): array { return array_merge(parent::rules(), [ - 'email' => [ + 'email' => [ 'required', 'email:rfc,strict,dns,spoof,filter', Rule::unique('users', 'email')->ignore($this->route('user')->getRouteKey()) diff --git a/app/Lib/Helpers/CollectionHelper.php b/app/Lib/Helpers/CollectionHelper.php index a665a2f..b9e9ecd 100644 --- a/app/Lib/Helpers/CollectionHelper.php +++ b/app/Lib/Helpers/CollectionHelper.php @@ -1,6 +1,6 @@ path($path); + } + /** * Destroy the file associate with the attribute. * diff --git a/app/Lib/Helpers/ToolboxHelper.php b/app/Lib/Helpers/ToolboxHelper.php index 7629e8f..49ea073 100644 --- a/app/Lib/Helpers/ToolboxHelper.php +++ b/app/Lib/Helpers/ToolboxHelper.php @@ -21,6 +21,36 @@ use Symfony\Component\Finder\SplFileInfo; class ToolboxHelper { + /** + * Run a terminal command and gives the output + * + * @param array|string $command The command to execute on terminal. + * @param boolean $throw Wether to throw en esception on failure or not. + * @return string|false Return false on failure only if $throw is false. + * @phpcs:disable Squiz.Commenting.FunctionComment.EmptyThrows + * @phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber + * @throws \Illuminate\Process\Exceptions\ProcessTimedOutException + * @throws \Symfony\Component\Process\Exception\LogicException + * @throws \Symfony\Component\Process\Exception\InvalidArgumentException + * @throws \Symfony\Component\Process\Exception\RuntimeException + * @throws \LogicException + * @throws \RuntimeException If the command fails. + */ + public static function runConsoleCommand(array|string $command, bool $throw = true): string | false + { + // phpcs:enable + $process = \Illuminate\Support\Facades\Process::command($command)->run(); + if ($process->failed()) { + $code = $process->exitCode(); + $ouput = $process->errorOutput(); + if ($throw) { + throw new \RuntimeException("Failed to run command exit code {$code} with output \n{$ouput}"); + } + return false; + } + return $process->output(); + } + /** * @param array $array1 * @param array $array2 @@ -288,7 +318,10 @@ class ToolboxHelper */ public static function getOriginal(Model $model, string $attribute): mixed { - if (\in_array('Spatie\Translatable\HasTranslations', \class_uses_recursive($model))) { + if ( + \in_array('Spatie\Translatable\HasTranslations', \class_uses_recursive($model)) and + $model->isTranslatableAttribute($attribute) + ) { return $model->getTranslation( $attribute, $model->getLocale(), diff --git a/app/Models/ActivityLog.php b/app/Models/ActivityLog.php index 1ab7000..0eca06b 100644 --- a/app/Models/ActivityLog.php +++ b/app/Models/ActivityLog.php @@ -122,7 +122,7 @@ class ActivityLog extends Model * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ - public function user() + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class); } diff --git a/app/Models/User.php b/app/Models/User.php index 91ae6f9..d4d8763 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -4,19 +4,20 @@ namespace App\Models; use App\Enums\Users\RoleEnum; use App\Traits\Models\ActivityLog; +use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\Hash; /** - * @property string $first_name Prénom. - * @property string $last_name Nom. + * @property string $first_name Firstname. + * @property string $last_name Lastname. * @property string $email Email. - * @property string $password Mot de passe. - * @property \App\Enums\Users\RoleEnum $role Rôle. - * @property \Illuminate\Support\Carbon $published État de publication. - * @property \Illuminate\Support\Carbon $published_at Date de mise à jour de l'état de publication. + * @property string $password Password. + * @property \App\Enums\Users\RoleEnum $role Role. + * @property \Illuminate\Support\Carbon $published Published status. + * @property \Illuminate\Support\Carbon $published_at Publication status update date. * @property-read \Illuminate\Support\Carbon $created_at Created date. * @property-read \Illuminate\Support\Carbon $updated_at Updated date. * @@ -62,6 +63,7 @@ class User extends Authenticatable 'role' => RoleEnum::class, 'email_verified_at' => 'datetime', 'published' => 'boolean', + 'published_at' => 'datetime', ]; /** @@ -85,7 +87,7 @@ class User extends Authenticatable \validator( ['published' => $model->published], ['published' => 'required|boolean|accepted'], - ['published.accepted' => trans('Vous ne pouvez pas déactiver votre propre compte')], + ['published.accepted' => trans('crud.messages.user_unpublished')], )->validate(); } // * Prevent user elevation privileges diff --git a/app/Providers/TranslationServiceProvider.php b/app/Providers/TranslationServiceProvider.php index b3e3f4b..9e57b48 100644 --- a/app/Providers/TranslationServiceProvider.php +++ b/app/Providers/TranslationServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use App\Lib\Helpers\ToolboxHelper; use Illuminate\Support\Collection; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Cache; @@ -20,9 +21,19 @@ class TranslationServiceProvider extends ServiceProvider foreach ($this->collectLocalesStrings() as $locale) { // * Suported locales Cache::rememberForever(sprintf('translations.%s', $locale), function () use ($locale) { - $translations = [ - 'php' => $this->phpTranslations($locale), - 'json' => $this->jsonTranslations($locale), + $phpTransFallback = $this->phpTranslations(config('app.fallback_locale')); + $phpTransLocale = $this->phpTranslations($locale); + $jsonTransFallback = $this->jsonTranslations(config('app.fallback_locale')); + $jsonTransLocale = $this->jsonTranslations($locale); + $translations = [ + 'php' => ToolboxHelper::arrayMergeRecursiveDistinct( + $phpTransLocale, + $phpTransFallback, + ), + 'json' => ToolboxHelper::arrayMergeRecursiveDistinct( + $jsonTransLocale, + $jsonTransFallback, + ), ]; return $translations; }); @@ -40,7 +51,7 @@ class TranslationServiceProvider extends ServiceProvider if ($file->getRelativePath() and \strpos($file->getRelativePath(), 'vendor') !== 0) { return [$file->getRelativePath() => '']; } - })->keys(); + })->keys()->merge(config('app.locales', [])); } /** @@ -53,6 +64,10 @@ class TranslationServiceProvider extends ServiceProvider { $path = resource_path("lang/$locale"); + if (!File::exists($path) or !File::isReadable($path)) { + return []; + } + return collect(File::allFiles($path))->flatMap(function ($file) use ($locale) { $translation = $file->getBasename('.php'); return [$translation => trans($translation, [], $locale)]; @@ -69,10 +84,10 @@ class TranslationServiceProvider extends ServiceProvider { $path = resource_path("lang/$locale.json"); - if (is_string($path) && is_readable($path)) { - return json_decode(file_get_contents($path), true) ?? []; + if (!File::exists($path) or !File::isReadable($path)) { + return []; } - return []; + return json_decode(File::get($path), true) ?? []; } } diff --git a/app/Traits/Requests/HasPicture.php b/app/Traits/Requests/HasPicture.php index a79cce7..7f83cfa 100644 --- a/app/Traits/Requests/HasPicture.php +++ b/app/Traits/Requests/HasPicture.php @@ -48,6 +48,7 @@ trait HasPicture * @param boolean $nullable * @param integer|null $size * @param string|null $requiredWith + * @param string|null $requiredWithout * @return array */ public function pictureRules( @@ -59,6 +60,7 @@ trait HasPicture bool $nullable = false, ?int $size = null, ?string $requiredWith = null, + ?string $requiredWithout = null, ): array { $dimensions = (object)[ 'minWidth' => $minWidth ?? $this->minWidth, @@ -70,9 +72,10 @@ trait HasPicture $name => [ !$nullable ? 'required' : 'nullable', (strlen($requiredWith)) ? 'required_with:' . $requiredWith : '', + (strlen($requiredWithout)) ? 'required_without:' . $requiredWithout : '', ($size) ? 'max:' . $size : '', function (string $attribute, $value, callable $fail) use ($dimensions) { - return ToolboxHelper::validatePicture($attribute, $value, $fail, $dimensions); + ToolboxHelper::validatePicture($attribute, $value, $fail, $dimensions); } ] ]; @@ -86,6 +89,9 @@ trait HasPicture * @param integer|null $minHeight * @param integer|null $maxWidth * @param integer|null $maxHeight + * @param integer $limitMin + * @param integer $limitMax + * @param boolean $nullable * @return array */ public function picturesRules( @@ -93,21 +99,24 @@ trait HasPicture ?int $minWidth = null, ?int $minHeight = null, ?int $maxWidth = null, - ?int $maxHeight = null + ?int $maxHeight = null, + int $limitMin = 1, + int $limitMax = 5, + bool $nullable = false ): array { $sizes = (object)[ 'minWidth' => $minWidth ?? $this->minWidth, 'minHeight' => $minHeight ?? $this->minHeight, 'maxWidth' => $maxWidth ?? $this->maxWidth, - 'maxHeight' => $maxHeight ?? $this->maxHeight + 'maxHeight' => $maxHeight ?? $this->maxHeight, ]; return [ - $name => 'sometimes|array', + $name => [!$nullable ? 'required' : 'nullable', 'array', "between:{$limitMin},{$limitMax}"], "{$name}Validate" => "required_with:{$name}|array", "{$name}Validate.*" => [ 'required', function (string $attribute, $value, callable $fail) use ($sizes) { - return $this->validatePicture($attribute, $value, $fail, $sizes); + ToolboxHelper::validatePicture($attribute, $value, $fail, $sizes); } ] ]; diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 8a8bc99..7ef6744 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -13,12 +13,12 @@ class UserFactory extends Factory * * @return array */ - public function definition() + public function definition(): array { $published = $this->faker->boolean(75); return [ - 'first_name' => fake()->firstname(), - 'last_name' => fake()->lastname(), + 'first_name' => fake()->firstname(), + 'last_name' => fake()->lastname(), 'email' => fake()->unique()->safeEmail(), 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index 612e0a9..84161e4 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -23,7 +23,7 @@ return new class extends Migration $table->rememberToken(); $table->unsignedTinyInteger('role')->comment('Role of the user who defines the rights/access.'); $table->boolean('published')->comment('The user is acivated or not.'); - $table->timestamp('published_at')->nullable()->comment('The date on which the user was acivated.'); + $table->timestamp('published_at')->nullable()->comment('The date on which the user was activated.'); $table->timestamps(); }); } diff --git a/database/migrations/2023_10_19_094711_create_static_pages.php b/database/migrations/2023_10_19_094711_create_static_pages.php index a28d0c0..78fda28 100644 --- a/database/migrations/2023_10_19_094711_create_static_pages.php +++ b/database/migrations/2023_10_19_094711_create_static_pages.php @@ -2,7 +2,6 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; -use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Schema; return new class extends Migration @@ -16,22 +15,14 @@ return new class extends Migration { Schema::create('static_pages', function (Blueprint $table) { $table->id(); - $table->unsignedTinyInteger('type')->unique()->comment('Page type (StaticPageEnum)'); - $table->string('seo_title')->comment('Seo title about 70 chars as recommended'); $table->string('seo_description')->comment('Seo description about 160 chars as recommended'); - $table->string('title')->comment('Title for the page'); $table->string('slug')->unique()->comment('Unique title slug'); - $table->text('content')->comment('WYSIWYG text content using ckeditor'); - $table->timestamps(); }); - Artisan::call('db:seed', [ - 'class' => 'StaticPageSeeder' - ]); } /** diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index bf08078..805b951 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -15,6 +15,7 @@ class DatabaseSeeder extends Seeder { $this->call([ UserSeeder::class, + StaticPageSeeder::class ]); } } diff --git a/database/seeders/StaticPageSeeder.php b/database/seeders/StaticPageSeeder.php index 57d2f39..e561bf6 100644 --- a/database/seeders/StaticPageSeeder.php +++ b/database/seeders/StaticPageSeeder.php @@ -20,11 +20,11 @@ class StaticPageSeeder extends Seeder 'type' => StaticPageType::contact, ], [ - 'seo_title' => 'Seo title pour la page contactez nous', - 'seo_description' => 'Seo description pour la page contactez nous', - 'title' => 'Contactez-nous', - 'type' => StaticPageType::contact, - 'content' => \clean(\fake()->randomHtml(6, 7)), + 'seo_title' => 'Seo title pour la page contact', + 'seo_description' => 'Seo description pour la page contact', + 'title' => 'Contact', + 'type' => StaticPageType::contact, + 'content' => \clean(\fake()->randomHtml(6, 7)), ] ); StaticPage::query()->updateOrCreate( @@ -32,11 +32,11 @@ class StaticPageSeeder extends Seeder 'type' => StaticPageType::legals, ], [ - 'seo_title' => 'Seo title pour la page mentions légales', + 'seo_title' => 'Seo title pour la page mentions légales', 'seo_description' => 'Seo description pour la page mentions légales', - 'title' => 'Mentions légales', - 'type' => StaticPageType::legals, - 'content' => \clean(\fake()->randomHtml(6, 7)), + 'title' => 'Mentions légales', + 'type' => StaticPageType::legals, + 'content' => \clean(\fake()->randomHtml(6, 7)), ] ); StaticPage::query()->updateOrCreate( @@ -44,11 +44,11 @@ class StaticPageSeeder extends Seeder 'type' => StaticPageType::confidentiality, ], [ - 'seo_title' => 'Seo title pour la page charte de confidentialitée', + 'seo_title' => 'Seo title pour la page charte de confidentialitée', 'seo_description' => 'Seo description pour la page charte de confidentialitée', - 'title' => 'Charte de confidentialitée', - 'type' => StaticPageType::confidentiality, - 'content' => \clean(\fake()->randomHtml(6, 7)), + 'title' => 'Charte de confidentialitée', + 'type' => StaticPageType::confidentiality, + 'content' => \clean(\fake()->randomHtml(6, 7)), ] ); } diff --git a/package-lock.json b/package-lock.json index 42eddf3..f51d495 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,11 @@ "devDependencies": { "@babel/core": "^7.22.11", "@babel/types": "^7.21.2", - "@fortawesome/fontawesome-svg-core": "latest", - "@fortawesome/free-brands-svg-icons": "latest", - "@fortawesome/free-regular-svg-icons": "latest", - "@fortawesome/free-solid-svg-icons": "latest", - "@fortawesome/vue-fontawesome": "^3.0.3", + "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-regular-svg-icons": "^6.5.1", + "@fortawesome/free-solid-svg-icons": "^6.5.1", + "@fortawesome/vue-fontawesome": "^3.0.5", + "@ldc-web/cookie-notice": "^3.1.2", "@sipec/vue3-tags-input": "^3.0.4", "@types/bootstrap": "^5.2.7", "@types/node": "^20.8.2", @@ -23,7 +23,7 @@ "@vitejs/plugin-vue": "latest", "@vue/compiler-sfc": "latest", "@vue/eslint-config-typescript": "latest", - "@vue/tsconfig": "latest", + "@vue/tsconfig": "^0.4.0", "axios": "^1.5.1", "bootstrap": "^5.3.2", "chart.js": "^4.4.0", @@ -31,18 +31,19 @@ "eslint": "latest", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-vue": "latest", - "laravel-vite-plugin": "latest", + "laravel-vite-plugin": "^0.8.1", "postcss-discard-comments": "^6.0.0", "prettier": "latest", "print-js": "^1.6.0", "resolve-url-loader": "^5.0.0", + "rollup-plugin-copy": "^3.5.0", "sass": "latest", "slugify": "^1.6.6", - "stylelint": "latest", + "stylelint": "^15.11.0", "stylelint-config-idiomatic-order": "github:ream88/stylelint-config-idiomatic-order", - "stylelint-config-sass-guidelines": "latest", - "stylelint-config-standard-scss": "latest", - "stylelint-scss": "latest", + "stylelint-config-sass-guidelines": "^10.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "^5.3.2", "sweetalert2": "^11.7.31", "terser": "latest", "toastify-js": "^1.12.0", @@ -55,9 +56,9 @@ "vite-plugin-eslint": "latest", "vite-plugin-stylelint": "latest", "vue": "latest", - "vue-eslint-parser": "^9.1.0", - "vue-loader": "^16.8.3", - "vue-tsc": "1.6.0" + "vue-eslint-parser": "^9.3.2", + "vue-loader": "^17.3.1", + "vue-tsc": "1.8.11" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -105,21 +106,21 @@ } }, "node_modules/@babel/core": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", - "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.5", - "@babel/parser": "^7.23.5", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -135,12 +136,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.5", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -150,14 +151,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -282,14 +283,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", - "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5" + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" }, "engines": { "node": ">=6.9.0" @@ -310,9 +311,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -336,20 +337,20 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -357,9 +358,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -371,9 +372,9 @@ } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz", - "integrity": "sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.4.0.tgz", + "integrity": "sha512-/PPLr2g5PAUCKAPEbfyk6/baZA+WJHQtUhPkoCQMpyRE8I0lXrG1QFRN8e5s3ZYxM8d/g5BZc6lH3s8Op7/VEg==", "dev": true, "funding": [ { @@ -389,13 +390,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.1" + "@csstools/css-tokenizer": "^2.2.2" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz", - "integrity": "sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.2.tgz", + "integrity": "sha512-wCDUe/MAw7npAHFLyW3QjSyLA66S5QFaV1jIXlNQvdJ8RzXDSgALa49eWcUO6P55ARQaz0TsDdAgdRgkXFYY8g==", "dev": true, "funding": [ { @@ -412,9 +413,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz", - "integrity": "sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.6.tgz", + "integrity": "sha512-R6AKl9vaU0It7D7TR2lQn0pre5aQfdeqHRePlaRCY8rHL3l9eVlNRpsEVDKFi/zAjzv68CxH2M5kqbhPFPKjvw==", "dev": true, "funding": [ { @@ -430,14 +431,14 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.3.2", - "@csstools/css-tokenizer": "^2.2.1" + "@csstools/css-parser-algorithms": "^2.4.0", + "@csstools/css-tokenizer": "^2.2.2" } }, "node_modules/@csstools/selector-specificity": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", - "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz", + "integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==", "dev": true, "funding": [ { @@ -856,9 +857,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -883,9 +884,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -914,19 +915,6 @@ "node": ">=6" } }, - "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.1.tgz", - "integrity": "sha512-093l7DAkx0aEtBq66Sf19MgoZewv1zeY9/4C7vSKPO4qMwEsW/2VYTUTpBtLwfb9T2R73tXaRDPmE4UqLCYHfg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@fortawesome/free-regular-svg-icons": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.1.tgz", @@ -1060,6 +1048,12 @@ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", "dev": true }, + "node_modules/@ldc-web/cookie-notice": { + "version": "3.1.3", + "resolved": "https://lab.s-web.fr/api/v4/projects/50/packages/npm/@ldc-web/cookie-notice/-/@ldc-web/cookie-notice-3.1.3.tgz", + "integrity": "sha1-+VPwI1VOhD+nWZeutLhT+on02CU=", + "dev": true + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1140,9 +1134,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.44.8", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", - "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-FlsN0p4FhuYRjIxpbdXovvHQhtlG05O1GG/RNWvdAxTboR438IOTwmrY/vLA+Xfgg06BTkP045M3vpFwTMv1dg==", "dev": true, "dependencies": { "@types/estree": "*", @@ -1166,6 +1160,25 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1179,6 +1192,12 @@ "dev": true, "peer": true }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -1186,9 +1205,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", - "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1518,9 +1537,9 @@ } }, "node_modules/@vitejs/plugin-vue": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.1.tgz", - "integrity": "sha512-DaUzYFr+2UGDG7VSSdShKa9sIWYBa1LL8KC0MNOf2H5LjcTPjob0x8LbkqXWmAtbANJCkpiQTj66UVcQkN2s3g==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.2.tgz", + "integrity": "sha512-UGR3DlzLi/SaVBPX0cnSyE37vqxU3O6chn8l0HJNzQzDia6/Au2A4xKv+iIJW8w2daf80G7TYHhi1pAUjdZ0bQ==", "dev": true, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -1531,124 +1550,67 @@ } }, "node_modules/@volar/language-core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.4.1.tgz", - "integrity": "sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==", + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.10.tgz", + "integrity": "sha512-nsV1o3AZ5n5jaEAObrS3MWLBWaGwUj/vAsc15FVNIv+DbpizQRISg9wzygsHBr56ELRH8r4K75vkYNMtsSNNWw==", "dev": true, "dependencies": { - "@volar/source-map": "1.4.1" + "@volar/source-map": "1.10.10" } }, "node_modules/@volar/source-map": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.4.1.tgz", - "integrity": "sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==", + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.10.tgz", + "integrity": "sha512-GVKjLnifV4voJ9F0vhP56p4+F3WGf+gXlRtjFZsv6v3WxBTWU3ZVeaRaEHJmWrcv5LXmoYYpk/SC25BKemPRkg==", "dev": true, "dependencies": { - "muggle-string": "^0.2.2" + "muggle-string": "^0.3.1" } }, "node_modules/@volar/typescript": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.4.1.tgz", - "integrity": "sha512-phTy6p9yG6bgMIKQWEeDOi/aeT0njZsb1a/G1mrEuDsLmAn24Le4gDwSsGNhea6Uhu+3gdpUZn2PmZXa+WG2iQ==", + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.10.tgz", + "integrity": "sha512-4a2r5bdUub2m+mYVnLu2wt59fuoYWe7nf0uXtGHU8QQ5LDNfzAR0wK7NgDiQ9rcl2WT3fxT2AA9AylAwFtj50A==", "dev": true, "dependencies": { - "@volar/language-core": "1.4.1" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "node_modules/@volar/vue-language-core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.6.0.tgz", - "integrity": "sha512-oyX+A4vclBlDB7UQtfAPraD6tt3nE+y9YNXdH+xjDi//Cokdx65PZnwLaiG+hURI6WgDn1ZQffTE1OeJtr786A==", - "dev": true, - "dependencies": { - "@volar/language-core": "1.4.1", - "@volar/source-map": "1.4.1", - "@vue/compiler-dom": "^3.2.0", - "@vue/compiler-sfc": "^3.2.0", - "@vue/reactivity": "^3.2.0", - "@vue/shared": "^3.2.0", - "minimatch": "^9.0.0", - "muggle-string": "^0.2.2", - "vue-template-compiler": "^2.7.14" - } - }, - "node_modules/@volar/vue-language-core/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@volar/vue-language-core/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@volar/vue-typescript": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.6.0.tgz", - "integrity": "sha512-Ob5X/XICtwCFwHDo9zUhQuCIH4QmiDWX7DgQkuPBZkO18mirp27ymRJk2Q5EtHKedGQnTce/NRsoqjn8DnyLKw==", - "deprecated": "WARNING: This project has been renamed to @vue/typescript. Install using @vue/typescript instead.", - "dev": true, - "dependencies": { - "@volar/typescript": "1.4.1", - "@volar/vue-language-core": "1.6.0" - }, - "peerDependencies": { - "typescript": "*" + "@volar/language-core": "1.10.10", + "path-browserify": "^1.0.1" } }, "node_modules/@vue/compiler-core": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.10.tgz", - "integrity": "sha512-doe0hODR1+i1menPkRzJ5MNR6G+9uiZHIknK3Zn5OcIztu6GGw7u0XUzf3AgB8h/dfsZC9eouzoLo3c3+N/cVA==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.13.tgz", + "integrity": "sha512-bwi9HShGu7uaZLOErZgsH2+ojsEdsjerbf2cMXPwmvcgZfVPZ2BVZzCVnwZBxTAYd6Mzbmf6izcUNDkWnBBQ6A==", "dev": true, "dependencies": { "@babel/parser": "^7.23.5", - "@vue/shared": "3.3.10", + "@vue/shared": "3.3.13", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.10.tgz", - "integrity": "sha512-NCrqF5fm10GXZIK0GrEAauBqdy+F2LZRt3yNHzrYjpYBuRssQbuPLtSnSNjyR9luHKkWSH8we5LMB3g+4z2HvA==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.13.tgz", + "integrity": "sha512-EYRDpbLadGtNL0Gph+HoKiYqXLqZ0xSSpR5Dvnu/Ep7ggaCbjRDIus1MMxTS2Qm0koXED4xSlvTZaTnI8cYAsw==", "dev": true, "dependencies": { - "@vue/compiler-core": "3.3.10", - "@vue/shared": "3.3.10" + "@vue/compiler-core": "3.3.13", + "@vue/shared": "3.3.13" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.10.tgz", - "integrity": "sha512-xpcTe7Rw7QefOTRFFTlcfzozccvjM40dT45JtrE3onGm/jBLZ0JhpKu3jkV7rbDFLeeagR/5RlJ2Y9SvyS0lAg==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.13.tgz", + "integrity": "sha512-DQVmHEy/EKIgggvnGRLx21hSqnr1smUS9Aq8tfxiiot8UR0/pXKHN9k78/qQ7etyQTFj5em5nruODON7dBeumw==", "dev": true, "dependencies": { "@babel/parser": "^7.23.5", - "@vue/compiler-core": "3.3.10", - "@vue/compiler-dom": "3.3.10", - "@vue/compiler-ssr": "3.3.10", - "@vue/reactivity-transform": "3.3.10", - "@vue/shared": "3.3.10", + "@vue/compiler-core": "3.3.13", + "@vue/compiler-dom": "3.3.13", + "@vue/compiler-ssr": "3.3.13", + "@vue/reactivity-transform": "3.3.13", + "@vue/shared": "3.3.13", "estree-walker": "^2.0.2", "magic-string": "^0.30.5", "postcss": "^8.4.32", @@ -1656,13 +1618,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.10.tgz", - "integrity": "sha512-12iM4jA4GEbskwXMmPcskK5wImc2ohKm408+o9iox3tfN9qua8xL0THIZtoe9OJHnXP4eOWZpgCAAThEveNlqQ==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.13.tgz", + "integrity": "sha512-d/P3bCeUGmkJNS1QUZSAvoCIW4fkOKK3l2deE7zrp0ypJEy+En2AcypIkqvcFQOcw3F0zt2VfMvNsA9JmExTaw==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.3.10", - "@vue/shared": "3.3.10" + "@vue/compiler-dom": "3.3.13", + "@vue/shared": "3.3.13" } }, "node_modules/@vue/eslint-config-typescript": { @@ -1690,16 +1652,16 @@ } }, "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz", - "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz", + "integrity": "sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/type-utils": "6.13.2", - "@typescript-eslint/utils": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/type-utils": "6.15.0", + "@typescript-eslint/utils": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1725,15 +1687,15 @@ } }, "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/parser": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz", - "integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.15.0.tgz", + "integrity": "sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/typescript-estree": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/typescript-estree": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", "debug": "^4.3.4" }, "engines": { @@ -1753,13 +1715,13 @@ } }, "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/scope-manager": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", - "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz", + "integrity": "sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2" + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1770,13 +1732,13 @@ } }, "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/type-utils": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz", - "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.15.0.tgz", + "integrity": "sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.13.2", - "@typescript-eslint/utils": "6.13.2", + "@typescript-eslint/typescript-estree": "6.15.0", + "@typescript-eslint/utils": "6.15.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1797,9 +1759,9 @@ } }, "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/types": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", - "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.15.0.tgz", + "integrity": "sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1810,13 +1772,13 @@ } }, "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", - "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz", + "integrity": "sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1837,17 +1799,17 @@ } }, "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/utils": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz", - "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.15.0.tgz", + "integrity": "sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/typescript-estree": "6.15.0", "semver": "^7.5.4" }, "engines": { @@ -1862,12 +1824,12 @@ } }, "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", - "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz", + "integrity": "sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/types": "6.15.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1911,66 +1873,114 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/@vue/reactivity": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.10.tgz", - "integrity": "sha512-H5Z7rOY/JLO+e5a6/FEXaQ1TMuOvY4LDVgT+/+HKubEAgs9qeeZ+NhADSeEtrNQeiKLDuzeKc8v0CUFpB6Pqgw==", + "node_modules/@vue/language-core": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.11.tgz", + "integrity": "sha512-+MZOBGqGwfld6hpo0DB47x8eNM0dNqk15ZdfOhj19CpvuYuOWCeVdOEGZunKDyo3QLkTn3kLOSysJzg7FDOQBA==", "dev": true, "dependencies": { - "@vue/shared": "3.3.10" + "@volar/language-core": "~1.10.0", + "@volar/source-map": "~1.10.0", + "@vue/compiler-dom": "^3.3.0", + "@vue/reactivity": "^3.3.0", + "@vue/shared": "^3.3.0", + "minimatch": "^9.0.0", + "muggle-string": "^0.3.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.13.tgz", + "integrity": "sha512-fjzCxceMahHhi4AxUBzQqqVhuA21RJ0COaWTbIBl1PruGW1CeY97louZzLi4smpYx+CHfFPPU/CS8NybbGvPKQ==", + "dev": true, + "dependencies": { + "@vue/shared": "3.3.13" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.10.tgz", - "integrity": "sha512-0xBdk+CKHWT+Gev8oZ63Tc0qFfj935YZx+UAynlutnrDZ4diFCVFMWixn65HzjE3S1iJppWOo6Tt1OzASH7VEg==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.13.tgz", + "integrity": "sha512-oWnydGH0bBauhXvh5KXUy61xr9gKaMbtsMHk40IK9M4gMuKPJ342tKFarY0eQ6jef8906m35q37wwA8DMZOm5Q==", "dev": true, "dependencies": { "@babel/parser": "^7.23.5", - "@vue/compiler-core": "3.3.10", - "@vue/shared": "3.3.10", + "@vue/compiler-core": "3.3.13", + "@vue/shared": "3.3.13", "estree-walker": "^2.0.2", "magic-string": "^0.30.5" } }, "node_modules/@vue/runtime-core": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.10.tgz", - "integrity": "sha512-DZ0v31oTN4YHX9JEU5VW1LoIVgFovWgIVb30bWn9DG9a7oA415idcwsRNNajqTx8HQJyOaWfRKoyuP2P2TYIag==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.13.tgz", + "integrity": "sha512-1TzA5TvGuh2zUwMJgdfvrBABWZ7y8kBwBhm7BXk8rvdx2SsgcGfz2ruv2GzuGZNvL1aKnK8CQMV/jFOrxNQUMA==", "dev": true, "dependencies": { - "@vue/reactivity": "3.3.10", - "@vue/shared": "3.3.10" + "@vue/reactivity": "3.3.13", + "@vue/shared": "3.3.13" } }, "node_modules/@vue/runtime-dom": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.10.tgz", - "integrity": "sha512-c/jKb3ny05KJcYk0j1m7Wbhrxq7mZYr06GhKykDMNRRR9S+/dGT8KpHuNQjv3/8U4JshfkAk6TpecPD3B21Ijw==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.13.tgz", + "integrity": "sha512-JJkpE8R/hJKXqVTgUoODwS5wqKtOsmJPEqmp90PDVGygtJ4C0PtOkcEYXwhiVEmef6xeXcIlrT3Yo5aQ4qkHhQ==", "dev": true, "dependencies": { - "@vue/runtime-core": "3.3.10", - "@vue/shared": "3.3.10", - "csstype": "^3.1.2" + "@vue/runtime-core": "3.3.13", + "@vue/shared": "3.3.13", + "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.10.tgz", - "integrity": "sha512-0i6ww3sBV3SKlF3YTjSVqKQ74xialMbjVYGy7cOTi7Imd8ediE7t72SK3qnvhrTAhOvlQhq6Bk6nFPdXxe0sAg==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.13.tgz", + "integrity": "sha512-vSnN+nuf6iSqTL3Qgx/9A+BT+0Zf/VJOgF5uMZrKjYPs38GMYyAU1coDyBNHauehXDaP+zl73VhwWv0vBRBHcg==", "dev": true, "dependencies": { - "@vue/compiler-ssr": "3.3.10", - "@vue/shared": "3.3.10" + "@vue/compiler-ssr": "3.3.13", + "@vue/shared": "3.3.13" }, "peerDependencies": { - "vue": "3.3.10" + "vue": "3.3.13" } }, "node_modules/@vue/shared": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.10.tgz", - "integrity": "sha512-2y3Y2J1a3RhFa0WisHvACJR2ncvWiVHcP8t0Inxo+NKz+8RKO4ZV8eZgCxRgQoA6ITfV12L4E6POOL9HOU5nqw==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.13.tgz", + "integrity": "sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA==", "dev": true }, "node_modules/@vue/tsconfig": { @@ -1979,6 +1989,16 @@ "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", "dev": true }, + "node_modules/@vue/typescript": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.11.tgz", + "integrity": "sha512-skUmMDiPUUtu1flPmf2YybF+PX8IzBtMioQOaNn6Ck/RhdrPJGj1AX/7s3Buf9G6ln+/KHR1XQuti/FFxw5XVA==", + "dev": true, + "dependencies": { + "@volar/typescript": "~1.10.0", + "@vue/language-core": "1.8.11" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", @@ -2614,9 +2634,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001566", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", - "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", + "version": "1.0.30001570", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", + "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", "dev": true, "funding": [ { @@ -2729,6 +2749,12 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2840,9 +2866,9 @@ } }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true }, "node_modules/de-indent": { @@ -2975,9 +3001,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.603", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.603.tgz", - "integrity": "sha512-Dvo5OGjnl7AZTU632dFJtWj0uJK835eeOVQIuRcmBmsFsTNn3cL05FqOyHAfGQDIoHfLhyJ1Tya3PJ0ceMz54g==", + "version": "1.4.615", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz", + "integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==", "dev": true }, "node_modules/emoji-regex": { @@ -3177,15 +3203,15 @@ } }, "node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -3294,9 +3320,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "peer": true, "dependencies": { @@ -3316,7 +3342,7 @@ "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -3514,9 +3540,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3710,9 +3736,9 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3823,17 +3849,17 @@ } }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=14.14" + "node": ">=6 <7 || >=8" } }, "node_modules/fs.realpath": { @@ -3972,8 +3998,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/global-modules": { "version": "2.0.0", @@ -4529,9 +4554,9 @@ } }, "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4749,13 +4774,10 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -5081,9 +5103,9 @@ "dev": true }, "node_modules/muggle-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.2.2.tgz", - "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", "dev": true }, "node_modules/nanoid": { @@ -5395,6 +5417,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5485,15 +5513,15 @@ } }, "node_modules/postcss-discard-comments": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz", - "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.1.tgz", + "integrity": "sha512-f1KYNPtqYLUeZGCHQPKzzFtsHaRuECe6jLakf/RjSRqvF5XHLZnM2+fXLhb8Qh/HBFHs3M4cSLb1k3B899RYIg==", "dev": true, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-media-query-parser": { @@ -5588,9 +5616,9 @@ } }, "node_modules/prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -5965,6 +5993,41 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup-plugin-copy": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", + "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.1", + "colorette": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "10.0.1", + "is-plain-object": "^3.0.0" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/rollup-plugin-copy/node_modules/globby": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -6593,22 +6656,22 @@ } }, "node_modules/stylelint-order": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.3.tgz", - "integrity": "sha512-1j1lOb4EU/6w49qZeT2SQVJXm0Ht+Qnq9GMfUa3pMwoyojIWfuA+JUDmoR97Bht1RLn4ei0xtLGy87M7d29B1w==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz", + "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==", "dev": true, "dependencies": { - "postcss": "^8.4.21", + "postcss": "^8.4.32", "postcss-sorting": "^8.0.2" }, "peerDependencies": { - "stylelint": "^14.0.0 || ^15.0.0" + "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1" } }, "node_modules/stylelint-scss": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.3.1.tgz", - "integrity": "sha512-5I9ZDIm77BZrjOccma5WyW2nJEKjXDd4Ca8Kk+oBapSO4pewSlno3n+OyimcyVJJujQZkBN2D+xuMkIamSc6hA==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.3.2.tgz", + "integrity": "sha512-4LzLaayFhFyneJwLo0IUa8knuIvj+zF0vBFueQs4e3tEaAMIQX8q5th8ziKkgOavr6y/y9yoBe+RXN/edwLzsQ==", "dev": true, "dependencies": { "known-css-properties": "^0.29.0", @@ -6693,6 +6756,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylelint/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stylelint/node_modules/meow": { "version": "10.1.5", "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", @@ -6953,9 +7025,9 @@ } }, "node_modules/terser": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.25.0.tgz", - "integrity": "sha512-we0I9SIsfvNUMP77zC9HG+MylwYYsGFSBG8qm+13oud2Yh+O104y614FRbyjpxys16jZwot72Fpi827YvGzuqg==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -7200,9 +7272,9 @@ "dev": true }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "peer": true, "dependencies": { @@ -7381,12 +7453,12 @@ "dev": true }, "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "engines": { - "node": ">= 10.0.0" + "node": ">= 4.0.0" } }, "node_modules/update-browserslist-db": { @@ -7500,13 +7572,13 @@ } }, "node_modules/vite-plugin-babel": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/vite-plugin-babel/-/vite-plugin-babel-1.1.3.tgz", - "integrity": "sha512-WE8ORQm8530kj0geiDL1r/+P2MaU0b+5wL5E8Jq07aounFwRIUeJXziGiMr2DFQs78vaefB5GRKh257M8Z6gFQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-babel/-/vite-plugin-babel-1.2.0.tgz", + "integrity": "sha512-ltAnq535Ubf9sDbVCkztAdkwx5aQbNrwPFs+iZTJ5FaAhTdxjqmLGpxsAaRfJWEKBJ/kFf9KwMoTdArm0IRUUw==", "dev": true, "peerDependencies": { "@babel/core": "^7.0.0", - "vite": "^2.7.0 || ^3.0.0 || ^4.0.0" + "vite": "^2.7.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" } }, "node_modules/vite-plugin-checker": { @@ -7632,6 +7704,20 @@ "node": ">= 12" } }, + "node_modules/vite-plugin-checker/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/vite-plugin-checker/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7641,6 +7727,18 @@ "node": ">=8" } }, + "node_modules/vite-plugin-checker/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/vite-plugin-checker/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7680,6 +7778,15 @@ "node": ">=8" } }, + "node_modules/vite-plugin-checker/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/vite-plugin-checker/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -7727,12 +7834,12 @@ } }, "node_modules/vite-plugin-stylelint": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/vite-plugin-stylelint/-/vite-plugin-stylelint-5.2.1.tgz", - "integrity": "sha512-W2QKrgUdFN1pR/6qJnzgeI5q72IRaEzI7Ejvf/3+cJ7tQNkutM99gJcI7gyV5HdYiKnVFu7jBFQq3FwB2tS0pw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/vite-plugin-stylelint/-/vite-plugin-stylelint-5.3.1.tgz", + "integrity": "sha512-M/hSdfOwnOVghbJDeuuYIU2xO/MMukYR8QcEyNKFPG8ro1L+DlTdViix2B2d/FvAw14WPX88ckA5A7NvUjJz8w==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^5.0.5", + "@rollup/pluginutils": "^5.1.0", "chokidar": "^3.5.3", "debug": "^4.3.4" }, @@ -7743,7 +7850,7 @@ "@types/stylelint": "^13.0.0", "postcss": "^7.0.0 || ^8.0.0", "rollup": "^2.0.0 || ^3.0.0 || ^4.0.0", - "stylelint": "^13.0.0 || ^14.0.0 || ^15.0.0", + "stylelint": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { @@ -7877,16 +7984,16 @@ "dev": true }, "node_modules/vue": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.10.tgz", - "integrity": "sha512-zg6SIXZdTBwiqCw/1p+m04VyHjLfwtjwz8N57sPaBhEex31ND0RYECVOC1YrRwMRmxFf5T1dabl6SGUbMKKuVw==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.13.tgz", + "integrity": "sha512-LDnUpQvDgsfc0u/YgtAgTMXJlJQqjkxW1PVcOnJA5cshPleULDjHi7U45pl2VJYazSSvLH8UKcid/kzH8I0a0Q==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.3.10", - "@vue/compiler-sfc": "3.3.10", - "@vue/runtime-dom": "3.3.10", - "@vue/server-renderer": "3.3.10", - "@vue/shared": "3.3.10" + "@vue/compiler-dom": "3.3.13", + "@vue/compiler-sfc": "3.3.13", + "@vue/runtime-dom": "3.3.13", + "@vue/server-renderer": "3.3.13", + "@vue/shared": "3.3.13" }, "peerDependencies": { "typescript": "*" @@ -7980,17 +8087,25 @@ "dev": true }, "node_modules/vue-loader": { - "version": "16.8.3", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", - "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.3.1.tgz", + "integrity": "sha512-nmVu7KU8geOyzsStyyaxID/uBGDMS8BkPXb6Lu2SNkMawriIbb+hYrNtgftHMKxOSkjjjTF5OSSwPo3KP59egg==", "dev": true, "dependencies": { "chalk": "^4.1.0", "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" + "watchpack": "^2.4.0" }, "peerDependencies": { "webpack": "^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + }, + "vue": { + "optional": true + } } }, "node_modules/vue-loader/node_modules/ansi-styles": { @@ -8074,13 +8189,13 @@ } }, "node_modules/vue-tsc": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.6.0.tgz", - "integrity": "sha512-JO8Hmc/ZL8pEXtYsUuMFHIvpu5zqtBLtKBp6CRq2O0JVgrRGqYmVIq9v2R7LMVhMo1LhJEvPBWcE24w30mUvXQ==", + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.11.tgz", + "integrity": "sha512-BzfiMdPqDHBlysx4g26NkfVHSQwGD/lTRausmxN9sFyjXz34OWfsbkh0YsVkX84Hu65In1fFlxHiG39Tr4Vojg==", "dev": true, "dependencies": { - "@volar/vue-language-core": "1.6.0", - "@volar/vue-typescript": "1.6.0", + "@vue/language-core": "1.8.11", + "@vue/typescript": "1.8.11", "semver": "^7.3.8" }, "bin": { @@ -8128,7 +8243,6 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, - "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" diff --git a/package.json b/package.json index f1b34a8..ee91b1f 100644 --- a/package.json +++ b/package.json @@ -16,11 +16,10 @@ "devDependencies": { "@babel/core": "^7.22.11", "@babel/types": "^7.21.2", - "@fortawesome/fontawesome-svg-core": "latest", - "@fortawesome/free-brands-svg-icons": "latest", - "@fortawesome/free-regular-svg-icons": "latest", - "@fortawesome/free-solid-svg-icons": "latest", - "@fortawesome/vue-fontawesome": "^3.0.3", + "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-regular-svg-icons": "^6.5.1", + "@fortawesome/free-solid-svg-icons": "^6.5.1", + "@fortawesome/vue-fontawesome": "^3.0.5", "@sipec/vue3-tags-input": "^3.0.4", "@types/bootstrap": "^5.2.7", "@types/node": "^20.8.2", @@ -31,7 +30,7 @@ "@vitejs/plugin-vue": "latest", "@vue/compiler-sfc": "latest", "@vue/eslint-config-typescript": "latest", - "@vue/tsconfig": "latest", + "@vue/tsconfig": "^0.4.0", "axios": "^1.5.1", "bootstrap": "^5.3.2", "chart.js": "^4.4.0", @@ -39,18 +38,19 @@ "eslint": "latest", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-vue": "latest", - "laravel-vite-plugin": "latest", + "laravel-vite-plugin": "^0.8.1", "postcss-discard-comments": "^6.0.0", "prettier": "latest", "print-js": "^1.6.0", "resolve-url-loader": "^5.0.0", + "rollup-plugin-copy": "^3.5.0", "sass": "latest", "slugify": "^1.6.6", - "stylelint": "latest", + "stylelint": "^15.11.0", "stylelint-config-idiomatic-order": "github:ream88/stylelint-config-idiomatic-order", - "stylelint-config-sass-guidelines": "latest", - "stylelint-config-standard-scss": "latest", - "stylelint-scss": "latest", + "stylelint-config-sass-guidelines": "^10.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "^5.3.2", "sweetalert2": "^11.7.31", "terser": "latest", "toastify-js": "^1.12.0", @@ -63,8 +63,8 @@ "vite-plugin-eslint": "latest", "vite-plugin-stylelint": "latest", "vue": "latest", - "vue-eslint-parser": "^9.1.0", - "vue-loader": "^16.8.3", - "vue-tsc": "1.6.0" + "vue-eslint-parser": "^9.3.2", + "vue-loader": "^17.3.1", + "vue-tsc": "1.8.11" } } diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index e69de29..0000000 diff --git a/resources/favicon/android-chrome-192x192.png b/resources/favicon/android-chrome-192x192.png new file mode 100644 index 0000000..e84712f Binary files /dev/null and b/resources/favicon/android-chrome-192x192.png differ diff --git a/resources/favicon/android-chrome-512x512.png b/resources/favicon/android-chrome-512x512.png new file mode 100644 index 0000000..12f369a Binary files /dev/null and b/resources/favicon/android-chrome-512x512.png differ diff --git a/resources/favicon/apple-touch-icon.png b/resources/favicon/apple-touch-icon.png new file mode 100644 index 0000000..c2f7301 Binary files /dev/null and b/resources/favicon/apple-touch-icon.png differ diff --git a/resources/favicon/browserconfig.xml b/resources/favicon/browserconfig.xml new file mode 100644 index 0000000..f9c2e67 --- /dev/null +++ b/resources/favicon/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #2b5797 + + + diff --git a/resources/favicon/favicon-16x16.png b/resources/favicon/favicon-16x16.png new file mode 100644 index 0000000..cb0de06 Binary files /dev/null and b/resources/favicon/favicon-16x16.png differ diff --git a/resources/favicon/favicon-32x32.png b/resources/favicon/favicon-32x32.png new file mode 100644 index 0000000..586b050 Binary files /dev/null and b/resources/favicon/favicon-32x32.png differ diff --git a/resources/favicon/favicon.ico b/resources/favicon/favicon.ico new file mode 100644 index 0000000..1650a77 Binary files /dev/null and b/resources/favicon/favicon.ico differ diff --git a/resources/favicon/mstile-150x150.png b/resources/favicon/mstile-150x150.png new file mode 100644 index 0000000..e897e87 Binary files /dev/null and b/resources/favicon/mstile-150x150.png differ diff --git a/resources/favicon/safari-pinned-tab.svg b/resources/favicon/safari-pinned-tab.svg new file mode 100644 index 0000000..f61f502 --- /dev/null +++ b/resources/favicon/safari-pinned-tab.svg @@ -0,0 +1,109 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + + + + + + + + + + + diff --git a/resources/favicon/site.webmanifest b/resources/favicon/site.webmanifest new file mode 100644 index 0000000..b20abb7 --- /dev/null +++ b/resources/favicon/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/resources/lang/.gitkeep b/resources/lang/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/resources/lang/en/crud.php b/resources/lang/en/crud.php index b04af04..04f9293 100644 --- a/resources/lang/en/crud.php +++ b/resources/lang/en/crud.php @@ -50,6 +50,7 @@ return [ 'publish_status_saved' => 'Change of publication status successful!', 'right' => 'You don\'t have the rights to access this part !', 'theme_updated' => 'The theme has been updated !', + 'user_unpublished' => 'You cannot unpublished your own account !', ], 'minicrud' => [ @@ -68,7 +69,7 @@ return [ 'other' => [ 'up' => 'Change the order of appearance upwards', 'down' => 'Change the order of appearance downwards', - 'no_model_found' => 'None :model found', + 'no_model_found' => 'No :model found|No :model found', 'publish' => 'Published', 'unpublish' => 'Unpublished', 'search_start' => 'Start search', @@ -79,5 +80,21 @@ return [ 'sort_delete' => 'Delete sorting', 'sort_arrow' => 'Here, the arrows are used to sort, not filter.', 'right' => 'You don\'t have the rights', + ], + + 'meta' => [ + 'title' => [ + 'create' => '{*} Create a new :model', + 'edit' => '{*} Edit an existing :model', + 'show' => '{*} See an existing :model', + ], + // phpcs:disable Generic.Files.LineLength.TooLong + 'description' => [ + 'index' => '{*} List of all the :model', + 'create' => '{*} Creation of a new :model', + 'edit' => '{*} Edition of an existing :model', + 'show' => '{*} See informations of an existing :model déjà existant', + ], + // phpcs:enable ] ]; diff --git a/resources/lang/en/enums.php b/resources/lang/en/enums.php index 0b67a5f..5d8e228 100644 --- a/resources/lang/en/enums.php +++ b/resources/lang/en/enums.php @@ -1,3 +1,13 @@ [ + "light" => "light", + "dark" => "dark", + ], + 'user-role' => [ + "conceptor" => "conceptor", + "admin" => "admin", + "visitor" => "visitor", + ] +]; diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index 0307003..0fea143 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -227,7 +227,7 @@ return [ 'activated' => 'activated', 'target' => 'target', 'static_page_type' => 'static page type', - 'seo_title' => 'SEO title', - 'seo_description' => 'SEO description', + 'seo_title' => 'SEO title', + 'seo_description' => 'SEO description', ], ]; diff --git a/resources/lang/fr/crud.php b/resources/lang/fr/crud.php index f3dc47b..8aa5dc7 100644 --- a/resources/lang/fr/crud.php +++ b/resources/lang/fr/crud.php @@ -50,6 +50,7 @@ return [ 'publish_status_saved' => 'Changement de l\'état de publication réussit !', 'right' => 'Vous n\'avez pas les droits pour accéder à cette partie !', 'theme_updated' => 'Le thème a été mis à jour !', + 'user_unpublished' => 'Vous ne pouvez pas désactiver votre propre compte !', ], 'minicrud' => [ @@ -75,7 +76,7 @@ return [ 'other' => [ 'up' => 'Modifier l\'ordre d\'apparition vers le haut', 'down' => 'Modifier l\'ordre d\'apparition vers le bas', - 'no_model_found' => 'Aucun :model trouvé', + 'no_model_found' => 'Aucun :model trouvé|Aucune :model trouvée', 'publish' => 'Publié', 'unpublish' => 'Dépublié', 'search_start' => 'Lancer la recherche', @@ -86,5 +87,21 @@ return [ 'sort_delete' => 'Supprimer le tri', 'sort_arrow' => 'Ici, les flèches sont utilisées pour trier et non pour filtrer', 'right' => 'Vous n\'avez pas les droits', + ], + + 'meta' => [ + 'title' => [ + 'create' => '{0} Création d\'un :model|{1} Création d\'une :model', + 'edit' => '{0} Edition d\'un :model|{1} Edition d\'une :model', + 'show' => '{0} Visualisation d\'un :model|{1} Visualisation d\'une :model', + ], + // phpcs:disable Generic.Files.LineLength.TooLong + 'description' => [ + 'index' => '{0} Liste de tous les :model|{1} Liste de toutes les :model', + 'create' => '{0} Création d\'un tout nouveau :model|{1} Création d\'une toute nouvelle :model|{2} Création d\'un tout nouvel :model', + 'edit' => '{0} Edition d\'un :model déjà existant|{1} Edition d\'une :model déjà existante', + 'show' => '{0} Visualisation d\'un :model déjà existant|{1} Visualisation d\'une :model déjà existante', + ], + // phpcs:enable ] ]; diff --git a/resources/lang/fr/enums.php b/resources/lang/fr/enums.php index 0b67a5f..c0ed382 100644 --- a/resources/lang/fr/enums.php +++ b/resources/lang/fr/enums.php @@ -1,3 +1,13 @@ [ + "light" => "clair", + "dark" => "sombre", + ], + 'user-role' => [ + "conceptor" => "concepteur", + "admin" => "administrateur", + "visitor" => "visiteur", + ] +]; diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php index f3b7d86..836251d 100644 --- a/resources/lang/fr/validation.php +++ b/resources/lang/fr/validation.php @@ -159,7 +159,7 @@ return [ 'date_of_birth' => 'date de naissance', 'day' => 'jour', 'deleted_at' => 'supprimé à', - 'description' => 'la description', + 'description' => 'description', 'district' => 'quartier', 'duration' => 'durée', 'email' => 'adresse e-mail', @@ -227,7 +227,7 @@ return [ 'activated' => 'activé', 'target' => 'cible', 'static_page_type' => 'type de page', - 'seo_title' => 'titre SEO', - 'seo_description' => 'description SEO', + 'seo_title' => 'titre SEO', + 'seo_description' => 'description SEO', ], ]; diff --git a/resources/sass/fo/vendor/_bootstrap.scss b/resources/sass/fo/vendor/_bootstrap.scss index 513133f..a0c75c6 100644 --- a/resources/sass/fo/vendor/_bootstrap.scss +++ b/resources/sass/fo/vendor/_bootstrap.scss @@ -12,6 +12,7 @@ @import "bootstrap/scss/maps"; @import "bootstrap/scss/mixins"; @import "bootstrap/scss/root"; +@import "bootstrap/scss/utilities"; // 5. Optionally include any other parts as needed @import "bootstrap/scss/alert"; @@ -33,7 +34,6 @@ @import "bootstrap/scss/tooltip"; @import "bootstrap/scss/transitions"; @import "bootstrap/scss/type"; -@import "bootstrap/scss/utilities"; @import "bootstrap/scss/close"; @import "bootstrap/scss/breadcrumb"; diff --git a/resources/sass/fo/vendor/_ckEditorContent.scss b/resources/sass/fo/vendor/_ckEditorContent.scss index 1b9bc53..26e3d02 100644 --- a/resources/sass/fo/vendor/_ckEditorContent.scss +++ b/resources/sass/fo/vendor/_ckEditorContent.scss @@ -13,6 +13,17 @@ @import "bootstrap/scss/mixins"; @import "bootstrap/scss/root"; @import "bootstrap/scss/reboot"; + // Undo BS table cell V-Align + table,tbody,tr,td { + vertical-align: middle; + } + + overflow-wrap: break-word; + hyphens: auto; + + @include media-breakpoint-up(md) { + hyphens: initial; + } } /* diff --git a/resources/ts/bo/components/ImageInputComponent.vue b/resources/ts/bo/components/ImageInputComponent.vue index 2a43504..2a22063 100644 --- a/resources/ts/bo/components/ImageInputComponent.vue +++ b/resources/ts/bo/components/ImageInputComponent.vue @@ -608,7 +608,7 @@ export default defineComponent({ }, }, watch: { - intRotationValue(value) { + intRotationValue(value: number) { if (!this.intCropper) { return; } @@ -633,9 +633,15 @@ export default defineComponent({ } else { this.intHasImage = true; } - // * Using browse event, If user changed imagem recompile blob (File Upload storage strategy) - if (this.inTbrowseEvent && this.inThasImage) { - this.fetchPictureFromPath(value); + // * Using browse event, If user changed image recompile blob (File Upload storage strategy) + if (this.browseEvent && this.intHasImage) { + this.$nextTick(() => this.fetchPictureFromPath(value)); + } else { + this.intValue = value; + if (this.intValue.length) { + this.intValueFileName = this.intValue.replace(/^\/|^/, ""); + this.intValue = this.intValue.replace(/^\/|^/, "/"); + } } }, }, diff --git a/resources/ts/bo/utilities/vue-bo.ts b/resources/ts/bo/utilities/vue-bo.ts index d46a0f4..0ab2995 100644 --- a/resources/ts/bo/utilities/vue-bo.ts +++ b/resources/ts/bo/utilities/vue-bo.ts @@ -1,3 +1,4 @@ +import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; import type { App, Component } from "vue"; import { createApp } from "vue"; @@ -5,6 +6,7 @@ document.addEventListener("DOMContentLoaded", () => { const setupApp = (app: App) => { app.config.globalProperties.window = window; app.config.globalProperties.document = document; + app.component("FontAwesomeIcon", FontAwesomeIcon); }; // Register components diff --git a/resources/ts/fo/utilities/vue-fo.ts b/resources/ts/fo/utilities/vue-fo.ts index d46a0f4..0ab2995 100644 --- a/resources/ts/fo/utilities/vue-fo.ts +++ b/resources/ts/fo/utilities/vue-fo.ts @@ -1,3 +1,4 @@ +import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; import type { App, Component } from "vue"; import { createApp } from "vue"; @@ -5,6 +6,7 @@ document.addEventListener("DOMContentLoaded", () => { const setupApp = (app: App) => { app.config.globalProperties.window = window; app.config.globalProperties.document = document; + app.component("FontAwesomeIcon", FontAwesomeIcon); }; // Register components diff --git a/resources/ts/index.d.ts b/resources/ts/index.d.ts index 4c614ed..ba9101e 100644 --- a/resources/ts/index.d.ts +++ b/resources/ts/index.d.ts @@ -1,6 +1,6 @@ -export {}; -import { AxiosStatic } from "axios"; +export { }; import type VueTagsInput from "@sipec/vue3-tags-input"; +import { AxiosStatic } from "axios"; // * Enum interface EnumInterface { @@ -75,7 +75,7 @@ declare global { Swal: Function; vueDebug: boolean | undefined; __SYSTEM: { - _asset: string; + _asset: Record; _locale: string; _routes: Record; _translations: { diff --git a/resources/ts/modules/asset.ts b/resources/ts/modules/asset.ts index f4e7ea8..7db4d6e 100644 --- a/resources/ts/modules/asset.ts +++ b/resources/ts/modules/asset.ts @@ -1,7 +1,7 @@ export default { methods: { asset(path: string) { - return `${window.__SYSTEM._asset}${path}`; + return `${window.__SYSTEM._asset[path] ?? path}`; }, }, }; diff --git a/resources/ts/modules/toast.ts b/resources/ts/modules/toast.ts index d71b6ea..7a134aa 100644 --- a/resources/ts/modules/toast.ts +++ b/resources/ts/modules/toast.ts @@ -1,5 +1,5 @@ import type { Options } from "toastify-js"; -import * as Toastify from "toastify-js"; +import StartToastifyInstance from "toastify-js"; export default { methods: { @@ -22,7 +22,7 @@ export default { stopOnFocus: true, }; options.text = message; - Toastify.default(options).showToast(); + StartToastifyInstance(options).showToast(); }, notify(message: string, duration = 4000): void { this.toast(message, duration, "notifications"); diff --git a/resources/views/bo/layouts/footer.blade.php b/resources/views/bo/layouts/footer.blade.php index 629931c..c32877c 100644 --- a/resources/views/bo/layouts/footer.blade.php +++ b/resources/views/bo/layouts/footer.blade.php @@ -1,10 +1,10 @@ -
+
@if (isset($cpsr_name) && isset($cpsr_version)) - {{ $cpsr_name }} - {{ $cpsr_version }} - - + {{ $cpsr_name }} - {{ $cpsr_version }} + - @endif {{ __('UWIL') }} © {{ date('Y') }}
-
\ No newline at end of file +
diff --git a/resources/views/bo/layouts/head.blade.php b/resources/views/bo/layouts/head.blade.php index 192e576..c9eb556 100644 --- a/resources/views/bo/layouts/head.blade.php +++ b/resources/views/bo/layouts/head.blade.php @@ -1,6 +1,5 @@ {{-- Meta --}} - {{-- blade-formatter-disable --}} @hasSection('metaIndex') @@ -14,12 +13,12 @@ {{-- Favicon --}} {{-- GENERER favicon avec un outil https://realfavicongenerator.net/ --}} - - - - - - + + + + + + {{-- Others --}} diff --git a/resources/views/bo/layouts/header.blade.php b/resources/views/bo/layouts/header.blade.php index d6d0f89..a56df95 100644 --- a/resources/views/bo/layouts/header.blade.php +++ b/resources/views/bo/layouts/header.blade.php @@ -1,4 +1,4 @@ -